using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Timers; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using StatusEffectManager; using TMPro; using UnityEngine; using UnityEngine.UI; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("GlitnirFomeEGloria")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("XutzBR")] [assembly: AssemblyProduct("GlitnirFomeEGloria")] [assembly: AssemblyCopyright("Copyright © 2022")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("E0E2F92E-557C-4A05-9D89-AA92A0BD75C4")] [assembly: AssemblyFileVersion("1.0.4")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.4.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.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] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] 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 GlitnirFomeEGloria { [BepInPlugin("XutzBR.GlitnirFomeEGloria", "GlitnirFomeEGloria", "1.0.4")] public class GlitnirFomeEGloriaPlugin : BaseUnityPlugin { public class ConversionData { public string ToItem { get; set; } public float CookTime { get; set; } public int ProducedItems { get; set; } public ConversionData(string toItem, float cookTime = 0f, int producedItems = 0) { ToItem = toItem; CookTime = cookTime; ProducedItems = producedItems; } } public enum Toggle { On = 1, Off = 0 } [HarmonyPatch(typeof(ZNetScene), "Awake")] private static class ConversionsZNetScene_AwakePost_Patch { private static bool hasRun; private static List vanillaCookingStationConversions; private static List vanillaCookingStationIronConversions; private static List vanillaOvenConversions; private static List vanillaFermenterConversions; private static void Postfix(ZNetScene __instance) { if (!hasRun) { hasRun = true; ReapplyConversions(__instance, updateWorldInstances: false); } } public static void ReapplyConversions(ZNetScene scene, bool updateWorldInstances = true) { if ((Object)(object)scene == (Object)null) { return; } List prefabs = scene.m_prefabs; if (prefabs == null || prefabs.Count <= 0) { return; } try { GameObject prefab = scene.GetPrefab("piece_cookingstation"); CookingStation val = ((prefab != null) ? prefab.GetComponent() : null); GameObject prefab2 = scene.GetPrefab("piece_cookingstation_iron"); CookingStation val2 = ((prefab2 != null) ? prefab2.GetComponent() : null); GameObject prefab3 = scene.GetPrefab("piece_oven"); CookingStation val3 = ((prefab3 != null) ? prefab3.GetComponent() : null); GameObject prefab4 = scene.GetPrefab("fermenter"); Fermenter val4 = ((prefab4 != null) ? prefab4.GetComponent() : null); if (vanillaCookingStationConversions == null && (Object)(object)val != (Object)null && val.m_conversion != null) { vanillaCookingStationConversions = new List(val.m_conversion); } if (vanillaCookingStationIronConversions == null && (Object)(object)val2 != (Object)null && val2.m_conversion != null) { vanillaCookingStationIronConversions = new List(val2.m_conversion); } if (vanillaOvenConversions == null && (Object)(object)val3 != (Object)null && val3.m_conversion != null) { vanillaOvenConversions = new List(val3.m_conversion); } if (vanillaFermenterConversions == null && (Object)(object)val4 != (Object)null && val4.m_conversion != null) { vanillaFermenterConversions = new List(val4.m_conversion); } GameObject prefab5 = scene.GetPrefab("GFG_DefumadorMadeira"); CookingStation val5 = ((prefab5 != null) ? prefab5.GetComponent() : null); GameObject prefab6 = scene.GetPrefab("GFG_DefumadorPedra"); CookingStation val6 = ((prefab6 != null) ? prefab6.GetComponent() : null); GameObject prefab7 = scene.GetPrefab("GFG_FermentadorDvergr"); Fermenter val7 = ((prefab7 != null) ? prefab7.GetComponent() : null); ClearAllConversions(val, val2, val3, val4, val5, val6, val7); if ((Object)(object)val != (Object)null) { RestoreVanillaConversions(val, vanillaCookingStationConversions); ApplyCookingStationConversions(scene, val, CookingStationConversions.Value, "Cooking Station"); } if ((Object)(object)val2 != (Object)null) { RestoreVanillaConversions(val2, vanillaCookingStationIronConversions); ApplyCookingStationConversions(scene, val2, CookingStationIronConversions.Value, "Iron Cooking Station"); } if ((Object)(object)val3 != (Object)null) { RestoreVanillaConversions(val3, vanillaOvenConversions); ApplyCookingStationConversions(scene, val3, OvenConversions.Value, "Oven"); } if ((Object)(object)val4 != (Object)null) { RestoreVanillaConversions(val4, vanillaFermenterConversions); ApplyFermenterConversions(scene, val4, FermenterConversions.Value, "Fermenter"); } if ((Object)(object)val5 != (Object)null) { ApplyCookingStationConversions(scene, val5, SmokehouseWoodConversions.Value, "Wooden Smokehouse"); } if ((Object)(object)val6 != (Object)null) { ApplyCookingStationConversions(scene, val6, SmokehouseStoneConversions.Value, "Stone Smokehouse"); } if ((Object)(object)val7 != (Object)null) { ApplyFermenterConversions(scene, val7, LegendFermenterConversions.Value, "Great Fermenter"); } if (updateWorldInstances) { UpdateAllWorldInstances(scene, val, val2, val3, val4, val5, val6, val7); } GlitnirFomeEGloriaLogger.LogInfo((object)(updateWorldInstances ? "[Conversions] All conversions applied from config (prefabs and world instances updated)" : "[Conversions] All conversions applied from config (prefabs only, world instances will update on config reload)")); } catch (Exception arg) { GlitnirFomeEGloriaLogger.LogError((object)$"Error applying conversions: {arg}"); } } private static void RestoreVanillaConversions(CookingStation station, List vanillaConversions) { //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) //IL_0041: 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_005e: Expected O, but got Unknown if ((Object)(object)station == (Object)null || vanillaConversions == null) { return; } foreach (ItemConversion vanillaConversion in vanillaConversions) { station.m_conversion.Add(new ItemConversion { m_from = vanillaConversion.m_from, m_to = vanillaConversion.m_to, m_cookTime = vanillaConversion.m_cookTime }); } } private static void RestoreVanillaConversions(Fermenter fermenter, List vanillaConversions) { //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) //IL_0041: 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_005e: Expected O, but got Unknown if ((Object)(object)fermenter == (Object)null || vanillaConversions == null) { return; } foreach (ItemConversion vanillaConversion in vanillaConversions) { fermenter.m_conversion.Add(new ItemConversion { m_from = vanillaConversion.m_from, m_to = vanillaConversion.m_to, m_producedItems = vanillaConversion.m_producedItems }); } } private static void UpdateAllWorldInstances(ZNetScene scene, CookingStation cookingStationPrefab, CookingStation cookingStationIronPrefab, CookingStation cookingStationOvenPrefab, Fermenter fermenterPrefab, CookingStation smokehouseWoodPrefab, CookingStation smokehouseStonePrefab, Fermenter legendFermenterPrefab) { if ((Object)(object)Player.m_localPlayer == (Object)null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[Conversions] Skipping world instance update - player not yet loaded"); return; } int num = 0; CookingStation[] array = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (CookingStation val in array) { if (!((Object)(object)val == (Object)null)) { string prefabName = Utils.GetPrefabName(((Component)val).gameObject); if (prefabName == "piece_cookingstation" && (Object)(object)cookingStationPrefab != (Object)null) { val.m_conversion = new List(cookingStationPrefab.m_conversion); num++; } else if (prefabName == "piece_cookingstation_iron" && (Object)(object)cookingStationIronPrefab != (Object)null) { val.m_conversion = new List(cookingStationIronPrefab.m_conversion); num++; } else if (prefabName == "piece_oven" && (Object)(object)cookingStationOvenPrefab != (Object)null) { val.m_conversion = new List(cookingStationOvenPrefab.m_conversion); num++; } else if (prefabName == "GFG_DefumadorMadeira" && (Object)(object)smokehouseWoodPrefab != (Object)null) { val.m_conversion = new List(smokehouseWoodPrefab.m_conversion); num++; } else if (prefabName == "GFG_DefumadorPedra" && (Object)(object)smokehouseStonePrefab != (Object)null) { val.m_conversion = new List(smokehouseStonePrefab.m_conversion); num++; } } } Fermenter[] array2 = Object.FindObjectsByType((FindObjectsSortMode)0); foreach (Fermenter val2 in array2) { if (!((Object)(object)val2 == (Object)null)) { string prefabName2 = Utils.GetPrefabName(((Component)val2).gameObject); if (prefabName2 == "fermenter" && (Object)(object)fermenterPrefab != (Object)null) { val2.m_conversion = new List(fermenterPrefab.m_conversion); num++; } else if (prefabName2 == "GFG_FermentadorDvergr" && (Object)(object)legendFermenterPrefab != (Object)null) { val2.m_conversion = new List(legendFermenterPrefab.m_conversion); num++; } } } if (num > 0) { GlitnirFomeEGloriaLogger.LogInfo((object)$"[Conversions] Updated {num} existing station instances in the world"); } } private static void ClearAllConversions(params object[] stations) { foreach (object obj in stations) { if (obj != null) { CookingStation val = (CookingStation)((obj is CookingStation) ? obj : null); if (val != null) { val.m_conversion.Clear(); } else { ((Fermenter)(((obj is Fermenter) ? obj : null)?)).m_conversion.Clear(); } } } } private static void ApplyCookingStationConversions(ZNetScene scene, CookingStation station, string configValue, string stationName) { //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Expected O, but got Unknown if (string.IsNullOrWhiteSpace(configValue)) { return; } string[] array = configValue.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries); int num = 0; string[] array2 = array; foreach (string text in array2) { string[] array3 = text.Split(new char[1] { ':' }); if (array3.Length != 3) { GlitnirFomeEGloriaLogger.LogWarning((object)("[Conversions] Invalid format for " + stationName + ": " + text)); continue; } string text2 = array3[0].Trim(); string text3 = array3[1].Trim(); if (!float.TryParse(array3[2].Trim(), out var result)) { GlitnirFomeEGloriaLogger.LogWarning((object)("[Conversions] Invalid cook time for " + stationName + ": " + array3[2])); continue; } GameObject prefab = scene.GetPrefab(text2); GameObject prefab2 = scene.GetPrefab(text3); if (!((Object)(object)prefab == (Object)null) && !((Object)(object)prefab2 == (Object)null)) { ItemDrop component = prefab.GetComponent(); ItemDrop component2 = prefab2.GetComponent(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component2 == (Object)null)) { station.m_conversion.Add(new ItemConversion { m_cookTime = result, m_from = component, m_to = component2 }); num++; } } } if (num > 0) { GlitnirFomeEGloriaLogger.LogInfo((object)$"[Conversions] Added {num} conversions to {stationName}"); } } private static void ApplyFermenterConversions(ZNetScene scene, Fermenter fermenter, string configValue, string fermenterName) { //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Expected O, but got Unknown if (string.IsNullOrWhiteSpace(configValue)) { return; } string[] array = configValue.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries); int num = 0; string[] array2 = array; foreach (string text in array2) { string[] array3 = text.Split(new char[1] { ':' }); if (array3.Length != 3) { GlitnirFomeEGloriaLogger.LogWarning((object)("[Conversions] Invalid format for " + fermenterName + ": " + text)); continue; } string text2 = array3[0].Trim(); string text3 = array3[1].Trim(); if (!int.TryParse(array3[2].Trim(), out var result)) { GlitnirFomeEGloriaLogger.LogWarning((object)("[Conversions] Invalid produced items for " + fermenterName + ": " + array3[2])); continue; } GameObject prefab = scene.GetPrefab(text2); GameObject prefab2 = scene.GetPrefab(text3); if (!((Object)(object)prefab == (Object)null) && !((Object)(object)prefab2 == (Object)null)) { ItemDrop component = prefab.GetComponent(); ItemDrop component2 = prefab2.GetComponent(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component2 == (Object)null)) { fermenter.m_conversion.Add(new ItemConversion { m_from = component, m_to = component2, m_producedItems = result }); num++; } } } if (num > 0) { GlitnirFomeEGloriaLogger.LogInfo((object)$"[Conversions] Added {num} conversions to {fermenterName}"); } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class BirdMeatDropsPatch { private static bool hasRun = false; private static readonly string[] BirdPrefabs = new string[3] { "Crow", "Seagal", "AshCrow" }; [HarmonyPostfix] [HarmonyPriority(0)] public static void Postfix(ZNetScene __instance) { if (!hasRun) { hasRun = true; string[] birdPrefabs = BirdPrefabs; foreach (string creatureName in birdPrefabs) { AddBirdMeatDrop(__instance, creatureName); } } } private static void AddBirdMeatDrop(ZNetScene zNetScene, string creatureName) { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) GameObject prefab = zNetScene.GetPrefab(creatureName); if ((Object)(object)prefab == (Object)null) { GlitnirFomeEGloriaLogger.LogWarning((object)("[BirdMeatDrops] " + creatureName + " prefab not found.")); return; } DropOnDestroyed component = prefab.GetComponent(); if ((Object)(object)component == (Object)null) { GlitnirFomeEGloriaLogger.LogWarning((object)("[BirdMeatDrops] " + creatureName + " has no DropOnDestroyed component.")); return; } ObjectDB instance = ObjectDB.instance; GameObject val = ((instance != null) ? instance.GetItemPrefab("GFG_CarnePassaro") : null); if ((Object)(object)val == (Object)null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[BirdMeatDrops] GFG_CarnePassaro prefab not found in ObjectDB."); return; } DropTable dropWhenDestroyed = component.m_dropWhenDestroyed; dropWhenDestroyed.m_drops.RemoveAll((DropData drop) => (Object)(object)drop.m_item != (Object)null && ((Object)drop.m_item).name == "GFG_CarnePassaro"); for (int i = 0; i < dropWhenDestroyed.m_drops.Count; i++) { DropData val2 = dropWhenDestroyed.m_drops[i]; if ((Object)(object)val2.m_item != (Object)null && ((Object)val2.m_item).name == "Feathers") { val2.m_weight = 10000f; dropWhenDestroyed.m_drops[i] = val2; break; } } dropWhenDestroyed.m_drops.Add(new DropData { m_item = val, m_stackMin = 1, m_stackMax = 1, m_weight = 3f, m_dontScale = false }); dropWhenDestroyed.m_drops.Add(new DropData { m_item = val, m_stackMin = 2, m_stackMax = 2, m_weight = 1f, m_dontScale = false }); dropWhenDestroyed.m_dropMin = 2; dropWhenDestroyed.m_dropMax = 2; dropWhenDestroyed.m_dropChance = 1f; dropWhenDestroyed.m_oneOfEach = true; GlitnirFomeEGloriaLogger.LogInfo((object)("[BirdMeatDrops] Successfully configured " + creatureName + " to drop Feathers + GFG_CarnePassaro (75% → 1 meat, 25% → 2 meats)")); } } [HarmonyPatch(typeof(CookingStation))] public static class CookingStationPatches { private static HashSet noOvercookList = new HashSet(); private static HashSet multiFuelList = new HashSet(); private static HashSet passiveCookingList = new HashSet(); private static Dictionary> prefabFuelMap = new Dictionary>(); private const string ZDO_FUEL_TYPE = "VC_CurrentFuelType"; public static void Initialize() { SmokehouseNoOvercookPrefabs.SettingChanged += delegate { RefreshNoOvercookList(); }; SmokehouseMultiFuelPrefabs.SettingChanged += delegate { RefreshMultiFuelList(); }; SmokehouseAllowedFuels.SettingChanged += delegate { RefreshFuelMaps(); }; PassiveCookingPrefabs.SettingChanged += delegate { RefreshPassiveCookingList(); }; RefreshNoOvercookList(); RefreshMultiFuelList(); RefreshFuelMaps(); RefreshPassiveCookingList(); } private static void RefreshNoOvercookList() { noOvercookList.Clear(); string[] array = SmokehouseNoOvercookPrefabs.Value.Split(new char[1] { ',' }); string[] array2 = array; foreach (string text in array2) { string text2 = text.Trim(); if (!string.IsNullOrEmpty(text2)) { noOvercookList.Add(text2); } } } private static void RefreshMultiFuelList() { multiFuelList.Clear(); string[] array = SmokehouseMultiFuelPrefabs.Value.Split(new char[1] { ',' }); string[] array2 = array; foreach (string text in array2) { string text2 = text.Trim(); if (!string.IsNullOrEmpty(text2)) { multiFuelList.Add(text2); } } } private static void RefreshFuelMaps() { prefabFuelMap.Clear(); List value = (from f in SmokehouseAllowedFuels.Value.Split(new char[1] { ',' }) select f.Trim() into f where !string.IsNullOrEmpty(f) select f).ToList(); foreach (string multiFuel in multiFuelList) { prefabFuelMap[multiFuel] = value; } } private static void RefreshPassiveCookingList() { passiveCookingList.Clear(); string[] array = PassiveCookingPrefabs.Value.Split(new char[1] { ',' }); string[] array2 = array; foreach (string text in array2) { string text2 = text.Trim(); if (!string.IsNullOrEmpty(text2)) { passiveCookingList.Add(text2); } } } private static bool IsNoOvercookStation(CookingStation station) { if ((Object)(object)station == (Object)null) { return false; } string prefabName = Utils.GetPrefabName(((Component)station).gameObject); return noOvercookList.Contains(prefabName); } private static bool IsMultiFuelStation(CookingStation station) { if ((Object)(object)station == (Object)null) { return false; } string prefabName = Utils.GetPrefabName(((Component)station).gameObject); return multiFuelList.Contains(prefabName); } private static bool IsPassiveCookingStation(CookingStation station) { if ((Object)(object)station == (Object)null) { return false; } string prefabName = Utils.GetPrefabName(((Component)station).gameObject); return passiveCookingList.Contains(prefabName); } private static bool IsModStation(CookingStation station) { return IsNoOvercookStation(station) || IsMultiFuelStation(station) || IsPassiveCookingStation(station); } private static List GetAllowedFuels(CookingStation station) { if ((Object)(object)station == (Object)null) { return null; } string prefabName = Utils.GetPrefabName(((Component)station).gameObject); return prefabFuelMap.ContainsKey(prefabName) ? prefabFuelMap[prefabName] : null; } private static bool IsStationFullyInitialized(CookingStation station) { if ((Object)(object)station == (Object)null) { return false; } if ((Object)(object)station.m_nview == (Object)null) { return false; } if (!station.m_nview.IsValid()) { return false; } if (station.m_slots == null) { return false; } if (station.m_conversion == null) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("UpdateCooking")] [HarmonyPriority(800)] public static bool UpdateCooking_Complete_Prefix(CookingStation __instance) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Invalid comparison between Unknown and I4 //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) if (!IsModStation(__instance)) { return true; } if (!IsStationFullyInitialized(__instance)) { return false; } bool flag = IsPassiveCookingStation(__instance); bool flag2 = (__instance.m_requireFire && __instance.IsFireLit()) || (__instance.m_useFuel && __instance.GetFuel() > 0f); if (__instance.m_nview.IsOwner()) { float deltaTime = __instance.GetDeltaTime(); if (flag2 || flag) { __instance.UpdateFuel(deltaTime); string text = default(string); float num = default(float); Status val = default(Status); for (int i = 0; i < __instance.m_slots.Length; i++) { __instance.GetSlot(i, ref text, ref num, ref val); if (string.IsNullOrEmpty(text) || (int)val == 2) { continue; } ItemConversion itemConversion = __instance.GetItemConversion(text); if (itemConversion == null) { __instance.SetSlot(i, "", 0f, (Status)0); } else { if ((Object)(object)itemConversion.m_from == (Object)null || (Object)(object)itemConversion.m_to == (Object)null) { continue; } num += deltaTime; if (IsNoOvercookStation(__instance)) { if (num > itemConversion.m_cookTime && text == ((Object)itemConversion.m_from).name) { __instance.m_doneEffect.Create(__instance.m_slots[i].position, Quaternion.identity, (Transform)null, 1f, -1); __instance.SetSlot(i, ((Object)itemConversion.m_to).name, itemConversion.m_cookTime, (Status)1); } else { __instance.SetSlot(i, text, num, (Status)0); } } else if (num > itemConversion.m_cookTime * 2f) { if (__instance.m_overcookedEffect != null && (Object)(object)__instance.m_overCookedItem != (Object)null) { __instance.m_overcookedEffect.Create(__instance.m_slots[i].position, Quaternion.identity, (Transform)null, 1f, -1); __instance.SetSlot(i, ((Object)__instance.m_overCookedItem).name, num, (Status)2); } } else if (num > itemConversion.m_cookTime && text == ((Object)itemConversion.m_from).name) { __instance.m_doneEffect.Create(__instance.m_slots[i].position, Quaternion.identity, (Transform)null, 1f, -1); __instance.SetSlot(i, ((Object)itemConversion.m_to).name, num, (Status)1); } else { __instance.SetSlot(i, text, num, (Status)0); } } } } } __instance.UpdateVisual(flag2); return false; } [HarmonyPrefix] [HarmonyPatch("IsItemDone")] public static bool IsItemDone_Prefix(CookingStation __instance, string itemName, ref bool __result) { if ((Object)(object)__instance == (Object)null || string.IsNullOrEmpty(itemName)) { __result = false; return false; } if (__instance.m_conversion == null) { __result = false; return false; } if ((Object)(object)__instance.m_overCookedItem == (Object)null && IsNoOvercookStation(__instance)) { ItemConversion itemConversion = __instance.GetItemConversion(itemName); if (itemConversion == null) { __result = false; return false; } if ((Object)(object)itemConversion.m_to == (Object)null) { __result = false; return false; } if (itemName == ((Object)itemConversion.m_to).name) { __result = true; return false; } __result = false; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OnAddFuelSwitch")] public static bool OnAddFuelSwitch_Prefix(CookingStation __instance, Switch sw, Humanoid user, ItemData item, ref bool __result) { if (!IsMultiFuelStation(__instance)) { return true; } List allowedFuels = GetAllowedFuels(__instance); if (allowedFuels == null || allowedFuels.Count == 0) { return true; } if (__instance.GetFuel() > (float)(__instance.m_maxFuel - 1)) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); __result = false; return false; } if (item == null) { foreach (ItemData allItem in user.GetInventory().GetAllItems()) { if ((Object)(object)allItem.m_dropPrefab != (Object)null) { string name = ((Object)allItem.m_dropPrefab).name; if (allowedFuels.Contains(name)) { item = allItem; break; } } } if (item == null) { ((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null); __result = false; return false; } } string text = (((Object)(object)item.m_dropPrefab != (Object)null) ? ((Object)item.m_dropPrefab).name : ""); if (!allowedFuels.Contains(text)) { ((Character)user).Message((MessageType)2, "$msg_wrongitem", 0, (Sprite)null); __result = false; return false; } if (!user.GetInventory().HaveItem(item.m_shared.m_name, true)) { ((Character)user).Message((MessageType)2, "$msg_donthaveany " + item.m_shared.m_name, 0, (Sprite)null); __result = false; return false; } ((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name, 0, (Sprite)null); user.GetInventory().RemoveItem(item.m_shared.m_name, 1, -1, true); if ((Object)(object)__instance.m_nview != (Object)null && __instance.m_nview.IsValid()) { __instance.m_nview.GetZDO().Set("VC_CurrentFuelType", text); } __instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty()); __result = true; return false; } [HarmonyPostfix] [HarmonyPatch("OnHoverFuelSwitch")] public static void OnHoverFuelSwitch_Postfix(CookingStation __instance, ref string __result) { if (!IsMultiFuelStation(__instance)) { return; } List allowedFuels = GetAllowedFuels(__instance); if (allowedFuels == null || allowedFuels.Count == 0) { return; } float fuel = __instance.GetFuel(); List list = new List(); foreach (string item in allowedFuels) { ObjectDB instance = ObjectDB.instance; GameObject val = ((instance != null) ? instance.GetItemPrefab(item) : null); if ((Object)(object)val != (Object)null) { ItemDrop component = val.GetComponent(); if ((Object)(object)component != (Object)null) { list.Add(Localization.instance.Localize(component.m_itemData.m_shared.m_name)); } } } string text = string.Join(", ", list); __result = Localization.instance.Localize($"{__instance.m_name} ($piece_fire_fuel {Mathf.Ceil(fuel)}/{__instance.m_maxFuel})\n" + "[$KEY_Use] $piece_smelter_add " + text); } [HarmonyPostfix] [HarmonyPatch("TryGetItems")] public static void TryGetItems_Postfix(CookingStation __instance, Switch switchRef, ref List items, ref bool __result) { if (__result && IsMultiFuelStation(__instance) && (Object)(object)switchRef == (Object)(object)__instance.m_addFuelSwitch) { List allowedFuels = GetAllowedFuels(__instance); if (allowedFuels != null && allowedFuels.Count > 0) { items.Clear(); items.AddRange(allowedFuels); } } } [HarmonyPrefix] [HarmonyPatch(typeof(WearNTear), "Destroy")] public static void WearNTear_Destroy_Prefix(WearNTear __instance) { if ((Object)(object)__instance == (Object)null) { return; } CookingStation component = ((Component)__instance).GetComponent(); if ((Object)(object)component == (Object)null || !IsMultiFuelStation(component)) { return; } float fuel = component.GetFuel(); if (fuel <= 0f || (Object)(object)component.m_nview == (Object)null || !component.m_nview.IsValid()) { return; } string @string = component.m_nview.GetZDO().GetString("VC_CurrentFuelType", ""); if (string.IsNullOrEmpty(@string)) { return; } ObjectDB instance = ObjectDB.instance; GameObject val = ((instance != null) ? instance.GetItemPrefab(@string) : null); if (!((Object)(object)val == (Object)null)) { ItemDrop component2 = val.GetComponent(); if ((Object)(object)component2 != (Object)null) { component.m_fuelItem = component2; } } } } [HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")] public static class GreydwarfMushroomDrops_Patch { [HarmonyPostfix] private static void Postfix(CharacterDrop __instance, ref List> __result) { if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.m_character == (Object)null || EnvMan.IsDay()) { return; } string prefabName = Utils.GetPrefabName(((Component)__instance.m_character).gameObject); float num = 0f; int num2 = 0; int num3 = 0; switch (prefabName) { default: return; case "Greydwarf": num = greydwarfDropChance.Value; num2 = greydwarfDropMin.Value; num3 = greydwarfDropMax.Value; break; case "Greydwarf_Elite": num = greydwarfEliteDropChance.Value; num2 = greydwarfEliteDropMin.Value; num3 = greydwarfEliteDropMax.Value; break; case "Greydwarf_Shaman": num = greydwarfShamanDropChance.Value; num2 = greydwarfShamanDropMin.Value; num3 = greydwarfShamanDropMax.Value; break; } if (!(Random.Range(0f, 100f) > num)) { GameObject prefab = ZNetScene.instance.GetPrefab("GFG_ChapeuNott"); if ((Object)(object)prefab == (Object)null) { GlitnirFomeEGloriaLogger.LogWarning((object)"GFG_ChapeuNott prefab not found in ZNetScene"); return; } int num4 = Random.Range(num2, Math.Max(num2, num3) + 1); __result.Add(new KeyValuePair(prefab, num4)); GlitnirFomeEGloriaLogger.LogDebug((object)$"{prefabName} dropping {num4} blue mushroom(s) at night"); } } } [HarmonyPatch(typeof(Attack), "GetAttackEitr")] public static class StaffEitrReduction_Patch { [HarmonyPostfix] private static void Postfix(Attack __instance, ref float __result) { if ((Object)(object)__instance.m_character == (Object)null || !((Character)__instance.m_character).IsPlayer()) { return; } ItemData weapon = __instance.m_weapon; if (weapon == null || !IsStaff(weapon)) { return; } Humanoid character = __instance.m_character; Player val = (Player)(object)((character is Player) ? character : null); if (!((Object)(object)val == (Object)null)) { float num = 0f; string text = ""; if (((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Freyja"))) { num = FreyjaStaffEitrReduction.Value / 100f; text = "Freyja's Draught"; } if (num > 0f) { float num2 = __result; __result *= 1f - num; GlitnirFomeEGloriaLogger.LogDebug((object)$"{text} active: Reducing staff eitr cost by {num * 100f}% (from {num2} to {__result})"); } } } private static bool IsStaff(ItemData weapon) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 return (int)weapon.m_shared.m_skillType == 10 || (int)weapon.m_shared.m_skillType == 9; } } [HarmonyPatch(typeof(Character), "ApplyDamage")] public static class VidarrDraughtBossDamage_Patch { [HarmonyPrefix] private static void ApplyDamage_Prefix(Character __instance, ref HitData hit) { Character attacker = hit.GetAttacker(); Player val = (Player)(object)((attacker is Player) ? attacker : null); if (val != null && !((Object)(object)__instance == (Object)null) && __instance.IsBoss() && ((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Vidarr"))) { float value = VidarrBossDamageMultiplier.Value; ((DamageTypes)(ref hit.m_damage)).Modify(value); GlitnirFomeEGloriaLogger.LogDebug((object)$"Víðarr Draught active: Applying {value}x damage to boss {__instance.m_name}"); } } } public static class SkadiDraughtTracker { public static Player LastKillingPlayer; } [HarmonyPatch(typeof(Character), "OnDeath")] public static class Character_OnDeath_TrackKiller { [HarmonyPrefix] private static void Prefix(Character __instance) { SkadiDraughtTracker.LastKillingPlayer = null; if (__instance.m_lastHit != null) { Character attacker = __instance.m_lastHit.GetAttacker(); if ((Object)(object)attacker != (Object)null && attacker.IsPlayer()) { SkadiDraughtTracker.LastKillingPlayer = (Player)(object)((attacker is Player) ? attacker : null); } } } } [HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")] public static class CharacterDrop_GenerateDropList_SkadiBonus { [HarmonyPostfix] private static void Postfix(CharacterDrop __instance, ref List> __result) { Player lastKillingPlayer = SkadiDraughtTracker.LastKillingPlayer; if ((Object)(object)lastKillingPlayer == (Object)null) { return; } StatusEffect statusEffect = ((Character)lastKillingPlayer).GetSEMan().GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Skadi")); if ((Object)(object)statusEffect == (Object)null) { return; } float num = TrophyDropBonusPercent.Value / 100f; int value = MeatDropBonus.Value; List> list = new List>(); foreach (KeyValuePair item in __result) { if ((Object)(object)item.Key == (Object)null) { list.Add(item); continue; } ItemDrop component = item.Key.GetComponent(); if (component?.m_itemData?.m_shared == null) { list.Add(item); continue; } string text = component.m_itemData.m_shared.m_name.ToLower(); if (text.Contains("meat") && value > 0) { int num2 = item.Value + value; list.Add(new KeyValuePair(item.Key, num2)); GlitnirFomeEGloriaLogger.LogDebug((object)("[Skaði's Draught] Meat " + component.m_itemData.m_shared.m_name + ": " + $"{item.Value} -> {num2}")); } else { list.Add(item); } } if (num > 0f && __instance.m_drops != null) { int num3 = ((!((Object)(object)__instance.m_character != (Object)null)) ? 1 : Mathf.Max(1, (int)Mathf.Pow(2f, (float)(__instance.m_character.GetLevel() - 1)))); foreach (Drop drop in __instance.m_drops) { if ((Object)(object)drop.m_prefab == (Object)null) { continue; } ItemDrop component2 = drop.m_prefab.GetComponent(); if (component2?.m_itemData?.m_shared == null) { continue; } string text2 = component2.m_itemData.m_shared.m_name.ToLower(); if (text2.Contains("trophy") && !list.Any((KeyValuePair d) => (Object)(object)d.Key == (Object)(object)drop.m_prefab) && Random.value <= num) { int num4 = (drop.m_dontScale ? Random.Range(drop.m_amountMin, drop.m_amountMax + 1) : Game.instance.ScaleDrops(drop.m_prefab, drop.m_amountMin, drop.m_amountMax)); if (drop.m_levelMultiplier) { num4 *= num3; } if (num4 > 0) { list.Add(new KeyValuePair(drop.m_prefab, num4)); GlitnirFomeEGloriaLogger.LogDebug((object)("[Skaði's Draught] Trophy bonus roll succeeded for " + component2.m_itemData.m_shared.m_name + ": " + $"added {num4}x (bonus chance: {num * 100f:F1}%)")); } } } } __result = list; } } [HarmonyPatch(typeof(Pickable), "RPC_Pick")] public static class Pickable_RPC_Pick_FreyrPatch { private class PickableState { public int originalAmount; public int bonusAmount; public string messageKey; public bool shouldShowBonus; } [HarmonyPrefix] private static void Prefix(Pickable __instance, long sender, ref PickableState __state) { __state = new PickableState { originalAmount = __instance.m_amount, bonusAmount = 0, messageKey = "", shouldShowBonus = false }; if (__instance.m_picked || !__instance.m_nview.IsOwner()) { return; } Player val = ((IEnumerable)Player.s_players).FirstOrDefault((Func)delegate(Player p) { ZNetView nview = ((Character)p).m_nview; int result; if (nview == null) { result = 0; } else { ZDO zDO = nview.GetZDO(); result = ((((zDO != null) ? new long?(((ZDOID)(ref zDO.m_uid)).UserID) : null) == sender) ? 1 : 0); } return (byte)result != 0; }); if ((Object)(object)val == (Object)null || !HasFreyrEffect(val) || (Object)(object)__instance.m_itemPrefab == (Object)null) { return; } ItemDrop component = __instance.m_itemPrefab.GetComponent(); if (!((Object)(object)component == (Object)null) && component.m_itemData?.m_shared != null) { string name = component.m_itemData.m_shared.m_name; if (IsPickableItem(name) && FreyrPickableBonusChance.Value > 0f && Random.value < FreyrPickableBonusChance.Value) { __state.bonusAmount = FreyrPickableBonusAmount.Value; __state.messageKey = "pickable_bonus"; __state.shouldShowBonus = true; __instance.m_amount += __state.bonusAmount; } } } [HarmonyFinalizer] private static void Finalizer(Pickable __instance, PickableState __state) { //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_0042: 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) if (__state == null) { return; } __instance.m_amount = __state.originalAmount; if (__state.shouldShowBonus) { DamageText instance = DamageText.instance; if (instance != null) { instance.ShowText((TextType)7, ((Component)__instance).transform.position + Vector3.up * 0.5f, GetFreyrText(__state.messageKey), false); } } } } [HarmonyPatch(typeof(PickableItem), "RPC_Pick")] public static class PickableItem_RPC_Pick_FreyrPatch { private class PickableItemState { public int originalStack; public int bonusAmount; public bool shouldShowBonus; } [HarmonyPrefix] private static void Prefix(PickableItem __instance, long sender, ref PickableItemState __state) { __state = new PickableItemState { originalStack = __instance.m_stack, bonusAmount = 0, shouldShowBonus = false }; if (__instance.m_picked || !__instance.m_nview.IsOwner()) { return; } Player val = ((IEnumerable)Player.s_players).FirstOrDefault((Func)delegate(Player p) { ZNetView nview = ((Character)p).m_nview; int result; if (nview == null) { result = 0; } else { ZDO zDO = nview.GetZDO(); result = ((((zDO != null) ? new long?(((ZDOID)(ref zDO.m_uid)).UserID) : null) == sender) ? 1 : 0); } return (byte)result != 0; }); if ((Object)(object)val == (Object)null || !HasFreyrEffect(val) || (Object)(object)__instance.m_itemPrefab == (Object)null) { return; } ItemDrop itemPrefab = __instance.m_itemPrefab; if (!((Object)(object)itemPrefab == (Object)null) && itemPrefab.m_itemData?.m_shared != null) { string name = itemPrefab.m_itemData.m_shared.m_name; if (IsPickableItem(name) && FreyrPickableBonusChance.Value > 0f && Random.value < FreyrPickableBonusChance.Value) { __state.bonusAmount = FreyrPickableBonusAmount.Value; __state.shouldShowBonus = true; __instance.m_stack += __state.bonusAmount; } } } [HarmonyFinalizer] private static void Finalizer(PickableItem __instance, PickableItemState __state) { //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_0042: 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) if (__state == null) { return; } __instance.m_stack = __state.originalStack; if (__state.shouldShowBonus) { DamageText instance = DamageText.instance; if (instance != null) { instance.ShowText((TextType)7, ((Component)__instance).transform.position + Vector3.up * 0.5f, GetFreyrText("pickable_bonus"), false); } } } } [HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")] public static class CharacterDrop_GenerateDropList_FreyrPatch { [HarmonyPostfix] private static void Postfix(CharacterDrop __instance, ref List> __result) { //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) CharacterDrop __instance2 = __instance; if ((Object)(object)__instance2 == (Object)null || __result == null) { return; } Player val = ((IEnumerable)Player.GetAllPlayers()).FirstOrDefault((Func)((Player p) => HasFreyrEffect(p) && Vector3.Distance(((Component)p).transform.position, ((Component)__instance2).transform.position) < 50f)); if ((Object)(object)val == (Object)null) { return; } Character component = ((Component)__instance2).GetComponent(); if ((Object)(object)component == (Object)null) { return; } string prefabName = Utils.GetPrefabName(((Component)component).gameObject); if (string.IsNullOrEmpty(prefabName) || !IsTargetCreature(prefabName) || Random.value >= FreyrCreatureCoinBonusChance.Value) { return; } bool flag = false; for (int i = 0; i < __result.Count; i++) { KeyValuePair keyValuePair = __result[i]; if (!((Object)(object)keyValuePair.Key == (Object)null)) { ItemDrop component2 = keyValuePair.Key.GetComponent(); if (component2?.m_itemData?.m_shared != null && (component2.m_itemData.m_shared.m_name == "Coins" || ((Object)keyValuePair.Key).name.Contains("Coins"))) { int value = keyValuePair.Value + FreyrCreatureCoinBonusAmount.Value; __result[i] = new KeyValuePair(keyValuePair.Key, value); flag = true; break; } } } if (!flag) { ObjectDB instance = ObjectDB.instance; GameObject val2 = ((instance != null) ? instance.GetItemPrefab("Coins") : null); if ((Object)(object)val2 != (Object)null) { __result.Add(new KeyValuePair(val2, FreyrCreatureCoinBonusAmount.Value)); } } DamageText instance2 = DamageText.instance; if (instance2 != null) { instance2.ShowText((TextType)7, ((Component)__instance2).transform.position + Vector3.up * 1.5f, GetFreyrText("coins_bonus"), false); } } } [HarmonyPatch(typeof(Container), "Interact")] public static class Container_Interact_FreyrPatch { private static readonly Dictionary> ProcessedContainers = new Dictionary>(); [HarmonyPostfix] private static void Postfix(Container __instance, Humanoid character, bool __result, bool ___m_inUse) { //IL_02d0: Unknown result type (might be due to invalid IL or missing references) //IL_02d5: Unknown result type (might be due to invalid IL or missing references) if (!__result) { return; } Player val = (Player)(object)((character is Player) ? character : null); if (val == null || !HasFreyrEffect(val) || ((Object)(object)__instance.m_piece != (Object)null && __instance.m_piece.GetCreator() != 0) || (Object)(object)__instance.m_nview == (Object)null || !__instance.m_nview.IsValid()) { return; } string key = ((object)(ZDOID)(ref __instance.m_nview.GetZDO().m_uid)).ToString(); long playerID = val.GetPlayerID(); if (!ProcessedContainers.ContainsKey(key)) { ProcessedContainers[key] = new HashSet(); } if (ProcessedContainers[key].Contains(playerID)) { return; } ProcessedContainers[key].Add(playerID); if (__instance.m_inventory == null) { return; } List list = new List(__instance.m_inventory.GetAllItems()); int num = 0; foreach (ItemData item in list) { if (item?.m_shared == null) { continue; } string name = item.m_shared.m_name; string text = StripLocalizationToken(name); if (!IsChestItem(name) || !(Random.value < FreyrChestBonusChance.Value)) { continue; } GameObject dropPrefab = item.m_dropPrefab; string text2 = ((dropPrefab != null) ? ((Object)dropPrefab).name : null); if (string.IsNullOrEmpty(text2)) { text2 = text; } ObjectDB instance = ObjectDB.instance; GameObject val2 = ((instance != null) ? instance.GetItemPrefab(text2) : null); if (!((Object)(object)val2 != (Object)null)) { continue; } ItemDrop component = val2.GetComponent(); if ((Object)(object)component != (Object)null && component.m_itemData != null) { ItemData val3 = component.m_itemData.Clone(); val3.m_stack = FreyrChestBonusAmount.Value; val3.m_durability = item.m_durability; val3.m_quality = item.m_quality; if (__instance.m_inventory.AddItem(val3)) { num += FreyrChestBonusAmount.Value; } } } if (num > 0) { ((Character)val).Message((MessageType)2, GetFreyrText("chest_bonus"), 0, (Sprite)null); __instance.m_openEffects.Create(((Component)__instance).transform.position, Quaternion.identity, (Transform)null, 1f, -1); } } } [HarmonyPatch(typeof(Ship))] public static class ShipSpeedPatches { [HarmonyPatch("GetSailForce")] [HarmonyPostfix] private static void GetSailForce_Postfix(Ship __instance, ref Vector3 __result) { //IL_0052: 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) if (__instance.m_players != null && __instance.m_players.Count > 0 && __instance.m_players.Any((Player player) => (Object)(object)player != (Object)null && ((Character)player).GetSEMan() != null && ((Character)player).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Njordr")))) { __result *= NjordrSailingSpeedMultiplier.Value; } } } [HarmonyPatch(typeof(Character), "ApplyDamage")] public static class TorrDraught_ApplyDamage_Patch { [HarmonyPrefix] private static void Prefix(Character __instance, ref HitData hit) { Character attacker = hit.GetAttacker(); Player val = (Player)(object)((attacker is Player) ? attacker : null); if (val != null && ((Humanoid)val).m_currentAttackIsSecondary && ((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Torr"))) { ((DamageTypes)(ref hit.m_damage)).Modify(1f + TorrDraughtPowerAttackBonus.Value); } } [HarmonyPostfix] private static void Postfix(Character __instance, HitData hit) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) Character attacker = hit.GetAttacker(); Player val = (Player)(object)((attacker is Player) ? attacker : null); if (val != null && ((Humanoid)val).m_currentAttackIsSecondary && ((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Torr")) && Random.value <= TorrDraughtLightningChance.Value) { Vector3 val2 = ((Component)val).transform.position + ((Component)val).transform.forward * 2f; ZNetScene instance = ZNetScene.instance; GameObject val3 = ((instance != null) ? instance.GetPrefab("GFG_lightningAOE") : null); if ((Object)(object)val3 != (Object)null) { Object.Instantiate(val3, val2, Quaternion.identity); } } } } [HarmonyPatch(typeof(Player), "SetMaxHealth", new Type[] { typeof(float), typeof(bool) })] public static class IdunnDraughtSetMaxHealth_Patch { [HarmonyPrefix] private static void Prefix(Player __instance, ref float health) { if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Idunn"))) { health += IdunnHealthBonus.Value; } } } [HarmonyPatch(typeof(Player), "SetMaxStamina")] public static class IdunnDraughtSetMaxStamina_Patch { [HarmonyPrefix] private static void Prefix(Player __instance, ref float stamina) { if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Idunn"))) { stamina += IdunnStaminaBonus.Value; } } } [HarmonyPatch(typeof(Player), "SetMaxEitr")] public static class IdunnDraughtSetMaxEitr_Patch { [HarmonyPrefix] private static void Prefix(Player __instance, ref float eitr) { if (((Character)__instance).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Idunn"))) { eitr += IdunnEitrBonus.Value; } } } [HarmonyPatch(typeof(SE_Stats), "Setup")] public static class IdunnDraughtSetup_Patch { [HarmonyPostfix] private static void Postfix(SE_Stats __instance, Character character) { if (!(((StatusEffect)__instance).m_name != "GFG_Efeito_Idunn") && character.IsPlayer()) { Player val = (Player)(object)((character is Player) ? character : null); if (!((Object)(object)val == (Object)null)) { ((Character)val).Heal(IdunnHealthBonus.Value, true); ((Character)val).AddStamina(IdunnStaminaBonus.Value); ((Character)val).AddEitr(IdunnEitrBonus.Value); val.UpdateFood(0f, true); GlitnirFomeEGloriaLogger.LogDebug((object)$"Idunn's Draught applied: +{IdunnHealthBonus.Value} HP, +{IdunnStaminaBonus.Value} Stamina, +{IdunnEitrBonus.Value} Eitr"); } } } } [HarmonyPatch(typeof(Character), "Damage")] public static class BaldrDraughtSpiritDamage_Patch { [HarmonyPrefix] private static void Damage_Prefix(Character __instance, ref HitData hit) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Invalid comparison between Unknown and I4 Character attacker = hit.GetAttacker(); Player val = (Player)(object)((attacker is Player) ? attacker : null); if (val != null && ((Character)val).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Baldr")) && ((int)__instance.GetFaction() == 3 || (int)__instance.GetFaction() == 4)) { float value = BaldrSpiritDamageBonus.Value; if (value > 0f) { hit.m_damage.m_spirit += value; GlitnirFomeEGloriaLogger.LogDebug((object)$"Baldr Draught active: Adding {value} spirit damage to {__instance.m_name}"); } } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class MedicamentoFulingEffectPatch { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { if (Object.op_Implicit((Object)(object)__instance) && __instance.m_StatusEffects != null) { StatusEffect statusEffect = __instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_MedicamentoFuling")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val == null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[MedicamentoFulingEffectPatch] GFG_Efeito_MedicamentoFuling not found in ObjectDB."); return; } ((StatusEffect)val).m_ttl = MedicamentoFulingTTL.Value; val.m_healthUpFront = MedicamentoFulingHealthUpFront.Value; } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class RoncaTuneisEffectPatch { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { if (Object.op_Implicit((Object)(object)__instance) && __instance.m_StatusEffects != null) { StatusEffect statusEffect = __instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_RoncaTuneis")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val == null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[RoncaTuneisEffectPatch] GFG_Efeito_RoncaTuneis not found in ObjectDB."); return; } ((StatusEffect)val).m_ttl = RoncaTuneisTTL.Value; val.m_healthUpFront = RoncaTuneisHealthUpFront.Value; } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class LeiteLoxEffectPatch { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { if (Object.op_Implicit((Object)(object)__instance) && __instance.m_StatusEffects != null) { StatusEffect statusEffect = __instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_LeiteLox")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val == null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[LeiteLoxEffectPatch] GFG_Efeito_LeiteLox not found in ObjectDB."); return; } ((StatusEffect)val).m_ttl = LeiteLoxTTL.Value; val.m_staminaUpFront = LeiteLoxStaminaUpFront.Value; } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class LodoardenteEffectPatch { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { if (Object.op_Implicit((Object)(object)__instance) && __instance.m_StatusEffects != null) { StatusEffect statusEffect = __instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Lodoardente")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val == null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[LodoardenteEffectPatch] GFG_Efeito_Lodoardente not found in ObjectDB."); return; } ((StatusEffect)val).m_ttl = LodoardenteTTL.Value; val.m_staminaUpFront = LodoardenteStaminaUpFront.Value; } } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class NeblinaMentesEffectPatch { [HarmonyPostfix] private static void Postfix(ObjectDB __instance) { if (Object.op_Implicit((Object)(object)__instance) && __instance.m_StatusEffects != null) { StatusEffect statusEffect = __instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_NeblinaMentes")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val == null) { GlitnirFomeEGloriaLogger.LogWarning((object)"[NeblinaMentesEffectPatch] GFG_Efeito_NeblinaMentes not found in ObjectDB."); return; } ((StatusEffect)val).m_ttl = NeblinaMentesTTL.Value; val.m_eitrUpFront = NeblinaMentesEitrUpFront.Value; } } } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order = null; [UsedImplicitly] public bool? Browsable = null; [UsedImplicitly] public string? Category = null; [UsedImplicitly] public Action? CustomDrawer = null; [UsedImplicitly] public bool? ShowRangeAsPercent = null; } private class AcceptableShortcuts : AcceptableValueBase { public AcceptableShortcuts() : base(typeof(KeyboardShortcut)) { } public override object Clamp(object value) { return value; } public override bool IsValid(object value) { return true; } public override string ToDescriptionString() { return "# Acceptable values: " + string.Join(", ", UnityInput.Current.SupportedKeyCodes); } } internal const string ModName = "GlitnirFomeEGloria"; internal const string ModVersion = "1.0.4"; internal const string Author = "XutzBR"; private const string ModGUID = "XutzBR.GlitnirFomeEGloria"; private static string ConfigFileName = "XutzBR.GlitnirFomeEGloria.cfg"; private static string ConfigFileFullPath; internal static string ConnectionError; private readonly Harmony _harmony = new Harmony("XutzBR.GlitnirFomeEGloria"); public static readonly ManualLogSource GlitnirFomeEGloriaLogger; private static readonly ConfigSync ConfigSync; private System.Timers.Timer configReloadTimer; private const double ConfigReloadDelay = 2000.0; private static bool conversionReloadPending; private FileSystemWatcher configWatcher; public static ConfigEntry SmokehouseNoOvercookPrefabs; public static ConfigEntry SmokehouseMultiFuelPrefabs; public static ConfigEntry SmokehouseAllowedFuels; public static ConfigEntry PassiveCookingPrefabs; private static ConfigEntry greydwarfDropChance; private static ConfigEntry greydwarfDropMin; private static ConfigEntry greydwarfDropMax; private static ConfigEntry greydwarfEliteDropChance; private static ConfigEntry greydwarfEliteDropMin; private static ConfigEntry greydwarfEliteDropMax; private static ConfigEntry greydwarfShamanDropChance; private static ConfigEntry greydwarfShamanDropMin; private static ConfigEntry greydwarfShamanDropMax; public static ConfigEntry VidarrBossDamageMultiplier; public static ConfigEntry TrophyDropBonusPercent; public static ConfigEntry MeatDropBonus; public static ConfigEntry FreyrPickableBonusChance; public static ConfigEntry FreyrPickableBonusAmount; public static ConfigEntry FreyrCreatureCoinBonusChance; public static ConfigEntry FreyrCreatureCoinBonusAmount; public static ConfigEntry FreyrChestBonusChance; public static ConfigEntry FreyrChestBonusAmount; public static ConfigEntry FreyrPickableItems; public static ConfigEntry FreyrChestItems; public static ConfigEntry FreyrCreatureNames; public static ConfigEntry NjordrSailingSpeedMultiplier; public static ConfigEntry TorrDraughtPowerAttackBonus; public static ConfigEntry TorrDraughtLightningChance; public static ConfigEntry FreyjaStaffEitrReduction; public static ConfigEntry IdunnHealthBonus; public static ConfigEntry IdunnStaminaBonus; public static ConfigEntry IdunnEitrBonus; public static ConfigEntry BaldrSpiritDamageBonus; public static ConfigEntry MedicamentoFulingTTL; public static ConfigEntry MedicamentoFulingHealthUpFront; public static ConfigEntry RoncaTuneisTTL; public static ConfigEntry RoncaTuneisHealthUpFront; public static ConfigEntry LeiteLoxTTL; public static ConfigEntry LeiteLoxStaminaUpFront; public static ConfigEntry LodoardenteTTL; public static ConfigEntry LodoardenteStaminaUpFront; public static ConfigEntry NeblinaMentesTTL; public static ConfigEntry NeblinaMentesEitrUpFront; private static Dictionary DefaultCookingStationConversions; private static Dictionary DefaultIronCookingStationConversions; private static Dictionary DefaultOvenConversions; private static Dictionary DefaultFermenterConversions; private static Dictionary DefaultSmokehouseWoodConversions; private static Dictionary DefaultSmokehouseStoneConversions; private static Dictionary DefaultLegendFermenterConversions; public static ConfigEntry CookingStationConversions; public static ConfigEntry CookingStationIronConversions; public static ConfigEntry OvenConversions; public static ConfigEntry FermenterConversions; public static ConfigEntry SmokehouseWoodConversions; public static ConfigEntry SmokehouseStoneConversions; public static ConfigEntry LegendFermenterConversions; public Texture2D tex = null; private static HashSet _cachedPickableItems; private static HashSet _cachedChestItems; private static HashSet _cachedCreaturePrefabs; private static ConfigEntry _serverConfigLocked; private void ConfigureConversions() { CookingStationConversions = config("Conversions - Cooking Station", "Conversions", DictToConfigString(DefaultCookingStationConversions), "Format: FromItem:ToItem:CookTime;FromItem:ToItem:CookTime\nUse internal prefab names. CookTime is in seconds.\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); CookingStationIronConversions = config("Conversions - Iron Cooking Station", "Conversions", DictToConfigString(DefaultIronCookingStationConversions), "Format: FromItem:ToItem:CookTime;FromItem:ToItem:CookTime\nUse internal prefab names. CookTime is in seconds.\nIron cooking station cooks slightly faster than normal.\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); OvenConversions = config("Conversions - Oven", "Conversions", DictToConfigString(DefaultOvenConversions), "Format: FromItem:ToItem:CookTime;FromItem:ToItem:CookTime\nUse internal prefab names. CookTime is in seconds.\nOven is used for baking breads and other baked goods.\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); FermenterConversions = config("Conversions - Fermenter", "Conversions", DictToConfigString(DefaultFermenterConversions, isFermenter: true), "Format: FromItem:ToItem:ProducedItems;FromItem:ToItem:ProducedItems\nUse internal prefab names. ProducedItems is the quantity produced.\nFermenter takes ~40 minutes by default.\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); SmokehouseWoodConversions = config("Conversions - Wooden Smokehouse", "Conversions", DictToConfigString(DefaultSmokehouseWoodConversions), "Format: FromItem:ToItem:CookTime;FromItem:ToItem:CookTime\nUse internal prefab names. CookTime is in seconds.\nTimes: 480s=8min, 600s=10min, 720s=12min, 960s=16min\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); SmokehouseStoneConversions = config("Conversions - Stone Smokehouse", "Conversions", DictToConfigString(DefaultSmokehouseStoneConversions), "Format: FromItem:ToItem:CookTime;FromItem:ToItem:CookTime\nUse internal prefab names. CookTime is in seconds.\nTimes: 480s=8min, 600s=10min, 720s=12min, 960s=16min\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); LegendFermenterConversions = config("Conversions - Dvergr Fermenter", "Conversions", DictToConfigString(DefaultLegendFermenterConversions, isFermenter: true), "Format: FromItem:ToItem:ProducedItems;FromItem:ToItem:ProducedItems\nUse internal prefab names. ProducedItems is the quantity produced.\nThese defaults come from the mod's built-in dictionary - modify as you wish!"); CookingStationConversions.SettingChanged += OnConversionConfigChanged; CookingStationIronConversions.SettingChanged += OnConversionConfigChanged; OvenConversions.SettingChanged += OnConversionConfigChanged; FermenterConversions.SettingChanged += OnConversionConfigChanged; SmokehouseWoodConversions.SettingChanged += OnConversionConfigChanged; SmokehouseStoneConversions.SettingChanged += OnConversionConfigChanged; LegendFermenterConversions.SettingChanged += OnConversionConfigChanged; } private void OnConversionConfigChanged(object sender, EventArgs e) { conversionReloadPending = true; } private static string DictToConfigString(Dictionary dict, bool isFermenter = false) { if (dict == null || dict.Count == 0) { return ""; } List list = new List(); foreach (KeyValuePair item in dict) { string key = item.Key; string toItem = item.Value.ToItem; if (isFermenter) { int num = ((item.Value.ProducedItems > 0) ? item.Value.ProducedItems : 6); list.Add($"{key}:{toItem}:{num}"); } else { float num2 = ((item.Value.CookTime > 0f) ? item.Value.CookTime : 40f); list.Add($"{key}:{toItem}:{num2}"); } } return string.Join(";", list); } public void Awake() { //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Expected O, but got Unknown //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Expected O, but got Unknown //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Expected O, but got Unknown //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Expected O, but got Unknown //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Expected O, but got Unknown //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Expected O, but got Unknown //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0280: Expected O, but got Unknown //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Expected O, but got Unknown //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Expected O, but got Unknown //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_0320: Expected O, but got Unknown //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Expected O, but got Unknown //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Expected O, but got Unknown //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Expected O, but got Unknown //IL_040e: Unknown result type (might be due to invalid IL or missing references) //IL_0419: Expected O, but got Unknown //IL_0447: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Expected O, but got Unknown //IL_048a: Unknown result type (might be due to invalid IL or missing references) //IL_0495: Expected O, but got Unknown //IL_0523: Unknown result type (might be due to invalid IL or missing references) //IL_052e: Expected O, but got Unknown //IL_055c: Unknown result type (might be due to invalid IL or missing references) //IL_0567: Expected O, but got Unknown //IL_0595: Unknown result type (might be due to invalid IL or missing references) //IL_05a0: Expected O, but got Unknown //IL_05ce: Unknown result type (might be due to invalid IL or missing references) //IL_05d9: Expected O, but got Unknown //IL_0667: Unknown result type (might be due to invalid IL or missing references) //IL_0672: Expected O, but got Unknown //IL_06a0: Unknown result type (might be due to invalid IL or missing references) //IL_06ab: Expected O, but got Unknown //IL_06d9: Unknown result type (might be due to invalid IL or missing references) //IL_06e4: Expected O, but got Unknown //IL_0766: Unknown result type (might be due to invalid IL or missing references) //IL_0771: Expected O, but got Unknown //IL_079f: Unknown result type (might be due to invalid IL or missing references) //IL_07aa: Expected O, but got Unknown //IL_082c: Unknown result type (might be due to invalid IL or missing references) //IL_0837: Expected O, but got Unknown //IL_0865: Unknown result type (might be due to invalid IL or missing references) //IL_0870: Expected O, but got Unknown //IL_08f2: Unknown result type (might be due to invalid IL or missing references) //IL_08fd: Expected O, but got Unknown //IL_092b: Unknown result type (might be due to invalid IL or missing references) //IL_0936: Expected O, but got Unknown //IL_09b8: Unknown result type (might be due to invalid IL or missing references) //IL_09c3: Expected O, but got Unknown //IL_09f1: Unknown result type (might be due to invalid IL or missing references) //IL_09fc: Expected O, but got Unknown bool saveOnConfigSet = ((BaseUnityPlugin)this).Config.SaveOnConfigSet; ((BaseUnityPlugin)this).Config.SaveOnConfigSet = false; _serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only."); ConfigSync.AddLockingConfigEntry(_serverConfigLocked); SmokehouseNoOvercookPrefabs = config("Smokehouse", "NoOvercookPrefabs", "GFG_DefumadorMadeira,GFG_DefumadorPedra,VC_DryingHook,VC_DryingRack", "Comma-separated list of prefab names that won't overcook items (no coal)."); SmokehouseMultiFuelPrefabs = config("Smokehouse", "MultiFuelPrefabs", "GFG_DefumadorMadeira,GFG_DefumadorPedra", "Comma-separated list of prefab names that can use multiple fuel types."); SmokehouseAllowedFuels = config("Smokehouse", "SmokehouseFuels", "FineWood,ElderBark,YggdrasilWood,Blackwood", "Comma-separated list of allowed fuel items for smokehouses. Use internal prefab names. Example: FineWood,ElderBark,YggdrasilWood,Blackwood"); PassiveCookingPrefabs = config("Smokehouse", "PassiveCookingPrefabs", "VC_DryingHook,VC_DryingRack", "Comma-separated list of cooking station prefabs that cook without fire or fuel (passive drying)"); greydwarfDropChance = config("Greydwarf Blue Mushroom Drops", "Greydwarf Drop Chance", 50f, new ConfigDescription("Chance (0-100%) for Greydwarf to drop blue mushrooms at night", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); greydwarfDropMin = config("Greydwarf Blue Mushroom Drops", "Greydwarf Drop Min", 1, new ConfigDescription("Minimum amount of blue mushrooms dropped by Greydwarf", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); greydwarfDropMax = config("Greydwarf Blue Mushroom Drops", "Greydwarf Drop Max", 2, new ConfigDescription("Maximum amount of blue mushrooms dropped by Greydwarf", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); greydwarfEliteDropChance = config("Greydwarf Blue Mushroom Drops", "Greydwarf Elite Drop Chance", 15f, new ConfigDescription("Chance (0-100%) for Greydwarf Elite to drop blue mushrooms at night", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); greydwarfEliteDropMin = config("Greydwarf Blue Mushroom Drops", "Greydwarf Elite Drop Min", 1, new ConfigDescription("Minimum amount of blue mushrooms dropped by Greydwarf Elite", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); greydwarfEliteDropMax = config("Greydwarf Blue Mushroom Drops", "Greydwarf Elite Drop Max", 2, new ConfigDescription("Maximum amount of blue mushrooms dropped by Greydwarf Elite", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); greydwarfShamanDropChance = config("Greydwarf Blue Mushroom Drops", "Greydwarf Shaman Drop Chance", 100f, new ConfigDescription("Chance (0-100%) for Greydwarf Shaman to drop blue mushrooms at night", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); greydwarfShamanDropMin = config("Greydwarf Blue Mushroom Drops", "Greydwarf Shaman Drop Min", 2, new ConfigDescription("Minimum amount of blue mushrooms dropped by Greydwarf Shaman", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); greydwarfShamanDropMax = config("Greydwarf Blue Mushroom Drops", "Greydwarf Shaman Drop Max", 3, new ConfigDescription("Maximum amount of blue mushrooms dropped by Greydwarf Shaman", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), Array.Empty())); VidarrBossDamageMultiplier = config("Víðarr Mighty Draught", "Boss Damage Multiplier", 1.25f, new ConfigDescription("Damage multiplier against bosses when Víðarr Mighty Draught is active. 1.25 = 25% bonus damage.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 3f), Array.Empty())); TrophyDropBonusPercent = config("Skaði Hunting Draught", "Trophy Drop Bonus Percent", 25f, new ConfigDescription("Percentage to increase trophy drop chance while Skaði Hunting Draught is active. Example: 25% increases a 5% drop to 30%.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); MeatDropBonus = config("Skaði’s Hunting Draught", "Meat Drop Bonus Amount", 1, new ConfigDescription("Number of extra meat items to drop while Skaði Hunting Draught is active. Example: 1 increases a drop of 2 meat to 3 meat.", (AcceptableValueBase)(object)new AcceptableValueRange(0, 10), Array.Empty())); FreyrPickableBonusChance = config("Freyr Draught of Prosperity", "PickableBonusChance", 0.25f, new ConfigDescription("Chance to receive bonus items from harvested items (mushrooms, berries, vegetables, seeds, rubies, amber, pearls, coins) (0-1)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); FreyrPickableBonusAmount = config("Freyr Draught of Prosperity", "PickableBonusAmount", 1, new ConfigDescription("Amount of bonus items to receive when picking (e.g., 1 = get 1 extra, 2 = get 2 extra, etc.)", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), new object[1] { new ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); FreyrCreatureCoinBonusChance = config("Freyr Draught of Prosperity", "CreatureCoinBonusChance", 0.25f, new ConfigDescription("Chance to receive bonus coins from killing trolls, goblins, and other configured creatures (0-1)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); FreyrCreatureCoinBonusAmount = config("Freyr Draught of Prosperity", "CreatureCoinBonusAmount", 10, new ConfigDescription("Bonus coin amount to add to creature drops. Example: Troll normally drops 8 coins, with value 10 will drop 18 coins total.", (AcceptableValueBase)(object)new AcceptableValueRange(1, 100), new object[1] { new ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); FreyrChestBonusChance = config("Freyr Draught of Prosperity", "ChestBonusChance", 0.25f, new ConfigDescription("Chance to receive bonus items from treasure chests (gems, food, and other configured items) (0-1)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); FreyrChestBonusAmount = config("Freyr Draught of Prosperity", "ChestBonusAmount", 1, new ConfigDescription("Amount of bonus items to add to chest per eligible item (e.g., 1 = add 1 extra, 2 = add 2 extra, etc.)", (AcceptableValueBase)(object)new AcceptableValueRange(1, 10), new object[1] { new ConfigurationManagerAttributes { ShowRangeAsPercent = false } })); FreyrPickableItems = config("Freyr Draught of Prosperity - Item Lists", "PickableItems", "dandelion,thistle,raspberries,blueberries,cloudberries,vineberry,mushroomcommon,mushroomyellow,mushroom_bzerker,jotunpuffs,magecap,smokepuff,carrot,turnip,onion,fiddleheadfern,carrotseeds,turnipseeds,onionseeds,barley,flax,dragonegg,ruby,amber,amberpearl,silvernecklace,coins,gemstone_blue,gemstone_green,gemstone_red", "Comma-separated list of pickable item names (lowercase, no $item_ prefix). Includes all pickable items. Add items from other mods here for compatibility."); FreyrChestItems = config("Freyr Draught of Prosperity - Item Lists", "ChestItems", "ruby,amber,amberpearl,silvernecklace,coins,gemstone_blue,gemstone_green,gemstone_red,boarjerky,sausages,chicken_egg,mead_stamina_minor,mead_stamina_medium,mead_stamina_lingering,mead_hp_minor,mead_hp_medium,mead_hp_major,mead_hp_lingering,mead_eitr_minor,mead_eitr_lingering,mead_poisonres,mead_frostres,vc_lightningresistmead,barleywine,mead_bzerker,mead_bugrepellent,mead_hasty,mead_lightfoot,mead_strength,mead_swimmer,mead_tamer,mead_tasty,mead_trollpheromones", "Comma-separated list of chest item names (lowercase, no $item_ prefix). Includes all item inside chests. Add items from other mods here for compatibility."); FreyrCreatureNames = config("Freyr Draught of Prosperity - Item Lists", "CreaturePrefabs", "Troll,Goblin,GoblinArcher,GoblinBrute,GoblinShaman,Dverger,DvergerAshlands,DvergerMage,DvergerMageFire,DvergerMageIce,DvergerMageSupport", "Comma-separated list of creature prefab names (or keywords) for bonus coin drops. Creatures with prefabs containing these keywords will drop bonus coins. Add creature prefabs from other mods here for compatibility."); NjordrSailingSpeedMultiplier = config("Njörðr Draught", "Sailing Speed Multiplier", 1.3f, new ConfigDescription("Multiplier for sailing speed when Njörðr Draught is active. Default is 1.2 (20% increase).", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 10f), Array.Empty())); TorrDraughtPowerAttackBonus = config("Tórr Draught", "Power Attack Damage Bonus", 0.25f, new ConfigDescription("Damage bonus multiplier for power attacks when Tórr Draught effect is active (0.25 = 25% bonus, 1.0 = 100% bonus)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 10f), Array.Empty())); TorrDraughtLightningChance = config("Tórr Draught", "Summon Lightning Chance", 0.5f, new ConfigDescription("Chance for power attacks to trigger lightning AoE (0.75 = 75% chance)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); FreyjaStaffEitrReduction = config("Freyja Draught", "Staff Eitr Reduction", 25f, new ConfigDescription("Percentage of eitr cost reduction for staff attacks (0-100)", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); IdunnHealthBonus = config("God Draughts", "Idunn Health Bonus", 30f, "Amount of maximum health increased by Idunn's Draught."); IdunnStaminaBonus = config("God Draughts", "Idunn Stamina Bonus", 30f, "Amount of maximum stamina increased by Idunn's Draught."); IdunnEitrBonus = config("God Draughts", "Idunn Eitr Bonus", 30f, "Amount of maximum eitr increased by Idunn's Draught."); BaldrSpiritDamageBonus = config("Baldr Draught of Radiance", "Spirit Damage Bonus", 15f, new ConfigDescription("Additional spirit damage dealt to undead and demon creatures while Baldr Draught of Radiance is active.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 100f), Array.Empty())); MedicamentoFulingTTL = config("Medicamento Fuling", "Duration", 120f, new ConfigDescription("Duration in seconds of GFG_Efeito_MedicamentoFuling.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 600f), Array.Empty())); MedicamentoFulingHealthUpFront = config("Medicamento Fuling", "Health Restored", 50f, new ConfigDescription("Instant health restored when GFG_Efeito_MedicamentoFuling is applied.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), Array.Empty())); MedicamentoFulingTTL.SettingChanged += delegate { ApplyMedicamentoFulingEffect(); }; MedicamentoFulingHealthUpFront.SettingChanged += delegate { ApplyMedicamentoFulingEffect(); }; RoncaTuneisTTL = config("Ronca Tuneis", "Duration", 120f, new ConfigDescription("Duration in seconds of GFG_Efeito_RoncaTuneis.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 600f), Array.Empty())); RoncaTuneisHealthUpFront = config("Ronca Tuneis", "Health Restored", 100f, new ConfigDescription("Instant health restored when GFG_Efeito_RoncaTuneis is applied.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), Array.Empty())); RoncaTuneisTTL.SettingChanged += delegate { ApplyRoncaTuneisEffect(); }; RoncaTuneisHealthUpFront.SettingChanged += delegate { ApplyRoncaTuneisEffect(); }; LeiteLoxTTL = config("Leite Lox", "Duration", 120f, new ConfigDescription("Duration in seconds of GFG_Efeito_LeiteLox.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 600f), Array.Empty())); LeiteLoxStaminaUpFront = config("Leite Lox", "Stamina Restored", 50f, new ConfigDescription("Instant stamina restored when GFG_Efeito_LeiteLox is applied.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), Array.Empty())); LeiteLoxTTL.SettingChanged += delegate { ApplyLeiteLoxEffect(); }; LeiteLoxStaminaUpFront.SettingChanged += delegate { ApplyLeiteLoxEffect(); }; LodoardenteTTL = config("Lodo Ardente", "Duration", 120f, new ConfigDescription("Duration in seconds of GFG_Efeito_Lodoardente.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 600f), Array.Empty())); LodoardenteStaminaUpFront = config("Lodo Ardente", "Stamina Restored", 100f, new ConfigDescription("Instant stamina restored when GFG_Efeito_Lodoardente is applied.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), Array.Empty())); LodoardenteTTL.SettingChanged += delegate { ApplyLodoardenteEffect(); }; LodoardenteStaminaUpFront.SettingChanged += delegate { ApplyLodoardenteEffect(); }; NeblinaMentesTTL = config("Neblina Mentes", "Duration", 120f, new ConfigDescription("Duration in seconds of GFG_Efeito_NeblinaMentes.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 600f), Array.Empty())); NeblinaMentesEitrUpFront = config("Neblina Mentes", "Eitr Restored", 100f, new ConfigDescription("Instant eitr restored when GFG_Efeito_NeblinaMentes is applied.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 500f), Array.Empty())); NeblinaMentesTTL.SettingChanged += delegate { ApplyNeblinaMentesEffect(); }; NeblinaMentesEitrUpFront.SettingChanged += delegate { ApplyNeblinaMentesEffect(); }; CookingStationPatches.Initialize(); ConfigureConversions(); Item item = new Item("glitnircomidas", "GFG_MarteloBarril"); item.Crafting.Add(ItemManager.CraftingTable.Forge, 1); item.Name.English("Keg Hammer"); item.Description.English("Set the table with whatever food and drink you fancy, and impress your guests with a delicious feast."); item.Name.Portuguese_Brazilian("Martelo de Barril"); item.Description.Portuguese_Brazilian("Prepare a mesa com as comidas e bebidas de sua predileção e impressione os convidados com um banquete delicioso."); item.RequiredItems.Add("FineWood", 4); item.RequiredItems.Add("Resin", 2); item.RequiredItems.Add("Tin", 2); item.RequiredItems.Add("BronzeNails", 8); item.RequiredUpgradeItems.Add("FineWood", 4); item.CraftAmount = 1; BuildPiece buildPiece = new BuildPiece("glitnircomidas", "GFG_Eldhrimnir"); buildPiece.Category.Set(BuildPieceCategory.Crafting); buildPiece.Name.English("Eldhrímnir"); buildPiece.Description.English("A perfect replica of Eldhrímnir, the cauldron of the gods."); buildPiece.Name.Portuguese_Brazilian("Eldhrímnir"); buildPiece.Description.Portuguese_Brazilian("Réplica perfeita de Eldhrímnir, o caldeirão dos deuses."); buildPiece.Crafting.Set(PieceManager.CraftingTable.Forge); buildPiece.RequiredItems.Add("GFG_BronzeNidavellir", 12, recover: true); BuildPiece buildPiece2 = new BuildPiece("glitnircomidas", "GFG_DefumadorMadeira"); buildPiece2.Category.Set(BuildPieceCategory.Crafting); buildPiece2.Name.English("Wood Smokehouse"); buildPiece2.Description.English("A wooden smokehouse with four slots."); buildPiece2.Name.Portuguese_Brazilian("Defumador de Madeira"); buildPiece2.Description.Portuguese_Brazilian("Um defumador de madeira com capacidade para quatro peças."); buildPiece2.Crafting.Set(PieceManager.CraftingTable.Workbench); buildPiece2.RequiredItems.Add("Wood", 50, recover: true); buildPiece2.RequiredItems.Add("Stone", 5, recover: true); buildPiece2.RequiredItems.Add("GFG_IscaDefumador", 1, recover: true); BuildPiece buildPiece3 = new BuildPiece("glitnircomidas", "GFG_DefumadorPedra"); buildPiece3.Category.Set(BuildPieceCategory.Crafting); buildPiece3.Name.English("Stone Smokehouse"); buildPiece3.Description.English("A stone smokehouse with twenty eight slots."); buildPiece3.Name.Portuguese_Brazilian("Defumador de Pedra"); buildPiece3.Description.Portuguese_Brazilian("Um defumador de madeira com capacidade para vinte e oito peças."); buildPiece3.Crafting.Set(PieceManager.CraftingTable.StoneCutter); buildPiece3.RequiredItems.Add("Stone", 80, recover: true); buildPiece3.RequiredItems.Add("FineWood", 20, recover: true); buildPiece3.RequiredItems.Add("Iron", 16, recover: true); buildPiece3.RequiredItems.Add("GFG_IscaDefumador", 10, recover: true); BuildPiece buildPiece4 = new BuildPiece("glitnircomidas", "GFG_FermentadorDvergr"); buildPiece4.Category.Set(BuildPieceCategory.Crafting); buildPiece4.Name.English("Dvergr Fermenter"); buildPiece4.Description.English("A masterwork of dvergr craft, engineered to enrich every fermentation and brew meads worthy of saga and song.\n\nEach brew yields one extra serving."); buildPiece4.Name.Portuguese_Brazilian("Fermentador Dvergr"); buildPiece4.Description.Portuguese_Brazilian("Uma obra-prima da arte dvergr, projetada para enriquecer cada fermentação e produzir hidroméis dignos de saga e música.\n\nCada fermentação rende um produto extra."); buildPiece4.Crafting.Set(PieceManager.CraftingTable.ArtisanTable); buildPiece4.RequiredItems.Add("FineWood", 30, recover: true); buildPiece4.RequiredItems.Add("GFG_BronzeNidavellir", 20, recover: true); buildPiece4.RequiredItems.Add("IronNails", 20, recover: true); buildPiece4.RequiredItems.Add("Resin", 10, recover: true); Item item2 = new Item("glitnircomidas", "GFG_FarinhaOsso"); item2.Name.English("Bone Flour"); item2.Description.English("Finely ground bone meal, ready for the pot."); item2.Name.Portuguese_Brazilian("Farinha de Osso"); item2.Description.Portuguese_Brazilian("Farinha de ossos finamente moída, pronta para a panela."); item2.Crafting.Add(ItemManager.CraftingTable.Workbench, 1); item2.RequiredItems.Add("BoneFragments", 10); item2.CraftAmount = 10; new ItemManager.Conversion(item2) { Input = "BoneFragments", Piece = ConversionPiece.Windmill }; Item item3 = new Item("glitnircomidas", "GFG_BronzeNidavellir"); item3.Name.English("Niðavellir Bronze"); item3.Description.English("A forge-blessed alloy from the depths of dvergr craft."); item3.Name.Portuguese_Brazilian("Bronze de Niðavellir"); item3.Description.Portuguese_Brazilian("Uma liga abençoada pela forja das profundezas da arte dvergr."); item3.Crafting.Add(ItemManager.CraftingTable.Forge, 1); item3.RequiredItems.Add("Copper", 2); item3.RequiredItems.Add("Tin", 1); item3.RequiredItems.Add("Coal", 3); item3.RequiredItems.Add("SurtlingCore", 1); item3.CraftAmount = 1; Item item4 = new Item("glitnircomidas", "GFG_IscaDefumador"); item4.Name.English("Smokestarter"); item4.Description.English("Dried fibers soaked in rare resins and enchanted by ancient vitki. When lit, they release a thick smoke capable of impregnating meat with ether."); item4.Name.Portuguese_Brazilian("Isca de Defumação"); item4.Description.Portuguese_Brazilian("Fibras secas embebidas em resinas raras e encantadas por antigos vitki. Quando acesas, liberam uma fumaça espessa capaz de impregnar a carne com éter."); item4.Trade.Price = 10000u; item4.Trade.Stack = 1u; item4.Trade.Trader = Trader.Haldor; Item item5 = new Item("glitnircomidas", "GFG_TentaculoKraken"); item5.Name.English("Kraken Tentacle"); item5.Description.English("A writhing limb from the deep, still slick with brine."); item5.Name.Portuguese_Brazilian("Tentáculo de Kraken"); item5.Description.Portuguese_Brazilian("Um membro retorcido das profundezas, ainda escorregadio de salmoura."); item5.Trade.Price = 250u; item5.Trade.Stack = 1u; item5.Trade.RequiredGlobalKey = "defeated_goblinking"; item5.Trade.Trader = Trader.BogWitch; Item item6 = new Item("glitnircomidas", "GFG_LeiteLox"); item6.Name.English("Lox Milk"); item6.Description.English("Thick and nourishing milk from the plains beast.\n\nRestores 50 stamina."); item6.Name.Portuguese_Brazilian("Leite de Lox"); item6.Description.Portuguese_Brazilian("Leite espesso e nutritivo da besta das planícies.\n\nRestaura 50 de vigor."); item6.DropsFrom.Add("Lox", 0.5f, 2, 3); item6.Trade.Price = 60u; item6.Trade.Stack = 1u; item6.Trade.RequiredGlobalKey = "defeated_dragon"; item6.Trade.Trader = Trader.BogWitch; Item item7 = new Item("glitnircomidas", "GFG_MedicamentoFiuling"); item7.Name.English("Fuling Medicine"); item7.Description.English("A bitter draught of goblin origin.\n\nRestores 50 health."); item7.Name.Portuguese_Brazilian("Medicamento Fuling"); item7.Description.Portuguese_Brazilian("Uma bebida amarga de origem goblin.\n\nRestaura 50 de vida."); item7.DropsFrom.Add("GoblinArcher", 0.4f); Item item8 = new Item("glitnircomidas", "GFG_HidromelDvergr"); item8.Name.English("Dvergr Mead"); item8.Description.English("Strong mead brewed in the depths of dvergr halls.\n\n+15% health, stamina and eitr regeneration for 15 minutes."); item8.Name.Portuguese_Brazilian("Hidromel Dvergr"); item8.Description.Portuguese_Brazilian("Hidromel forte fermentado nas profundezas dos salões dvergr.\n\n+15% de regeneração de vida, vigor e éter por 15 minutos."); item8.DropsFrom.Add("Dverger", 0.5f); item8.DropsFrom.Add("DvergerMageFire", 0.5f); item8.DropsFrom.Add("DvergerMageIce", 0.5f); item8.DropsFrom.Add("DvergerMageSupport", 0.5f); item8.DropsFrom.Add("DvergerAshlands", 0.5f); Item item9 = new Item("glitnircomidas", "GFG_Lodoardente"); item9.Name.English("Fireslag Booze"); item9.Description.English("Burns the throat and warms the spirit.\n\nRestores 100 stamina."); item9.Name.Portuguese_Brazilian("Lodoardente"); item9.Description.Portuguese_Brazilian("Queima a garganta e aquece o espírito.\n\nRestaura 100 de vigor."); Item item10 = new Item("glitnircomidas", "GFG_RoncaTuneis"); item10.Name.English("Tunnelrumbler"); item10.Description.English("Echoes through stone and mind alike.\n\nRestores 100 health."); item10.Name.Portuguese_Brazilian("Ronca-Túneis"); item10.Description.Portuguese_Brazilian("Ecoa através de pedra e mente igualmente.\n\nRestaura 100 de vida."); Item item11 = new Item("glitnircomidas", "GFG_NeblinaMentes"); item11.Name.English("Nogginfog"); item11.Description.English("Clouds thought, sharpens instinct.\n\nRestores 100 eitr."); item11.Name.Portuguese_Brazilian("Neblina-Mentes"); item11.Description.Portuguese_Brazilian("Nubla o pensamento, afia o instinto.\n\nRestaura 100 de éter."); Item item12 = new Item("glitnircomidas", "GFG_GotasMimir"); item12.Name.English("Mímisbrunnr Drops"); item12.Description.English("Wisdom distilled from the well of memory.\n\nLearn all skills 25% faster for 5 minutes."); item12.Name.Portuguese_Brazilian("Gotas de Mímisbrunnr"); item12.Description.Portuguese_Brazilian("Sabedoria destilada do poço da memória.\n\nAprende todas as habilidades 25% mais rápido por 5 minutos."); item12.DropsFrom.Add("FallenValkyrie", 0.8f); Item item13 = new Item("glitnircomidas", "GFG_ChapeuNott"); item13.Name.English("Nótt's Cap"); item13.Description.English("A pale mushroom that thrives in shadow."); item13.Name.Portuguese_Brazilian("Chapéu de Nótt"); item13.Description.Portuguese_Brazilian("Um cogumelo pálido que prospera na sombra."); Item item14 = new Item("glitnircomidas", "GFG_MirtiloVermelho"); item14.Name.English("Redberry"); item14.Description.English("Tart and bright, scavenged from the dry corpses of greylings."); item14.Name.Portuguese_Brazilian("Mirtilo-Vermelho"); item14.Description.Portuguese_Brazilian("Azedo e vibrante, encontrado nos corpos secos de cinzentos."); item14.DropsFrom.Add("Greyling", 0.85f, 2, 3); Item item15 = new Item("glitnircomidas", "GFG_CarnePassaroCozida"); item15.Name.English("Cooked Bird Meat"); item15.Description.English("Simple and filling."); item15.Name.Portuguese_Brazilian("Carne de Pássaro Cozida"); item15.Description.Portuguese_Brazilian("Simples e satisfatória."); Item item16 = new Item("glitnircomidas", "GFG_PernilJavaliCozido"); item16.Name.English("Roasted Boar Shank"); item16.Description.English("Honey-glazed and tender."); item16.Name.Portuguese_Brazilian("Pernil de Javali Cozido"); item16.Description.Portuguese_Brazilian("Vidrado com mel e macio."); Item item17 = new Item("glitnircomidas", "GFG_CostelaCervoCozida"); item17.Name.English("Grilled Deer Rib"); item17.Description.English("Seasoned with berries and dripping with juice."); item17.Name.Portuguese_Brazilian("Costela de Cervo Cozida"); item17.Description.Portuguese_Brazilian("Temperada com frutos silvestres e pingando sucos."); Item item18 = new Item("glitnircomidas", "GFG_CarneTrollCozida"); item18.Name.English("Cooked Troll Meat"); item18.Description.English("Tough but strangely satisfying."); item18.Name.Portuguese_Brazilian("Carne de Troll Cozida"); item18.Description.Portuguese_Brazilian("Dura, mas estranhamente satisfatória."); Item item19 = new Item("glitnircomidas", "GFG_CarnePassaro"); item19.Name.English("Raw Bird Meat"); item19.Description.English("Fresh from the hunt."); item19.Name.Portuguese_Brazilian("Carne de Pássaro"); item19.Description.Portuguese_Brazilian("Fresca da caça."); Item item20 = new Item("glitnircomidas", "GFG_PernilJavaliCru"); item20.Name.English("Raw Boar Shank"); item20.Description.English("Marinated in honey and berries."); item20.Name.Portuguese_Brazilian("Pernil de Javali Cru"); item20.Description.Portuguese_Brazilian("Marinado em mel e frutos silvestres."); item20.Crafting.Add(ItemManager.CraftingTable.Inventory, 1); item20.RequiredItems.Add("RawMeat", 2); item20.RequiredItems.Add("Honey", 1); item20.RequiredItems.Add("GFG_MirtiloVermelho", 4); item20.CraftAmount = 2; Item item21 = new Item("glitnircomidas", "GFG_CostelaCervoCrua"); item21.Name.English("Raw Deer Rib"); item21.Description.English("Ready for the spit."); item21.Name.Portuguese_Brazilian("Costela de Cervo Crua"); item21.Description.Portuguese_Brazilian("Pronta para o espeto."); item21.Crafting.Add(ItemManager.CraftingTable.Inventory, 1); item21.RequiredItems.Add("DeerMeat", 2); item21.RequiredItems.Add("Honey", 1); item21.RequiredItems.Add("GFG_MirtiloVermelho", 4); item21.CraftAmount = 2; Item item22 = new Item("glitnircomidas", "GFG_CarneTroll"); item22.Name.English("Raw Troll Meat"); item22.Description.English("Dense and gamey."); item22.Name.Portuguese_Brazilian("Carne de Troll"); item22.Description.Portuguese_Brazilian("Densa e selvagem."); item22.DropsFrom.Add("Troll", 1f, 2, 3); Item item23 = new Item("glitnircomidas", "GFG_SidraPicante"); item23.Name.English("Spiced Cider"); item23.Description.English("Sweet warmth with a bite."); item23.Name.Portuguese_Brazilian("Sidra Picante"); item23.Description.Portuguese_Brazilian("Calor doce com uma mordida."); Item item24 = new Item("glitnircomidas", "GFG_PiclesLegumes"); item24.Name.English("Pickled Vegetables"); item24.Description.English("Sour and crisp."); item24.Name.Portuguese_Brazilian("Picles de Legumes"); item24.Description.Portuguese_Brazilian("Azedo e crocante."); Item item25 = new Item("glitnircomidas", "GFG_QueijoLox"); item25.Name.English("Lox Cheese"); item25.Description.English("Rich and creamy."); item25.Name.Portuguese_Brazilian("Queijo de Lox"); item25.Description.Portuguese_Brazilian("Rico e cremoso."); Item item26 = new Item("glitnircomidas", "GFG_CervejaCogumelo"); item26.Name.English("Mushroom Ale"); item26.Description.English("Earthy and potent."); item26.Name.Portuguese_Brazilian("Cerveja de Cogumelos"); item26.Description.Portuguese_Brazilian("Terrosa e potente."); Item item27 = new Item("glitnircomidas", "GFG_HakarlMandibulossea"); item27.Name.English("Bonemaw Hákarl"); item27.Description.English("Fermented serpent, not for the faint of heart."); item27.Name.Portuguese_Brazilian("Hákarl de Mandibulóssea"); item27.Description.Portuguese_Brazilian("Serpente fermentada, não para os fracos de coração."); Item item28 = new Item("glitnircomidas", "GFG_Rakfisk"); item28.Name.English("Rakfisk"); item28.Description.English("Aged fish with a powerful aroma."); item28.Name.Portuguese_Brazilian("Rakfisk"); item28.Description.Portuguese_Brazilian("Peixe envelhecido com um aroma poderoso."); Item item29 = new Item("glitnircomidas", "GFG_Hakarl"); item29.Name.English("Hákarl"); item29.Description.English("Traditional fermented serpent meat."); item29.Name.Portuguese_Brazilian("Hákarl"); item29.Description.Portuguese_Brazilian("Carne de serpente fermentada tradicional."); Item item30 = new Item("glitnircomidas", "GFG_SidraPicanteBase"); item30.Name.English("Unfermented Spiced Cider"); item30.Description.English("Awaits time in the barrel."); item30.Name.Portuguese_Brazilian("Sidra Picante Não-Fermentada"); item30.Description.Portuguese_Brazilian("Aguarda o tempo no barril."); item30.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item30.RequiredItems.Add("Pukeberries", 4); item30.RequiredItems.Add("Dandelion", 1); item30.RequiredItems.Add("PowderedDragonEgg", 2); item30.RequiredItems.Add("Honey", 6); item30.CraftAmount = 1; Item item31 = new Item("glitnircomidas", "GFG_PiclesLegumesBase"); item31.Name.English("Unpickled Vegetables"); item31.Description.English("Fresh and ready to brine."); item31.Name.Portuguese_Brazilian("Legumes Não-Curtidos"); item31.Description.Portuguese_Brazilian("Frescos e prontos para a salmoura."); item31.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item31.RequiredItems.Add("GFG_LegumesPicados", 3); item31.RequiredItems.Add("PowderedDragonEgg", 2); item31.RequiredItems.Add("Ooze", 1); item31.CraftAmount = 1; Item item32 = new Item("glitnircomidas", "GFG_QueijoLoxBase"); item32.Name.English("Unaged Lox Cheese"); item32.Description.English("Needs time to develop flavor."); item32.Name.Portuguese_Brazilian("Queijo de Lox Não-Curado"); item32.Description.Portuguese_Brazilian("Precisa de tempo para desenvolver sabor."); item32.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item32.RequiredItems.Add("GFG_LeiteLox", 2); item32.CraftAmount = 1; Item item33 = new Item("glitnircomidas", "GFG_CervejaCogumeloBase"); item33.Name.English("Unfermented Mushroom Ale"); item33.Description.English("The brewing has just begun."); item33.Name.Portuguese_Brazilian("Cerveja de Cogumelos Não-Fermentada"); item33.Description.Portuguese_Brazilian("A fermentação apenas começou."); item33.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item33.RequiredItems.Add("MushroomJotunPuffs", 4); item33.RequiredItems.Add("MushroomMagecap", 4); item33.RequiredItems.Add("Thistle", 1); item33.RequiredItems.Add("Barley", 6); item33.CraftAmount = 1; Item item34 = new Item("glitnircomidas", "GFG_HakarlMandibulosseaBase"); item34.Name.English("Unfermented Bonemaw Hákarl"); item34.Description.English("Raw preparation awaiting fermentation."); item34.Name.Portuguese_Brazilian("Hákarl de Mandibulóssea Não-Fermentado"); item34.Description.Portuguese_Brazilian("Preparação crua aguardando fermentação."); item34.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item34.RequiredItems.Add("BoneMawSerpentMeat", 1); item34.RequiredItems.Add("PowderedDragonEgg", 2); item34.RequiredItems.Add("FreezeGland", 1); item34.CraftAmount = 1; Item item35 = new Item("glitnircomidas", "GFG_RakfiskBase"); item35.Name.English("Unfermented Rakfisk"); item35.Description.English("Salted fish ready for aging."); item35.Name.Portuguese_Brazilian("Rakfisk Não-Fermentado"); item35.Description.Portuguese_Brazilian("Peixe salgado pronto para envelhecer."); item35.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item35.RequiredItems.Add("Fish10", 2); item35.RequiredItems.Add("Sap", 1); item35.RequiredItems.Add("FreezeGland", 1); item35.RequiredItems.Add("SpiceForests", 3); item35.CraftAmount = 1; Item item36 = new Item("glitnircomidas", "GFG_HakarlBase"); item36.Name.English("Unfermented Hákarl"); item36.Description.English("Fresh serpent meat in brine."); item36.Name.Portuguese_Brazilian("Hákarl Não-Fermentado"); item36.Description.Portuguese_Brazilian("Carne de serpente fresca em salmoura."); item36.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item36.RequiredItems.Add("SerpentMeat", 1); item36.RequiredItems.Add("SpiceOceans", 3); item36.RequiredItems.Add("FreezeGland", 1); item36.CraftAmount = 1; Item item37 = new Item("glitnircomidas", "GFG_LegumesPicados"); item37.Name.English("Chopped Vegetables"); item37.Description.English("Diced and ready for the pot."); item37.Name.Portuguese_Brazilian("Legumes Picados"); item37.Description.Portuguese_Brazilian("Cortados e prontos para a panela."); item37.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item37.RequiredItems.Add("Carrot", 1); item37.RequiredItems.Add("Turnip", 1); item37.RequiredItems.Add("Onion", 1); item37.CraftAmount = 2; Item item38 = new Item("glitnircomidas", "GFG_Smorrebrod"); item38.Name.English("Smørrebrød"); item38.Description.English("Open-faced bounty on fresh bread."); item38.Name.Portuguese_Brazilian("Smørrebrød"); item38.Description.Portuguese_Brazilian("Fartura aberta sobre pão fresco."); item38.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38.RequiredItems.Add("Bread", 1); item38.RequiredItems.Add("GFG_Rakfisk", 1); item38.RequiredItems.Add("GFG_QueijoLox", 1); item38.RequiredItems.Add("SpiceForests", 3); item38.CraftAmount = 3; item38["Smorrebrod_Oceano"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38["Smorrebrod_Oceano"].RequiredItems.Add("Bread", 1); item38["Smorrebrod_Oceano"].RequiredItems.Add("GFG_Rakfisk", 1); item38["Smorrebrod_Oceano"].RequiredItems.Add("GFG_QueijoLox", 1); item38["Smorrebrod_Oceano"].RequiredItems.Add("SpiceOceans", 3); item38["Smorrebrod_Oceano"].CraftAmount = 3; item38["Smorrebrod_Montanha"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38["Smorrebrod_Montanha"].RequiredItems.Add("Bread", 1); item38["Smorrebrod_Montanha"].RequiredItems.Add("GFG_Rakfisk", 1); item38["Smorrebrod_Montanha"].RequiredItems.Add("GFG_QueijoLox", 1); item38["Smorrebrod_Montanha"].RequiredItems.Add("SpiceMountains", 3); item38["Smorrebrod_Montanha"].CraftAmount = 3; item38["Smorrebrod_Planicie"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38["Smorrebrod_Planicie"].RequiredItems.Add("Bread", 1); item38["Smorrebrod_Planicie"].RequiredItems.Add("GFG_Rakfisk", 1); item38["Smorrebrod_Planicie"].RequiredItems.Add("GFG_QueijoLox", 1); item38["Smorrebrod_Planicie"].RequiredItems.Add("SpicePlains", 3); item38["Smorrebrod_Planicie"].CraftAmount = 3; item38["Smorrebrod_TerrasNebulosas"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38["Smorrebrod_TerrasNebulosas"].RequiredItems.Add("Bread", 1); item38["Smorrebrod_TerrasNebulosas"].RequiredItems.Add("GFG_Rakfisk", 1); item38["Smorrebrod_TerrasNebulosas"].RequiredItems.Add("GFG_QueijoLox", 1); item38["Smorrebrod_TerrasNebulosas"].RequiredItems.Add("SpiceMistlands", 3); item38["Smorrebrod_TerrasNebulosas"].CraftAmount = 3; item38["Smorrebrod_TerrasCinzentas"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item38["Smorrebrod_TerrasCinzentas"].RequiredItems.Add("Bread", 1); item38["Smorrebrod_TerrasCinzentas"].RequiredItems.Add("GFG_Rakfisk", 1); item38["Smorrebrod_TerrasCinzentas"].RequiredItems.Add("GFG_QueijoLox", 1); item38["Smorrebrod_TerrasCinzentas"].RequiredItems.Add("SpiceAshlands", 3); item38["Smorrebrod_TerrasCinzentas"].CraftAmount = 3; Item item39 = new Item("glitnircomidas", "GFG_Gravlaks"); item39.Name.English("Gravlaks"); item39.Description.English("Cured fish with honey and herbs."); item39.Name.Portuguese_Brazilian("Gravlaks"); item39.Description.Portuguese_Brazilian("Peixe curado com mel e ervas."); item39.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item39.RequiredItems.Add("Fish10", 2); item39.RequiredItems.Add("Honey", 1); item39.RequiredItems.Add("SpiceForests", 2); item39.RequiredItems.Add("FreezeGland", 1); item39.CraftAmount = 2; Item item40 = new Item("glitnircomidas", "GFG_TortaMirtiloVermelho"); item40.Name.English("Redberry Tart"); item40.Description.English("Sweet and flaky."); item40.Name.Portuguese_Brazilian("Torta de Mirtilo-Vermelho"); item40.Description.Portuguese_Brazilian("Doce e crocante."); Item item41 = new Item("glitnircomidas", "GFG_CaldoNoturno"); item41.Name.English("Overnight Broth"); item41.Description.English("Simmered all night, ready at dawn.\n\nRaise all skills by 10 points for 20 minutes."); item41.Name.Portuguese_Brazilian("Caldo Noturno"); item41.Description.Portuguese_Brazilian("Fervido toda a noite, pronto ao amanhecer.\n\nAumenta todas as habilidades em 10 pontos por 20 minutos."); Item item42 = new Item("glitnircomidas", "GFG_PaoViagem"); item42.Name.English("Waybread"); item42.Description.English("Dense and lasting."); item42.Name.Portuguese_Brazilian("Pão de Viagem"); item42.Description.Portuguese_Brazilian("Denso e duradouro."); Item item43 = new Item("glitnircomidas", "GFG_KrakenAssado"); item43.Name.English("Roasted Kraken"); item43.Description.English("Charred and chewy."); item43.Name.Portuguese_Brazilian("Kraken Assado"); item43.Description.Portuguese_Brazilian("Chamuscado e mastigável."); Item item44 = new Item("glitnircomidas", "GFG_TortaMirtiloVermelhoCrua"); item44.Name.English("Unbaked Redberry Tart"); item44.Description.English("Ready for the oven."); item44.Name.Portuguese_Brazilian("Torta de Mirtilo-Vermelho Crua"); item44.Description.Portuguese_Brazilian("Pronta para o forno."); item44.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item44.RequiredItems.Add("GFG_MirtiloVermelho", 8); item44.RequiredItems.Add("Honey", 2); item44.RequiredItems.Add("GFG_LeiteLox", 1); item44.RequiredItems.Add("BarleyFlour", 3); item44.CraftAmount = 1; Item item45 = new Item("glitnircomidas", "GFG_CaldoNoturnoCru"); item45.Name.English("Uncooked Overnight Broth"); item45.Description.English("Needs a slow roast."); item45.Name.Portuguese_Brazilian("Caldo Noturno Cru"); item45.Description.Portuguese_Brazilian("Precisa de um cozimento lento."); item45.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item45.RequiredItems.Add("RawMeat", 4); item45.RequiredItems.Add("GFG_LegumesPicados", 2); item45.RequiredItems.Add("SpiceMountains", 5); item45.RequiredItems.Add("SpicePlains", 5); item45.CraftAmount = 1; item45["CaldoNoturno_Cervo"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Cervo"].RequiredItems.Add("DeerMeat", 4); item45["CaldoNoturno_Cervo"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Cervo"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Cervo"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Cervo"].CraftAmount = 1; item45["CaldoNoturno_Lagarto"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Lagarto"].RequiredItems.Add("NeckTail", 4); item45["CaldoNoturno_Lagarto"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Lagarto"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Lagarto"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Lagarto"].CraftAmount = 1; item45["CaldoNoturno_Passaro"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Passaro"].RequiredItems.Add("GFG_CarnePassaro", 4); item45["CaldoNoturno_Passaro"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Passaro"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Passaro"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Passaro"].CraftAmount = 1; item45["CaldoNoturno_Urso"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Urso"].RequiredItems.Add("BjornMeat", 2); item45["CaldoNoturno_Urso"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Urso"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Urso"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Urso"].CraftAmount = 1; item45["CaldoNoturno_Troll"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Troll"].RequiredItems.Add("GFG_CarneTroll", 2); item45["CaldoNoturno_Troll"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Troll"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Troll"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Troll"].CraftAmount = 1; item45["CaldoNoturno_Lobo"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Lobo"].RequiredItems.Add("WolfMeat", 2); item45["CaldoNoturno_Lobo"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Lobo"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Lobo"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Lobo"].CraftAmount = 1; item45["CaldoNoturno_Lox"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Lox"].RequiredItems.Add("LoxMeat", 2); item45["CaldoNoturno_Lox"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Lox"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Lox"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Lox"].CraftAmount = 1; item45["CaldoNoturno_Frango"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Frango"].RequiredItems.Add("ChickenMeat", 3); item45["CaldoNoturno_Frango"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Frango"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Frango"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Frango"].CraftAmount = 1; item45["CaldoNoturno_Buscador"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Buscador"].RequiredItems.Add("BugMeat", 2); item45["CaldoNoturno_Buscador"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Buscador"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Buscador"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Buscador"].CraftAmount = 1; item45["CaldoNoturno_Lebre"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Lebre"].RequiredItems.Add("HareMeat", 2); item45["CaldoNoturno_Lebre"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Lebre"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Lebre"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Lebre"].CraftAmount = 1; item45["CaldoNoturno_Asksvin"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Asksvin"].RequiredItems.Add("AsksvinMeat", 2); item45["CaldoNoturno_Asksvin"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Asksvin"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Asksvin"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Asksvin"].CraftAmount = 1; item45["CaldoNoturno_Uruvul"].Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item45["CaldoNoturno_Uruvul"].RequiredItems.Add("VoltureMeat", 2); item45["CaldoNoturno_Uruvul"].RequiredItems.Add("GFG_LegumesPicados", 2); item45["CaldoNoturno_Uruvul"].RequiredItems.Add("SpiceMountains", 5); item45["CaldoNoturno_Uruvul"].RequiredItems.Add("SpicePlains", 5); item45["CaldoNoturno_Uruvul"].CraftAmount = 1; Item item46 = new Item("glitnircomidas", "GFG_PaoViagemCru"); item46.Name.English("Unbaked Waybread"); item46.Description.English("Dough for the journey."); item46.Name.Portuguese_Brazilian("Pão de Viagem Cru"); item46.Description.Portuguese_Brazilian("Massa para a jornada."); item46.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item46.RequiredItems.Add("BarleyFlour", 5); item46.RequiredItems.Add("GFG_FarinhaOsso", 5); item46.RequiredItems.Add("PowderedDragonEgg", 10); item46.CraftAmount = 2; Item item47 = new Item("glitnircomidas", "GFG_KrakenAssadoCru"); item47.Name.English("Unbaked Kraken"); item47.Description.English("Raw kraken ready for roasting."); item47.Name.Portuguese_Brazilian("Kraken Assado Cru"); item47.Description.Portuguese_Brazilian("Kraken cru pronto para assar."); item47.Crafting.Add(ItemManager.CraftingTable.PrepTable, 1); item47.RequiredItems.Add("GFG_TentaculoKraken", 1); item47.RequiredItems.Add("Sap", 1); item47.RequiredItems.Add("SpiceOceans", 3); item47.CraftAmount = 1; Item item48 = new Item("glitnircomidas", "GFG_PassaroDefumado"); item48.Name.English("Smoked Bird"); item48.Description.English("Delicate smoke-cured fowl."); item48.Name.Portuguese_Brazilian("Pássaro Defumado"); item48.Description.Portuguese_Brazilian("Ave delicada curada na fumaça."); Item item49 = new Item("glitnircomidas", "GFG_LagartoDefumado"); item49.Name.English("Smoked Neck"); item49.Description.English("Preserved in woodsmoke."); item49.Name.Portuguese_Brazilian("Lagarto Defumado"); item49.Description.Portuguese_Brazilian("Preservado em fumaça de madeira."); Item item50 = new Item("glitnircomidas", "GFG_JavaliDefumado"); item50.Name.English("Smoked Boar"); item50.Description.English("Savory and long-lasting."); item50.Name.Portuguese_Brazilian("Javali Defumado"); item50.Description.Portuguese_Brazilian("Saboroso e duradouro."); Item item51 = new Item("glitnircomidas", "GFG_CervoDefumado"); item51.Name.English("Smoked Deer"); item51.Description.English("Tender with a hint of oak."); item51.Name.Portuguese_Brazilian("Cervo Defumado"); item51.Description.Portuguese_Brazilian("Macio com um toque de carvalho."); Item item52 = new Item("glitnircomidas", "GFG_UrsoDefumado"); item52.Name.English("Smoked Bear"); item52.Description.English("Dense and flavorful."); item52.Name.Portuguese_Brazilian("Urso Defumado"); item52.Description.Portuguese_Brazilian("Denso e saboroso."); Item item53 = new Item("glitnircomidas", "GFG_PeixeDefumado"); item53.Name.English("Smoked Fish"); item53.Description.English("Delicate and flaky."); item53.Name.Portuguese_Brazilian("Peixe Defumado"); item53.Description.Portuguese_Brazilian("Delicado e escamoso."); Item item54 = new Item("glitnircomidas", "GFG_TrollDefumado"); item54.Name.English("Smoked Troll"); item54.Description.English("Surprisingly tender."); item54.Name.Portuguese_Brazilian("Troll Defumado"); item54.Description.Portuguese_Brazilian("Surpreendentemente macio."); Item item55 = new Item("glitnircomidas", "GFG_LoboDefumado"); item55.Name.English("Smoked Wolf"); item55.Description.English("Tough but flavorful."); item55.Name.Portuguese_Brazilian("Lobo Defumado"); item55.Description.Portuguese_Brazilian("Duro mas saboroso."); Item item56 = new Item("glitnircomidas", "GFG_PresuntoDefumado"); item56.Name.English("Smoked Ham"); item56.Description.English("Perfectly cured and aged."); item56.Name.Portuguese_Brazilian("Presunto Defumado"); item56.Description.Portuguese_Brazilian("Perfeitamente curado e envelhecido."); Item item57 = new Item("glitnircomidas", "GFG_LoxDefumado"); item57.Name.English("Smoked Lox"); item57.Description.English("A feast fit for a jarl."); item57.Name.Portuguese_Brazilian("Lox Defumado"); item57.Description.Portuguese_Brazilian("Um banquete digno de um jarl."); Item item58 = new Item("glitnircomidas", "GFG_FrangoDefumado"); item58.Name.English("Smoked Chicken"); item58.Description.English("Light and savory."); item58.Name.Portuguese_Brazilian("Frango Defumado"); item58.Description.Portuguese_Brazilian("Leve e saboroso."); Item item59 = new Item("glitnircomidas", "GFG_BuscadorDefumado"); item59.Name.English("Smoked Seeker"); item59.Description.English("Exotic smoked meat."); item59.Name.Portuguese_Brazilian("Buscador Defumado"); item59.Description.Portuguese_Brazilian("Carne defumada exótica."); Item item60 = new Item("glitnircomidas", "GFG_LebreDefumada"); item60.Name.English("Smoked Hare"); item60.Description.English("Tender and lean."); item60.Name.Portuguese_Brazilian("Lebre Defumada"); item60.Description.Portuguese_Brazilian("Macia e magra."); Item item61 = new Item("glitnircomidas", "GFG_AsksvinDefumado"); item61.Name.English("Smoked Asksvin"); item61.Description.English("Rich northern flavor."); item61.Name.Portuguese_Brazilian("Asksvin Defumado"); item61.Description.Portuguese_Brazilian("Sabor nórdico rico."); Item item62 = new Item("glitnircomidas", "GFG_UruvulDefumado"); item62.Name.English("Smoked Volture"); item62.Description.English("Dark and gamey."); item62.Name.Portuguese_Brazilian("Uruvul Defumado"); item62.Description.Portuguese_Brazilian("Escura e selvagem."); Item item63 = new Item("glitnircomidas", "GFG_MandibulosseaDefumada"); item63.Name.English("Smoked Bonemaw"); item63.Description.English("Serpent preserved in smoke."); item63.Name.Portuguese_Brazilian("Mandibulóssea Defumada"); item63.Description.Portuguese_Brazilian("Serpente preservada na fumaça."); Item item64 = new Item("glitnircomidas", "GFG_SerpenteDefumada"); item64.Name.English("Smoked Serpent"); item64.Description.English("Traditional sea bounty."); item64.Name.Portuguese_Brazilian("Serpente Defumada"); item64.Description.Portuguese_Brazilian("Fartura tradicional do mar."); Item item65 = new Item("glitnircomidas", "GFG_KrakenDefumado"); item65.Name.English("Smoked Kraken"); item65.Description.English("Legendary preserved tentacles."); item65.Name.Portuguese_Brazilian("Kraken Defumado"); item65.Description.Portuguese_Brazilian("Tentáculos lendários preservados."); Item item66 = new Item("glitnircomidas", "GFG_CenouraGlaceada"); item66.Name.English("Glazed Carrot"); item66.Description.English("Sweet and sticky."); item66.Name.Portuguese_Brazilian("Cenoura Glaceada"); item66.Description.Portuguese_Brazilian("Doce e pegajosa."); item66.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item66.RequiredItems.Add("Carrot", 2); item66.RequiredItems.Add("Honey", 1); item66.CraftAmount = 1; Item item67 = new Item("glitnircomidas", "GFG_SkauseFlorestaNegra"); item67.Name.English("Black Forest Skause"); item67.Description.English("Spiced broth from the dark woods."); item67.Name.Portuguese_Brazilian("Skause da Floresta Negra"); item67.Description.Portuguese_Brazilian("Caldo temperado das matas escuras."); item67.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item67.RequiredItems.Add("CookedMeat", 1); item67.RequiredItems.Add("GFG_MirtiloVermelho", 3); item67.RequiredItems.Add("Thistle", 1); item67.CraftAmount = 1; item67["SkauseFloresta_Cervo"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item67["SkauseFloresta_Cervo"].RequiredItems.Add("CookedDeerMeat", 1); item67["SkauseFloresta_Cervo"].RequiredItems.Add("GFG_MirtiloVermelho", 3); item67["SkauseFloresta_Cervo"].RequiredItems.Add("Thistle", 1); item67["SkauseFloresta_Cervo"].CraftAmount = 1; item67["SkauseFloresta_Lagarto"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item67["SkauseFloresta_Lagarto"].RequiredItems.Add("NeckTailGrilled", 1); item67["SkauseFloresta_Lagarto"].RequiredItems.Add("GFG_MirtiloVermelho", 3); item67["SkauseFloresta_Lagarto"].RequiredItems.Add("Thistle", 1); item67["SkauseFloresta_Lagarto"].CraftAmount = 1; item67["SkauseFloresta_Urso"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item67["SkauseFloresta_Urso"].RequiredItems.Add("CookedBjornMeat", 1); item67["SkauseFloresta_Urso"].RequiredItems.Add("GFG_MirtiloVermelho", 3); item67["SkauseFloresta_Urso"].RequiredItems.Add("Thistle", 1); item67["SkauseFloresta_Urso"].CraftAmount = 1; Item item68 = new Item("glitnircomidas", "GFG_EspetinhoFloresta"); item68.Name.English("Forest Skewer"); item68.Description.English("Mixed game on a stick."); item68.Name.Portuguese_Brazilian("Espetinho da Floresta"); item68.Description.Portuguese_Brazilian("Caça mista no espeto."); item68.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item68.RequiredItems.Add("DeerMeat", 1); item68.RequiredItems.Add("Mushroom", 1); item68.RequiredItems.Add("MushroomYellow", 1); item68.CraftAmount = 4; Item item69 = new Item("glitnircomidas", "GFG_GuisadoTroll"); item69.Name.English("Troll Stew"); item69.Description.English("Thick and wild.\n\nResistance to blunt damage for 10 minutes."); item69.Name.Portuguese_Brazilian("Guisado de Troll"); item69.Description.Portuguese_Brazilian("Espesso e selvagem.\n\nResistência a dano esmagador por 10 minutos."); item69.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item69.RequiredItems.Add("GFG_CarneTroll", 1); item69.RequiredItems.Add("Carrot", 1); item69.RequiredItems.Add("MushroomYellow", 1); item69.RequiredItems.Add("GFG_FarinhaOsso", 1); item69.CraftAmount = 1; Item item70 = new Item("glitnircomidas", "GFG_EspetinhoCogumelo"); item70.Name.English("Mushroom Skewer"); item70.Description.English("Grilled fungi delight."); item70.Name.Portuguese_Brazilian("Espetinho de Cogumelo"); item70.Description.Portuguese_Brazilian("Delícia de fungos grelhados."); item70.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item70.RequiredItems.Add("GFG_ChapeuNott", 2); item70.RequiredItems.Add("MushroomYellow", 1); item70.CraftAmount = 2; Item item71 = new Item("glitnircomidas", "GFG_EnsopadoJavali"); item71.Name.English("Boar Stew"); item71.Description.English("Hearty and filling.\n\n+5% eitr regeneration for 10 minutes."); item71.Name.Portuguese_Brazilian("Ensopado de Javali"); item71.Description.Portuguese_Brazilian("Nutritivo e satisfatório.\n\n+5% de regeneração de éter por 10 minutos."); item71.Crafting.Add(ItemManager.CraftingTable.Cauldron, 1); item71.RequiredItems.Add("RawMeat", 1); item71.RequiredItems.Add("GFG_ChapeuNott", 2); item71.RequiredItems.Add("Thistle", 1); item71.CraftAmount = 1; Item item72 = new Item("glitnircomidas", "GFG_CaldoOssos"); item72.Name.English("Bone Broth"); item72.Description.English("Rich with marrow."); item72.Name.Portuguese_Brazilian("Caldo de Ossos"); item72.Description.Portuguese_Brazilian("Rico em medula."); item72.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item72.RequiredItems.Add("BoneFragments", 4); item72.RequiredItems.Add("Carrot", 2); item72.RequiredItems.Add("Thistle", 1); item72.CraftAmount = 1; Item item73 = new Item("glitnircomidas", "GFG_CaldoCorvo"); item73.Name.English("Raven's Broth"); item73.Description.English("Dark and fortifying."); item73.Name.Portuguese_Brazilian("Caldo de Corvo"); item73.Description.Portuguese_Brazilian("Escuro e fortificante."); item73.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item73.RequiredItems.Add("GFG_CarnePassaro", 1); item73.RequiredItems.Add("Entrails", 3); item73.RequiredItems.Add("GFG_FarinhaOsso", 3); item73.RequiredItems.Add("Turnip", 1); item73.CraftAmount = 1; Item item74 = new Item("glitnircomidas", "GFG_EnsopadoLagarto"); item74.Name.English("Neck Stew"); item74.Description.English("Simple sustenance.\n\n+5% stamina regeneration for 10 minutes."); item74.Name.Portuguese_Brazilian("Ensopado de Lagarto"); item74.Description.Portuguese_Brazilian("Sustento simples.\n\n+5% de regeneração de vigor por 10 minutos."); item74.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item74.RequiredItems.Add("NeckTail", 1); item74.RequiredItems.Add("MushroomYellow", 1); item74.RequiredItems.Add("GFG_ChapeuNott", 2); item74.RequiredItems.Add("Thistle", 1); item74.CraftAmount = 1; Item item75 = new Item("glitnircomidas", "GFG_CaldoSangrento"); item75.Name.English("Blood Broth"); item75.Description.English("Iron-rich and potent."); item75.Name.Portuguese_Brazilian("Caldo Sangrento"); item75.Description.Portuguese_Brazilian("Rico em ferro e potente."); item75.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item75.RequiredItems.Add("Bloodbag", 2); item75.RequiredItems.Add("Entrails", 1); item75.RequiredItems.Add("Turnip", 1); item75.RequiredItems.Add("Thistle", 2); item75.CraftAmount = 1; Item item76 = new Item("glitnircomidas", "GFG_BlodPolse"); item76.Name.English("Blodpølse"); item76.Description.English("Blood sausage, a traveler's staple."); item76.Name.Portuguese_Brazilian("Blodpølse"); item76.Description.Portuguese_Brazilian("Linguiça de sangue, alimento básico do viajante."); item76.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item76.RequiredItems.Add("Entrails", 6); item76.RequiredItems.Add("Bloodbag", 2); item76.RequiredItems.Add("GFG_FarinhaOsso", 3); item76.RequiredItems.Add("Thistle", 1); item76.CraftAmount = 6; Item item77 = new Item("glitnircomidas", "GFG_SopaEctoplasma"); item77.Name.English("Ectoplasm Soup"); item77.Description.English("Ghostly essence in broth form."); item77.Name.Portuguese_Brazilian("Sopa de Ectoplasma"); item77.Description.Portuguese_Brazilian("Essência fantasmagórica em forma de caldo."); item77.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item77.RequiredItems.Add("Ectoplasm", 1); item77.RequiredItems.Add("GreydwarfEye", 1); item77.RequiredItems.Add("Honey", 2); item77.RequiredItems.Add("Thistle", 1); item77.CraftAmount = 1; Item item78 = new Item("glitnircomidas", "GFG_EnsopadoLuaDeSangue"); item78.Name.English("Bloodmoon Stew"); item78.Description.English("Rare and powerful."); item78.Name.Portuguese_Brazilian("Ensopado da Lua de Sangue"); item78.Description.Portuguese_Brazilian("Raro e poderoso."); item78.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item78.RequiredItems.Add("Fish4_cave", 1); item78.RequiredItems.Add("Bloodbag", 2); item78.RequiredItems.Add("Onion", 2); item78.RequiredItems.Add("Ectoplasm", 1); item78.CraftAmount = 1; item78.DropsFrom.Add("Fenring_Cultist", 0.2f); Item item79 = new Item("glitnircomidas", "GFG_SopaLegumes"); item79.Name.English("Vegetable Soup"); item79.Description.English("Warm and comforting."); item79.Name.Portuguese_Brazilian("Sopa de Legumes"); item79.Description.Portuguese_Brazilian("Quente e reconfortante."); item79.Crafting.Add(ItemManager.CraftingTable.Cauldron, 2); item79.RequiredItems.Add("GFG_LegumesPicados", 1); item79.RequiredItems.Add("GFG_ChapeuNott", 1); item79.CraftAmount = 1; Item item80 = new Item("glitnircomidas", "GFG_PanelinhaMontanhesa"); item80.Name.English("Mountaineer Hotpot"); item80.Description.English("Warming for high altitudes.\n\n-15% stamina used to jump for 15 minutes."); item80.Name.Portuguese_Brazilian("Panelinha Montanhesa"); item80.Description.Portuguese_Brazilian("Aquecimento para grandes altitudes.\n\n-15% de uso de vigor para pular por 15 minutos."); item80.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item80.RequiredItems.Add("WolfMeat", 1); item80.RequiredItems.Add("GFG_LegumesPicados", 1); item80.RequiredItems.Add("WolfHairBundle", 1); item80.RequiredItems.Add("GFG_FarinhaOsso", 2); item80.CraftAmount = 1; Item item81 = new Item("glitnircomidas", "GFG_SkauseYdalir"); item81.Name.English("Ýdalir Skause"); item81.Description.English("Hunter's broth from the peaks."); item81.Name.Portuguese_Brazilian("Skause de Ýdalir"); item81.Description.Portuguese_Brazilian("Caldo do caçador dos picos."); item81.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item81.RequiredItems.Add("WolfMeat", 1); item81.RequiredItems.Add("GFG_LegumesPicados", 1); item81.RequiredItems.Add("Dandelion", 2); item81.CraftAmount = 1; Item item82 = new Item("glitnircomidas", "GFG_EnsopadoCacador"); item82.Name.English("Hunter's Stew"); item82.Description.English("Mixed game in rich gravy.\n\n+15% pirce damage for 15 minutes."); item82.Name.Portuguese_Brazilian("Ensopado do Caçador"); item82.Description.Portuguese_Brazilian("Caça mista em molho rico.\n\n+15% de dano perfurante por 15 minutos."); item82.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item82.RequiredItems.Add("DeerMeat", 1); item82.RequiredItems.Add("WolfMeat", 1); item82.RequiredItems.Add("GFG_LegumesPicados", 1); item82.RequiredItems.Add("WolfFang", 2); item82.CraftAmount = 1; Item item83 = new Item("glitnircomidas", "GFG_PresuntoJavali"); item83.Name.English("Boar Ham"); item83.Description.English("Salted and aged."); item83.Name.Portuguese_Brazilian("Presunto de Javali"); item83.Description.Portuguese_Brazilian("Salgado e curado."); item83.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item83.RequiredItems.Add("RawMeat", 1); item83.RequiredItems.Add("PowderedDragonEgg", 2); item83.RequiredItems.Add("Thistle", 1); item83.CraftAmount = 1; Item item84 = new Item("glitnircomidas", "GFG_EnsopadoBrilhante"); item84.Name.English("Gleaming Stew"); item84.Description.English("Shimmers with crystal essence."); item84.Name.Portuguese_Brazilian("Ensopado Brilhante"); item84.Description.Portuguese_Brazilian("Cintila com essência de cristal."); item84.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item84.RequiredItems.Add("GFG_ChapeuNott", 3); item84.RequiredItems.Add("Crystal", 1); item84.RequiredItems.Add("PowderedDragonEgg", 2); item84.CraftAmount = 1; Item item85 = new Item("glitnircomidas", "GFG_MingauCaçadorAsas"); item85.Name.English("Wingcatcher Porridge"); item85.Description.English("Thick and sustaining."); item85.Name.Portuguese_Brazilian("Mingau do Caçador de Asas"); item85.Description.Portuguese_Brazilian("Espesso e sustentador."); item85.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item85.RequiredItems.Add("GFG_CarnePassaroCozida", 2); item85.RequiredItems.Add("GFG_LegumesPicados", 1); item85.RequiredItems.Add("Barley", 6); item85.CraftAmount = 1; Item item86 = new Item("glitnircomidas", "GFG_PotagemGuerreiros"); item86.Name.English("Warrior's Pottage"); item86.Description.English("Fuel for battle.\n\n-15% stamina used to attack for 15 minutes."); item86.Name.Portuguese_Brazilian("Potagem dos Guerreiros"); item86.Description.Portuguese_Brazilian("Combustível para a batalha.\n\n-15% de uso de vigor para atacar por 15 minutos."); item86.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item86.RequiredItems.Add("LoxMeat", 1); item86.RequiredItems.Add("GFG_LegumesPicados", 1); item86.RequiredItems.Add("WolfFang", 4); item86.CraftAmount = 1; item86["PotagemGuerreiros_Troll"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item86["PotagemGuerreiros_Troll"].RequiredItems.Add("GFG_CarneTroll", 1); item86["PotagemGuerreiros_Troll"].RequiredItems.Add("GFG_LegumesPicados", 1); item86["PotagemGuerreiros_Troll"].RequiredItems.Add("WolfFang", 4); item86["PotagemGuerreiros_Troll"].CraftAmount = 1; Item item87 = new Item("glitnircomidas", "GFG_EnsopadoJarnbjorn"); item87.Name.English("Járnbjörn Stew"); item87.Description.English("Bear meat fit for champions.\n\n+25% adrenaline gain for 15 minutes."); item87.Name.Portuguese_Brazilian("Ensopado Járnbjörn"); item87.Description.Portuguese_Brazilian("Carne de urso digna de campeões.\n\n+25% de ganho de adrenalina por 15 minutos."); item87.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item87.RequiredItems.Add("BjornMeat", 2); item87.RequiredItems.Add("GFG_LegumesPicados", 1); item87.RequiredItems.Add("GFG_FarinhaOsso", 1); item87.RequiredItems.Add("FreshSeaweed", 3); item87.CraftAmount = 1; Item item88 = new Item("glitnircomidas", "GFG_CaldoEsquilo"); item88.Name.English("Squirrel Broth"); item88.Description.English("Light but nourishing."); item88.Name.Portuguese_Brazilian("Caldo de Esquilo"); item88.Description.Portuguese_Brazilian("Leve mas nutritivo."); item88.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item88.RequiredItems.Add("CuredSquirrelHamstring", 3); item88.RequiredItems.Add("GFG_ChapeuNott", 2); item88.RequiredItems.Add("SpiceForests", 2); item88.CraftAmount = 1; Item item89 = new Item("glitnircomidas", "GFG_EnsopadoLagartoCevada"); item89.Name.English("Neck and Barley Stew"); item89.Description.English("Humble and filling."); item89.Name.Portuguese_Brazilian("Ensopado de Lagarto e Cevada"); item89.Description.Portuguese_Brazilian("Humilde e satisfatório."); item89.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item89.RequiredItems.Add("GFG_LagartoDefumado", 2); item89.RequiredItems.Add("Barley", 2); item89.RequiredItems.Add("Onion", 1); item89.RequiredItems.Add("PowderedDragonEgg", 4); item89.CraftAmount = 1; Item item90 = new Item("glitnircomidas", "GFG_EspetinhoBuscador"); item90.Name.English("Crispy Seeker Skewer"); item90.Description.English("Crunchy and exotic."); item90.Name.Portuguese_Brazilian("Espetinho Crocante de Buscador"); item90.Description.Portuguese_Brazilian("Crocante e exótico."); item90.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item90.RequiredItems.Add("BugMeat", 1); item90.RequiredItems.Add("GFG_LegumesPicados", 2); item90.CraftAmount = 2; Item item91 = new Item("glitnircomidas", "GFG_CremeBastarde"); item91.Name.English("Bastarde Cream"); item91.Description.English("Sweet and smooth."); item91.Name.Portuguese_Brazilian("Creme Bastarde"); item91.Description.Portuguese_Brazilian("Doce e suave."); item91.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item91.RequiredItems.Add("GFG_LeiteLox", 1); item91.RequiredItems.Add("ChickenEgg", 1); item91.RequiredItems.Add("Honey", 1); item91.RequiredItems.Add("Raspberry", 4); item91.CraftAmount = 1; Item item92 = new Item("glitnircomidas", "GFG_MingauAventureiro"); item92.Name.English("Adventurer's Porridge"); item92.Description.English("Keeps you going."); item92.Name.Portuguese_Brazilian("Mingau dos Aventureiros"); item92.Description.Portuguese_Brazilian("Mantém você em movimento."); item92.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item92.RequiredItems.Add("GFG_SopaLegumes", 1); item92.RequiredItems.Add("MushroomMagecap", 1); item92.RequiredItems.Add("Barley", 4); item92.RequiredItems.Add("Thistle", 1); item92.CraftAmount = 1; Item item93 = new Item("glitnircomidas", "GFG_GuisadoHaldor"); item93.Name.English("Haldor's Troll Stew"); item93.Description.English("Merchant's secret recipe.\n\n-15% stamina used to dodge for 15 minutes."); item93.Name.Portuguese_Brazilian("Guisado de Troll do Haldor"); item93.Description.Portuguese_Brazilian("Receita secreta do mercador.\n\n-15% de uso de vigor para esquivar por 15 minutos."); item93.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item93.RequiredItems.Add("GFG_CarneTrollCozida", 1); item93.RequiredItems.Add("GFG_LegumesPicados", 1); item93.RequiredItems.Add("SpicePlains", 2); item93.CraftAmount = 1; Item item94 = new Item("glitnircomidas", "GFG_Blodplattar"); item94.Name.English("Blodplättar"); item94.Description.English("Blood pancakes, surprisingly sweet."); item94.Name.Portuguese_Brazilian("Blodplättar"); item94.Description.Portuguese_Brazilian("Panquecas de sangue, surpreendentemente doces."); item94.Crafting.Add(ItemManager.CraftingTable.Cauldron, 4); item94.RequiredItems.Add("GiantBloodSack", 2); item94.RequiredItems.Add("BarleyFlour", 4); item94.RequiredItems.Add("Honey", 1); item94.RequiredItems.Add("Blueberries", 2); item94.CraftAmount = 2; Item item95 = new Item("glitnircomidas", "GFG_BuscadorFlambado"); item95.Name.English("Flambéed Seeker Meat"); item95.Description.English("Charred to perfection.\n\n+20% health, stamina and eitr regeneration for 15 minutes."); item95.Name.Portuguese_Brazilian("Carne de Buscador Flambada"); item95.Description.Portuguese_Brazilian("Chamuscada à perfeição.\n\n+20% de regeneração de vida, vigor e éter por 15 minutos."); item95.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item95.RequiredItems.Add("BugMeat", 1); item95.RequiredItems.Add("MushroomMagecap", 2); item95.RequiredItems.Add("Sap", 1); item95.RequiredItems.Add("GFG_HidromelDvergr", 4); item95.CraftAmount = 1; Item item96 = new Item("glitnircomidas", "GFG_FondueMistico"); item96.Name.English("Mystic Fondue"); item96.Description.English("Cheese from beyond the mists."); item96.Name.Portuguese_Brazilian("Fondue Místico"); item96.Description.Portuguese_Brazilian("Queijo de além das névoas."); item96.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item96.RequiredItems.Add("GFG_QueijoLox", 1); item96.RequiredItems.Add("MushroomJotunPuffs", 2); item96.RequiredItems.Add("FreshSeaweed", 3); item96.RequiredItems.Add("GFG_HidromelDvergr", 1); item96.CraftAmount = 2; Item item97 = new Item("glitnircomidas", "GFG_Rommegrot"); item97.Name.English("Rømmegrøt"); item97.Description.English("Creamy porridge from the north."); item97.Name.Portuguese_Brazilian("Rømmegrøt"); item97.Description.Portuguese_Brazilian("Mingau cremoso do norte."); item97.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item97.RequiredItems.Add("BarleyFlour", 4); item97.RequiredItems.Add("Honey", 2); item97.RequiredItems.Add("GFG_LeiteLox", 1); item97.RequiredItems.Add("AskBladder", 1); item97.CraftAmount = 1; Item item98 = new Item("glitnircomidas", "GFG_CaldoMandibulossea"); item98.Name.English("Bonemaw Broth"); item98.Description.English("Rich with serpent essence."); item98.Name.Portuguese_Brazilian("Caldo de Mandibulóssea"); item98.Description.Portuguese_Brazilian("Rico em essência de serpente."); item98.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item98.RequiredItems.Add("BoneMawSerpentMeat", 1); item98.RequiredItems.Add("MushroomSmokePuff", 1); item98.RequiredItems.Add("Onion", 2); item98.RequiredItems.Add("SpiceOceans", 4); item98.CraftAmount = 1; Item item99 = new Item("glitnircomidas", "GFG_EnsopadoVaregue"); item99.Name.English("Varangian Stew"); item99.Description.English("Hardy fare from distant lands."); item99.Name.Portuguese_Brazilian("Ensopado Varegue"); item99.Description.Portuguese_Brazilian("Alimento robusto de terras distantes."); item99.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item99.RequiredItems.Add("AsksvinMeat", 1); item99.RequiredItems.Add("Fiddleheadfern", 2); item99.RequiredItems.Add("AskBladder", 1); item99.RequiredItems.Add("Thistle", 2); item99.CraftAmount = 1; Item item100 = new Item("glitnircomidas", "GFG_EnsopadoYggdrasil"); item100.Name.English("Yggdrasil's Fiery Stew"); item100.Description.English("Burns with primal heat."); item100.Name.Portuguese_Brazilian("Ensopado Ardente de Yggdrasil"); item100.Description.Portuguese_Brazilian("Queima com calor primordial."); item100.Crafting.Add(ItemManager.CraftingTable.Cauldron, 5); item100.RequiredItems.Add("Fiddleheadfern", 1); item100.RequiredItems.Add("Sap", 2); item100.RequiredItems.Add("SulfurStone", 1); item100.RequiredItems.Add("ProustitePowder", 1); item100.CraftAmount = 1; Item item101 = new Item("glitnircomidas", "GFG_PreparadoRunico"); item101.Name.English("Runemaster's Brew"); item101.Description.English("Infused with ancient power.\n\n+15% elemental damage for 15 minutes."); item101.Name.Portuguese_Brazilian("Preparado do Mestre das Runas"); item101.Description.Portuguese_Brazilian("Infundido com poder antigo.\n\n+15% de dano elemental por 15 minutos."); item101.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item101.RequiredItems.Add("Ectoplasma", 1); item101.RequiredItems.Add("Sap", 2); item101.RequiredItems.Add("Root", 2); item101.RequiredItems.Add("YmirRemains", 2); item101.CraftAmount = 1; Item item102 = new Item("glitnircomidas", "GFG_EnsopadoSalmao"); item102.Name.English("Salmon Stew"); item102.Description.English("Pink and tender."); item102.Name.Portuguese_Brazilian("Ensopado de Salmão"); item102.Description.Portuguese_Brazilian("Rosa e macio."); item102.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item102.RequiredItems.Add("Fish10", 1); item102.RequiredItems.Add("GFG_LegumesPicados", 2); item102.RequiredItems.Add("Sap", 2); item102.RequiredItems.Add("GFG_LeiteLox", 1); item102.CraftAmount = 1; Item item103 = new Item("glitnircomidas", "GFG_EnsopadoGardariki"); item103.Name.English("Gardariki Stew"); item103.Description.English("Eastern spices meet northern meat."); item103.Name.Portuguese_Brazilian("Ensopado de Gardariki"); item103.Description.Portuguese_Brazilian("Especiarias orientais encontram carne nórdica."); item103.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item103.RequiredItems.Add("Fish10", 1); item103.RequiredItems.Add("GFG_FarinhaOsso", 2); item103.RequiredItems.Add("Eitr", 1); item103.RequiredItems.Add("SpiceOceans", 2); item103.CraftAmount = 1; Item item104 = new Item("glitnircomidas", "GFG_RaguNorteProfundo"); item104.Name.English("Deep North Ragout"); item104.Description.English("Thick with frozen bounty."); item104.Name.Portuguese_Brazilian("Ragu do Norte Profundo"); item104.Description.Portuguese_Brazilian("Espesso com a fartura congelada."); item104.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item104.RequiredItems.Add("Fish10", 1); item104.RequiredItems.Add("MushroomMagecap", 4); item104.RequiredItems.Add("GFG_MirtiloVermelho", 2); item104.CraftAmount = 1; Item item105 = new Item("glitnircomidas", "GFG_EnsopadoJomsviking"); item105.Name.English("Jomsviking Stew"); item105.Description.English("Warrior's feast from the sea."); item105.Name.Portuguese_Brazilian("Ensopado Jomsviking"); item105.Description.Portuguese_Brazilian("Banquete de guerreiro do mar."); item105.Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105.RequiredItems.Add("Fish8", 1); item105.RequiredItems.Add("GFG_LegumesPicados", 1); item105.RequiredItems.Add("Thistle", 1); item105.CraftAmount = 1; item105["EnsopadoJomsviking_Atum"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Atum"].RequiredItems.Add("Fish3", 1); item105["EnsopadoJomsviking_Atum"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Atum"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Atum"].CraftAmount = 1; item105["EnsopadoJomsviking_Baiacu"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Baiacu"].RequiredItems.Add("Fish12", 1); item105["EnsopadoJomsviking_Baiacu"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Baiacu"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Baiacu"].CraftAmount = 1; item105["EnsopadoJomsviking_Perca"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Perca"].RequiredItems.Add("Fish1", 2); item105["EnsopadoJomsviking_Perca"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Perca"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Perca"].CraftAmount = 1; item105["EnsopadoJomsviking_Lucio"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Lucio"].RequiredItems.Add("Fish2", 2); item105["EnsopadoJomsviking_Lucio"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Lucio"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Lucio"].CraftAmount = 1; item105["EnsopadoJomsviking_PeixeTroll"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_PeixeTroll"].RequiredItems.Add("Fish5", 2); item105["EnsopadoJomsviking_PeixeTroll"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_PeixeTroll"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_PeixeTroll"].CraftAmount = 1; item105["EnsopadoJomsviking_Arenque"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Arenque"].RequiredItems.Add("Fish6", 1); item105["EnsopadoJomsviking_Arenque"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Arenque"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Arenque"].CraftAmount = 1; item105["EnsopadoJomsviking_Garoupa"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Garoupa"].RequiredItems.Add("Fish7", 1); item105["EnsopadoJomsviking_Garoupa"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Garoupa"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Garoupa"].CraftAmount = 1; item105["EnsopadoJomsviking_Pescador"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Pescador"].RequiredItems.Add("Fish9", 1); item105["EnsopadoJomsviking_Pescador"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Pescador"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Pescador"].CraftAmount = 1; item105["EnsopadoJomsviking_Magma"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Magma"].RequiredItems.Add("Fish11", 1); item105["EnsopadoJomsviking_Magma"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Magma"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Magma"].CraftAmount = 1; item105["EnsopadoJomsviking_Salmao"].Crafting.Add(ItemManager.CraftingTable.Cauldron, 3); item105["EnsopadoJomsviking_Salmao"].RequiredItems.Add("Fish10", 1); item105["EnsopadoJomsviking_Salmao"].RequiredItems.Add("GFG_LegumesPicados", 1); item105["EnsopadoJomsviking_Salmao"].RequiredItems.Add("Thistle", 1); item105["EnsopadoJomsviking_Salmao"].CraftAmount = 1; Item item106 = new Item("glitnircomidas", "GFG_CaldoHafgufa"); item106.Name.English("Hafgufa Stew"); item106.Description.English("Island-whale essence.\n\nRestores 2 points of stamina per second for 20 minutes."); item106.Name.Portuguese_Brazilian("Caldo de Hafgufa"); item106.Description.Portuguese_Brazilian("Essência de baleia-ilha.\n\nRestaura 2 de vigor por segundo por 20 minutos."); item106.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item106.RequiredItems.Add("SerpentMeat", 1); item106.RequiredItems.Add("Chitin", 1); item106.RequiredItems.Add("GFG_LegumesPicados", 2); item106.RequiredItems.Add("SpiceOceans", 8); item106.CraftAmount = 1; Item item107 = new Item("glitnircomidas", "GFG_EnsopadoReiDosMares"); item107.Name.English("Sea King Stew"); item107.Description.English("Royalty in a bowl.\n\nRestores 2 points of health per second for 20 minutes."); item107.Name.Portuguese_Brazilian("Ensopado do Rei dos Mares"); item107.Description.Portuguese_Brazilian("Realeza em uma tigela.\n\nRestaura 2 de vida por segundo por 20 minutos."); item107.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item107.RequiredItems.Add("GFG_TentaculoKraken", 1); item107.RequiredItems.Add("SerpentMeat", 2); item107.RequiredItems.Add("Sap", 1); item107.RequiredItems.Add("SpiceOceans", 8); item107.CraftAmount = 1; Item item108 = new Item("glitnircomidas", "GFG_CaldoLyngbakr"); item108.Name.English("Lyngbakr Broth"); item108.Description.English("Beast of legend in broth.\n\nRestores 2 points of eitr per second for 20 minutes."); item108.Name.Portuguese_Brazilian("Caldo de Lyngbakr"); item108.Description.Portuguese_Brazilian("Besta lendária em caldo.\n\nRestaura 2 de éter por segundo por 20 minutos."); item108.Crafting.Add(ItemManager.CraftingTable.Cauldron, 6); item108.RequiredItems.Add("GFG_TentaculoKraken", 1); item108.RequiredItems.Add("MushroomMagecap", 4); item108.RequiredItems.Add("GFG_LeiteLox", 1); item108.RequiredItems.Add("SpiceOceans", 8); item108.CraftAmount = 1; Item item109 = new Item("glitnircomidas", "GFG_BanqueteForseti"); item109.Name.English("Glitnir's Table of Plenty"); item109.Description.English("A balanced and fair banquet in the hall of Forseti. In Glitnir, no conflict can arise as long as food is shared according to its golden laws."); item109.Name.Portuguese_Brazilian("Mesa de Fartura de Glitnir"); item109.Description.Portuguese_Brazilian("Banquete equilibrado e justo do salão de Forseti. Em Glitnir, nenhum conflito pode surgir enquanto a comida for compartilhada sob suas leis douradas."); Item item110 = new Item("glitnircomidas", "GFG_BanqueteForseti_Mat"); item110.Name.English("Glitnir Feast Materials"); item110.Description.English("A balanced and fair banquet in the hall of Forseti. In Glitnir, no conflict can arise as long as food is shared according to its golden laws."); item110.Name.Portuguese_Brazilian("Materiais do Banquete de Glitnir"); item110.Description.Portuguese_Brazilian("Banquete equilibrado e justo do salão de Forseti. Em Glitnir, nenhum conflito pode surgir enquanto a comida for compartilhada sob suas leis douradas."); item110.Crafting.Add("GFG_Eldhrimnir", 1); item110.RequiredItems.Add("GFG_EnsopadoJarnbjorn", 3); item110.RequiredItems.Add("SerpentMeat", 2); item110.RequiredItems.Add("FishRaw", 6); item110.RequiredItems.Add("SpicePlains", 10); item110.CraftAmount = 1; Item item111 = new Item("glitnircomidas", "GFG_BanqueteNott"); item111.Name.English("Náttmál of the Dark Mother"); item111.Description.English("A feast served under the cloak of Nótt, the primordial goddess of the night. Prepared only when Dagr yields her place in the sky."); item111.Name.Portuguese_Brazilian("Náttmál da Mãe das Trevas"); item111.Description.Portuguese_Brazilian("Banquete servido sob o manto de Nótt, a primordial deusa da noite. Preparado apenas quando Dagr cede seu lugar no céu."); Item item112 = new Item("glitnircomidas", "GFG_BanqueteNott_Mat"); item112.Name.English("Náttmál Feast Materials"); item112.Description.English("A feast served under the cloak of Nótt, the primordial goddess of the night. Prepared only when Dagr yields her place in the sky."); item112.Name.Portuguese_Brazilian("Materiais do Náttmál"); item112.Description.Portuguese_Brazilian("Banquete servido sob o manto de Nótt, a primordial deusa da noite. Preparado apenas quando Dagr cede seu lugar no céu."); item112.Crafting.Add("GFG_Eldhrimnir", 1); item112.RequiredItems.Add("GFG_CaldoEsquilo", 3); item112.RequiredItems.Add("GFG_SkauseFlorestaNegra", 3); item112.RequiredItems.Add("SpicePlains", 10); item112.CraftAmount = 1; Item item113 = new Item("glitnircomidas", "GFG_BanqueteLeo"); item113.Name.English("Royal Feast of Pandherya"); item113.Description.English("A feast fit for the great kings of the east. Leo, the ruler of Pandherya, was known for his lavish halls where no warrior left hungry."); item113.Name.Portuguese_Brazilian("Banquete Real de Pandherya"); item113.Description.Portuguese_Brazilian("Festim digno dos grandes reis do leste. Léo, o Governante de Pandherya, era conhecido por seus salões fartos onde nenhum guerreiro partia com fome."); Item item114 = new Item("glitnircomidas", "GFG_BanqueteLeo_Mat"); item114.Name.English("Pandherya Feast Materials"); item114.Description.English("A feast fit for the great kings of the east. Leo, the ruler of Pandherya, was known for his lavish halls where no warrior left hungry."); item114.Name.Portuguese_Brazilian("Materiais do Banquete de Pandherya"); item114.Description.Portuguese_Brazilian("Festim digno dos grandes reis do leste. Léo, o Governante de Pandherya, era conhecido por seus salões fartos onde nenhum guerreiro partia com fome."); item114.Crafting.Add("GFG_Eldhrimnir", 1); item114.RequiredItems.Add("GFG_MingauAventureiro", 3); item114.RequiredItems.Add("GFG_Blodplattar", 3); item114.RequiredItems.Add("SeekerAspic", 1); item114.RequiredItems.Add("SpiceMistlands", 10); item114.CraftAmount = 1; Item item115 = new Item("glitnircomidas", "GFG_BanqueteBia"); item115.Name.English("Bia's Enchanted Cauldron"); item115.Description.English("A cauldron enchanted by the völva Bia. This dish carries ancient runes that strengthen body and spirit, like the spells of the seiðkonur."); item115.Name.Portuguese_Brazilian("Caldeirão Encantado de Bia"); item115.Description.Portuguese_Brazilian("Um caldeirão encantado pela völva Bia. Este prato carrega runas antigas que fortalecem corpo e espírito, como os feitiços das seiðkonur."); Item item116 = new Item("glitnircomidas", "GFG_BanqueteBia_Mat"); item116.Name.English("Bia Feast Materials"); item116.Description.English("A cauldron enchanted by the völva Bia. This dish carries ancient runes that strengthen body and spirit, like the spells of the seiðkonur."); item116.Name.Portuguese_Brazilian("Materiais do Banquete de Bia"); item116.Description.Portuguese_Brazilian("Um caldeirão encantado pela völva Bia. Este prato carrega runas antigas que fortalecem corpo e espírito, como os feitiços das seiðkonur."); item116.Crafting.Add("GFG_Eldhrimnir", 1); item116.RequiredItems.Add("GFG_SopaEctoplasma", 4); item116.RequiredItems.Add("YmirRemains", 6); item116.RequiredItems.Add("SpiceMistlands", 10); item116.CraftAmount = 1; Item item117 = new Item("glitnircomidas", "GFG_BanqueteMorgnar"); item117.Name.English("Morgnar Hall Feast"); item117.Description.English("A feast accompanied by ancient sagas and songs of heroes. Jarl Morgnar recited while the warriors drank and reminisced about great deeds."); item117.Name.Portuguese_Brazilian("Banquete do Salão de Morgnar"); item117.Description.Portuguese_Brazilian("Festim acompanhado de sagas antigas e canções de heróis. O jarl Morgnar recitava enquanto os guerreiros bebiam e relembravam grandes feitos."); Item item118 = new Item("glitnircomidas", "GFG_BanqueteMorgnar_Mat"); item118.Name.English("Morgnar Feast Materials"); item118.Description.English("A feast accompanied by ancient sagas and songs of heroes. Jarl Morgnar recited while the warriors drank and reminisced about great deeds."); item118.Name.Portuguese_Brazilian("Materiais do Banquete de Morgnar"); item118.Description.Portuguese_Brazilian("Festim acompanhado de sagas antigas e canções de heróis. O jarl Morgnar recitava enquanto os guerreiros bebiam e relembravam grandes feitos."); item118.Crafting.Add("GFG_Eldhrimnir", 1); item118.RequiredItems.Add("GFG_EnsopadoVaregue", 3); item118.RequiredItems.Add("GFG_PresuntoJavali", 3); item118.RequiredItems.Add("GFG_PaoViagem", 2); item118.RequiredItems.Add("SpiceAshlands", 10); item118.CraftAmount = 1; Item item119 = new Item("glitnircomidas", "GFG_BanqueteRadamanto"); item119.Name.English("Runic Barrel of Master Radamanthus"); item119.Description.English("Dark mead marked with runes of judgment. Rhadamanthus weighs the souls of those who drink it—only the worthy emerge unscathed."); item119.Name.Portuguese_Brazilian("Barril Rúnico do Mestre Radamanto"); item119.Description.Portuguese_Brazilian("Hidromel sombrio marcado com runas de julgamento. Radamanto pesa as almas dos que bebem — apenas os dignos saem ilesos."); Item item120 = new Item("glitnircomidas", "GFG_BanqueteRadamanto_Mat"); item120.Name.English("Radamanthus Feast Materials"); item120.Description.English("Dark mead marked with runes of judgment. Rhadamanthus weighs the souls of those who drink it—only the worthy emerge unscathed."); item120.Name.Portuguese_Brazilian("Materiais do Banquete de Radamanto"); item120.Description.Portuguese_Brazilian("Hidromel sombrio marcado com runas de julgamento. Radamanto pesa as almas dos que bebem — apenas os dignos saem ilesos."); item120.Crafting.Add("GFG_Eldhrimnir", 1); item120.RequiredItems.Add("GFG_PreparadoRunico", 3); item120.RequiredItems.Add("SpiceAshlands", 10); item120.CraftAmount = 1; Item item121 = new Item("glitnircomidas", "GFG_BanqueteRagnar"); item121.Name.English("Dagmál of the Dragon Slayer"); item121.Description.English("A meal for those who faced Fáfnir and lived to tell the tale. Ragnar Loðbrók killed serpents in his cradle; this feast honors his courage."); item121.Name.Portuguese_Brazilian("Dagmál do Matador de Dragões"); item121.Description.Portuguese_Brazilian("Refeição dos que enfrentaram Fáfnir e viveram para contar. Ragnar Loðbrók matou serpentes em seu berço; este banquete honra sua coragem."); Item item122 = new Item("glitnircomidas", "GFG_BanqueteRagnar_Mat"); item122.Name.English("Ragnar Feast Materials"); item122.Description.English("A meal for those who faced Fáfnir and lived to tell the tale. Ragnar Loðbrók killed serpents in his cradle; this feast honors his courage."); item122.Name.Portuguese_Brazilian("Materiais do Dagmál de Ragnar"); item122.Description.Portuguese_Brazilian("Refeição dos que enfrentaram Fáfnir e viveram para contar. Ragnar Loðbrók matou serpentes em seu berço; este banquete honra sua coragem."); item122.Crafting.Add("GFG_Eldhrimnir", 1); item122.RequiredItems.Add("GFG_EnsopadoSalmao", 3); item122.RequiredItems.Add("GFG_EnsopadoGardariki", 2); item122.RequiredItems.Add("SpiceMistlands", 10); item122.CraftAmount = 1; Item item123 = new Item("glitnircomidas", "GFG_BanqueteDorn"); item123.Name.English("Celebration of the Thorned Guardian"); item123.Description.English("A fortifying feast prepared by Dorn, the protector. Like the thorns that guard Glitnir, this dish protects those who consume it."); item123.Name.Portuguese_Brazilian("Celebração do Guardião Espinhoso"); item123.Description.Portuguese_Brazilian("Banquete fortificante preparado por Dorn, o protetor. Como os espinhos que guardam Glitnir, este prato defende aqueles que o consomem."); Item item124 = new Item("glitnircomidas", "GFG_BanqueteDorn_Mat"); item124.Name.English("Dorn Feast Materials"); item124.Description.English("A fortifying feast prepared by Dorn, the protector. Like the thorns that guard Glitnir, this dish protects those who consume it."); item124.Name.Portuguese_Brazilian("Materiais da Celebração de Dorn"); item124.Description.Portuguese_Brazilian("Banquete fortificante preparado por Dorn, o protetor. Como os espinhos que guardam Glitnir, este prato defende aqueles que o consomem."); item124.Crafting.Add("GFG_Eldhrimnir", 1); item124.RequiredItems.Add("GFG_RaguNorteProfundo", 3); item124.RequiredItems.Add("Sausages", 6); item124.RequiredItems.Add("MeadEitrMinor", 1); item124.RequiredItems.Add("SpicePlains", 10); item124.CraftAmount = 1; Item item125 = new Item("glitnircomidas", "GFG_BanqueteSjar"); item125.Name.English("Offering to Sjár"); item125.Description.English("A tribute to the protector of the seas. Sjár accepts only the finest provisions from those who wish to sail under his blessing."); item125.Name.Portuguese_Brazilian("Oferenda a Sjár"); item125.Description.Portuguese_Brazilian("Tributo ao protetor dos mares. Sjár aceita apenas as melhores provisões daqueles que desejam navegar sob sua bênção."); Item item126 = new Item("glitnircomidas", "GFG_BanqueteSjar_Mat"); item126.Name.English("Sjár Feast Materials"); item126.Description.English("A tribute to the protector of the seas. Sjár accepts only the finest provisions from those who wish to sail under his blessing."); item126.Name.Portuguese_Brazilian("Materiais da Oferenda a Sjár"); item126.Description.Portuguese_Brazilian("Tributo ao protetor dos mares. Sjár aceita apenas as melhores provisões daqueles que desejam navegar sob sua bênção."); item126.Crafting.Add("GFG_Eldhrimnir", 1); item126.RequiredItems.Add("GFG_EnsopadoReiDosMares", 2); item126.RequiredItems.Add("GFG_EnsopadoJomsviking", 3); item126.RequiredItems.Add("SpiceOceans", 10); item126.CraftAmount = 1; Item item127 = new Item("glitnircomidas", "GFG_BanqueteNizera"); item127.Name.English("Mead of Nizera's Conquest"); item127.Description.English("Bragafull, from the navigator Nizera, conqueror of unknown seas. In the sacred sumbel, each sip carries promises of distant lands and riches beyond the horizon."); item127.Name.Portuguese_Brazilian("Hidromel da Conquista de Nizera"); item127.Description.Portuguese_Brazilian("Bragafull do navegador Nizera, conquistador de mares desconhecidos. No sumbel sagrado, cada gole carrega promessas de terras distantes e riquezas além do horizonte."); Item item128 = new Item("glitnircomidas", "GFG_BanqueteNizera_Mat"); item128.Name.English("Nizera Feast Materials"); item128.Description.English("Bragafull, from the navigator Nizera, conqueror of unknown seas. In the sacred sumbel, each sip carries promises of distant lands and riches beyond the horizon."); item128.Name.Portuguese_Brazilian("Materiais do Hidromel de Nizera"); item128.Description.Portuguese_Brazilian("Bragafull do navegador Nizera, conquistador de mares desconhecidos. No sumbel sagrado, cada gole carrega promessas de terras distantes e riquezas além do horizonte."); item128.Crafting.Add("GFG_Eldhrimnir", 1); item128.RequiredItems.Add("MeadStaminaMedium", 3); item128.RequiredItems.Add("PowderedDragonEgg", 10); item128.RequiredItems.Add("SpiceOceans", 10); item128.CraftAmount = 1; Item item129 = new Item("glitnircomidas", "GFG_Vidarr"); item129.Name.English("Víðarr's Mighty Draught"); item129.Description.English("Channel the silent strength of Víðarr, the avenger of the gods and slayer of Fenrir.\n\n+25% damage against bosses for 15 minutes."); item129.Name.Portuguese_Brazilian("Poção Vingativa de Víðarr"); item129.Description.Portuguese_Brazilian("Canalize a força silenciosa de Víðarr, o vingador dos deuses e matador de Fenrir.\n\n+25% de dano contra chefes por 15 minutos."); item129.Crafting.Add("GFG_Eldhrimnir", 1); item129.RequiredItems.Add("Ectoplasm", 2); item129.RequiredItems.Add("Guck", 6); item129.RequiredItems.Add("SurtlingCore", 4); item129.RequiredItems.Add("BlobVial", 1); item129.CraftAmount = 1; Item item130 = new Item("glitnircomidas", "GFG_Hraesvelgr"); item130.Name.English("Hræsvelgr's Draught of Swiftness"); item130.Description.English("Channel the endless gales of Hræsvelgr, the corpse-eagle who stirs the winds of the world.\n\nReduces stamina use of all actions by 10%. +25% movement speed. Nullifies falling damage."); item130.Name.Portuguese_Brazilian("Poção da Leveza de Hræsvelgr"); item130.Description.Portuguese_Brazilian("Canalize as ventanias eternas de Hræsvelgr, a águia-cadáver que agita os ventos do mundo.\n\nDiminui o uso de vigor para todas as ações em 10%. +25% de velocidade de movimento. Anula o dano por queda."); item130.Crafting.Add("GFG_Eldhrimnir", 1); item130.RequiredItems.Add("FreezeGland", 2); item130.RequiredItems.Add("Feathers", 6); item130.RequiredItems.Add("MeadHasty", 1); item130.RequiredItems.Add("BlobVial", 1); item130.CraftAmount = 1; Item item131 = new Item("glitnircomidas", "GFG_Skadi"); item131.Name.English("Skaði's Hunting Draught"); item131.Description.English("Become as skilled as Skaði, the jötunn goddess of the hunt.\n\nRaise trophy drop chance by 25% and meat drops by 1 for 15 minutes."); item131.Name.Portuguese_Brazilian("Poção de Caça de Skaði"); item131.Description.Portuguese_Brazilian("Torne-se tão habilidoso quanto Skaði, a deusa gigante da caça.\n\nAumenta a chance de obter troféus em 25% e concede +1 de carne ao matar animais por 15 minutos."); item131.Crafting.Add("GFG_Eldhrimnir", 1); item131.RequiredItems.Add("Pukeberries", 2); item131.RequiredItems.Add("WolfFang", 6); item131.RequiredItems.Add("Ooze", 4); item131.RequiredItems.Add("BlobVial", 1); item131.CraftAmount = 1; Item item132 = new Item("glitnircomidas", "GFG_Freyr"); item132.Name.English("Freyr's Draught of Prosperity"); item132.Description.English("Be blessed by Freyr, lord of harvest and bringer of abundance to the land.\n\n25% chance to receive extra yield from crops and extra yield from riches for 15 minutes."); item132.Name.Portuguese_Brazilian("Poção da Abundância de Freyr"); item132.Description.Portuguese_Brazilian("Seja abençoado por Freyr, senhor da colheita e portador de abundância para a terra.\n\n25% de chance de receber rendimento extra das colheitas e rendimento extra de riquezas por 15 minutos."); item132.Crafting.Add("GFG_Eldhrimnir", 1); item132.RequiredItems.Add("Tar", 2); item132.RequiredItems.Add("PungentPebbles", 6); item132.RequiredItems.Add("ElderBark", 4); item132.RequiredItems.Add("BlobVial", 1); item132.CraftAmount = 1; Item item133 = new Item("glitnircomidas", "GFG_Njordr"); item133.Name.English("Njörðr's Seafarer Draught"); item133.Description.English("Command the winds and waves like Njörðr, god of ships and master of the sea.\n\n+30% sailing speed and +50% swim speed for 15 minutes."); item133.Name.Portuguese_Brazilian("Poção de Marinheiro de Njörðr"); item133.Description.Portuguese_Brazilian("Domine os ventos e as ondas como Njörðr, deus dos navios e mestre do mar.\n\n+30% de velocidade de navegação e +50% de velocidade de natação por 15 minutos."); item133.Crafting.Add("GFG_Eldhrimnir", 1); item133.RequiredItems.Add("Chitin", 2); item133.RequiredItems.Add("SpiceOceans", 6); item133.RequiredItems.Add("GFG_TentaculoKraken", 1); item133.RequiredItems.Add("BlobVial", 1); item133.CraftAmount = 1; Item item134 = new Item("glitnircomidas", "GFG_Torr"); item134.Name.English("Þórr's Draught of Wrath"); item134.Description.English("Invoke the thunder god's fury, wielder of Mjölnir and protector of Midgard.\n\nSecondary attacks have a chance to call down Þórr’s wrath and increases secondary attack damage by 25% for 15 minutes."); item134.Name.Portuguese_Brazilian("Poção da Ira de Þórr"); item134.Description.Portuguese_Brazilian("Invoque a fúria do deus do trovão, portador de Mjölnir e protetor de Midgard.\n\nAtaques secundários têm uma chance de invocar a ira de Þórr e aumentam o dano de ataques secundários em 15% por 15 minutos."); item134.Crafting.Add("GFG_Eldhrimnir", 1); item134.RequiredItems.Add("GreydwarfEye", 2); item134.RequiredItems.Add("Thunderstone", 6); item134.RequiredItems.Add("MeadBzerker", 1); item134.RequiredItems.Add("BlobVial", 1); item134.CraftAmount = 1; Item item135 = new Item("glitnircomidas", "GFG_Freyja"); item135.Name.English("Freyja's Seiðr Draught"); item135.Description.English("Draw upon the radiant eitr of Freyja, goddess of beauty and mistress of seiðr.\n\nDecreases staff attack eitr usage by 25% and increases eitr eitr regeneration by 10% for 15 minutes."); item135.Name.Portuguese_Brazilian("Poção de Seiðr de Freyja"); item135.Description.Portuguese_Brazilian("Invoque o éter radiante de Freyja, deusa da beleza e mestra do seiðr.\n\nReduz a quantidade de éter para atacar com cajados em 25% e aumenta a regeneração de eitr em 10% por 15 minutos."); item135.Crafting.Add("GFG_Eldhrimnir", 1); item135.RequiredItems.Add("Sap", 2); item135.RequiredItems.Add("FragrantBundle", 6); item135.RequiredItems.Add("Root", 4); item135.RequiredItems.Add("BlobVial", 1); item135.CraftAmount = 1; Item item136 = new Item("glitnircomidas", "GFG_Idunn"); item136.Name.English("Iðunn's Golden Draught"); item136.Description.English("Taste the rejuvenating power of Iðunn's golden apples, keeper of divine youth.\n\n+30 health, stamina and eitr for 15 minutes."); item136.Name.Portuguese_Brazilian("Poção Dourada de Iðunn"); item136.Description.Portuguese_Brazilian("Experimente o poder rejuvenescedor das maçãs douradas de Iðunn, guardiã da juventude divina.\n\n+30 de vida, vigor e éter por 15 minutos."); item136.Crafting.Add("GFG_Eldhrimnir", 1); item136.RequiredItems.Add("SulfurStone", 2); item136.RequiredItems.Add("Vineberry", 6); item136.RequiredItems.Add("PowderedDragonEgg", 4); item136.RequiredItems.Add("BlobVial", 1); item136.CraftAmount = 1; Item item137 = new Item("glitnircomidas", "GFG_Baldr"); item137.Name.English("Baldr's Draught of Radiance"); item137.Description.English("Embrace the pure light of Baldr, the shining god whose radiance banishes darkness.\n\n+15 spirit damage against undead and demons for 15 minutes."); item137.Name.Portuguese_Brazilian("Poção do Esplendor de Baldr"); item137.Description.Portuguese_Brazilian("Abrace a luz pura de Baldr, o deus brilhante cujo brilho afasta as trevas.\n\n+15 de dano espiritual contra mortos-vivos e demônios por 15 minutos."); item137.Crafting.Add("GFG_Eldhrimnir", 1); item137.RequiredItems.Add("YmirRemains", 2); item137.RequiredItems.Add("CharredBone", 6); item137.RequiredItems.Add("MushroomBzerker", 4); item137.RequiredItems.Add("BlobVial", 1); item137.CraftAmount = 1; CustomSE customSE = new CustomSE("glitnircomidas", "GFG_Efeito_GotasMimir"); customSE.Name.English("Mímisbrunnr Drops"); customSE.Name.Portuguese_Brazilian("Gotas de Mímisbrunnr"); CustomSE customSE2 = new CustomSE("glitnircomidas", "GFG_Efeito_HidromelDvergr"); customSE2.Name.English("Dvergr Mead"); customSE2.Name.Portuguese_Brazilian("Hidromel Dvergr"); CustomSE customSE3 = new CustomSE("glitnircomidas", "GFG_Efeito_LeiteLox"); customSE3.Name.English("Lox Milk"); customSE3.Name.Portuguese_Brazilian("Leite de Lox"); CustomSE customSE4 = new CustomSE("glitnircomidas", "GFG_Efeito_Lodoardente"); customSE4.Name.English("Booze"); customSE4.Name.Portuguese_Brazilian("Lodoardente"); CustomSE customSE5 = new CustomSE("glitnircomidas", "GFG_Efeito_MedicamentoFuling"); customSE5.Name.English("Fuling Medicine"); customSE5.Name.Portuguese_Brazilian("Medicamento Fuling"); CustomSE customSE6 = new CustomSE("glitnircomidas", "GFG_Efeito_NeblinaMentes"); customSE6.Name.English("Nogginfog"); customSE6.Name.Portuguese_Brazilian("Neblina-Mentes"); CustomSE customSE7 = new CustomSE("glitnircomidas", "GFG_Efeito_RoncaTuneis"); customSE7.Name.English("Tunnelrumbler"); customSE7.Name.Portuguese_Brazilian("Ronca-Túneis"); CustomSE customSE8 = new CustomSE("glitnircomidas", "GFG_Efeito_EnsopadoJavali"); customSE8.Name.English("Boar Stew"); customSE8.Name.Portuguese_Brazilian("Ensopado de Javali"); CustomSE customSE9 = new CustomSE("glitnircomidas", "GFG_Efeito_GuisadoTroll"); customSE9.Name.English("Troll Stew"); customSE9.Name.Portuguese_Brazilian("Guisado de Troll"); CustomSE customSE10 = new CustomSE("glitnircomidas", "GFG_Efeito_EnsopadoLagarto"); customSE10.Name.English("Neck Stew"); customSE10.Name.Portuguese_Brazilian("Ensopado de Lagarto"); CustomSE customSE11 = new CustomSE("glitnircomidas", "GFG_Efeito_CaldoCacador"); customSE11.Name.English("Hunter's Broth"); customSE11.Name.Portuguese_Brazilian("Caldo do Caçador"); CustomSE customSE12 = new CustomSE("glitnircomidas", "GFG_Efeito_PanelinhaMontanhesa"); customSE12.Name.English("Mountaineer Hotpot"); customSE12.Name.Portuguese_Brazilian("Panelinha Montanhesa"); CustomSE customSE13 = new CustomSE("glitnircomidas", "GFG_Efeito_EnsopadoJarnbjorn"); customSE13.Name.English("Járnbjörn Stew"); customSE13.Name.Portuguese_Brazilian("Ensopado Járnbjörn"); CustomSE customSE14 = new CustomSE("glitnircomidas", "GFG_Efeito_PotagemGuerreiros"); customSE14.Name.English("Warrior's Pottage"); customSE14.Name.Portuguese_Brazilian("Potagem dos Guerreiros"); CustomSE customSE15 = new CustomSE("glitnircomidas", "GFG_Efeito_BuscadorFlambado"); customSE15.Name.English("Flambéed Seeker Meat"); customSE15.Name.Portuguese_Brazilian("Carne de Buscador Flambada"); CustomSE customSE16 = new CustomSE("glitnircomidas", "GFG_Efeito_GuisadoHaldor"); customSE16.Name.English("Haldor's Troll Stew"); customSE16.Name.Portuguese_Brazilian("Guisado de Troll do Haldor"); CustomSE customSE17 = new CustomSE("glitnircomidas", "GFG_Efeito_PreparadoRunico"); customSE17.Name.English("Runemaster's Brew"); customSE17.Name.Portuguese_Brazilian("Preparado do Mestre das Runas"); CustomSE customSE18 = new CustomSE("glitnircomidas", "GFG_Efeito_CaldoHafgufa"); customSE18.Name.English("Hafgufa Stew"); customSE18.Name.Portuguese_Brazilian("Caldo de Hafgufa"); CustomSE customSE19 = new CustomSE("glitnircomidas", "GFG_Efeito_CaldoLyngbakr"); customSE19.Name.English("Lyngbakr Broth"); customSE19.Name.Portuguese_Brazilian("Caldo de Lyngbakr"); CustomSE customSE20 = new CustomSE("glitnircomidas", "GFG_Efeito_EnsopadoReiDosMares"); customSE20.Name.English("Sea King Stew"); customSE20.Name.Portuguese_Brazilian("Ensopado do Rei dos Mares"); CustomSE customSE21 = new CustomSE("glitnircomidas", "GFG_Efeito_CaldoNoturno"); customSE21.Name.English("Overnight Broth"); customSE21.Name.Portuguese_Brazilian("Caldo Noturno"); CustomSE customSE22 = new CustomSE("glitnircomidas", "GFG_Efeito_Baldr"); customSE22.Name.English("Baldr’s Draught of Radiance"); customSE22.Name.Portuguese_Brazilian("Poção do Esplendor de Baldr"); CustomSE customSE23 = new CustomSE("glitnircomidas", "GFG_Efeito_Freyja"); customSE23.Name.English("Freyja’s Seiðr Draught"); customSE23.Name.Portuguese_Brazilian("Poção de Seiðr de Freyja"); CustomSE customSE24 = new CustomSE("glitnircomidas", "GFG_Efeito_Freyr"); customSE24.Name.English("Freyr’s Draught of Prosperity"); customSE24.Name.Portuguese_Brazilian("Poção da Abundância de Freyr"); CustomSE customSE25 = new CustomSE("glitnircomidas", "GFG_Efeito_Hraesvelgr"); customSE25.Name.English("Hræsvelgr's Draught of Swiftness"); customSE25.Name.Portuguese_Brazilian("Poção da Leveza de Hræsvelgr"); CustomSE customSE26 = new CustomSE("glitnircomidas", "GFG_Efeito_Idunn"); customSE26.Name.English("Iðunn’s Golden Draught"); customSE26.Name.Portuguese_Brazilian("Poção Dourada de Iðunn"); CustomSE customSE27 = new CustomSE("glitnircomidas", "GFG_Efeito_Njordr"); customSE27.Name.English("Njörðr's Seafarer Draught"); customSE27.Name.Portuguese_Brazilian("Poção de Marinheiro de Njörðr"); CustomSE customSE28 = new CustomSE("glitnircomidas", "GFG_Efeito_Skadi"); customSE28.Name.English("Skaði’s Hunting Draught"); customSE28.Name.Portuguese_Brazilian("Poção de Caça de Skaði"); CustomSE customSE29 = new CustomSE("glitnircomidas", "GFG_Efeito_Torr"); customSE29.Name.English("Þórr’s Draught of Wrath"); customSE29.Name.Portuguese_Brazilian("Poção da Ira de Þórr"); CustomSE customSE30 = new CustomSE("glitnircomidas", "GFG_Efeito_Vidarr"); customSE30.Name.English("Víðarr’s Mighty Draught"); customSE30.Name.Portuguese_Brazilian("Poção Vingativa de Víðarr"); GameObject val = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_MarteloBarril_Itens"); GameObject val2 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_MarteloBarril_remover"); GameObject val3 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_block_camshake"); GameObject val4 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_BonusYield"); GameObject val5 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_Eat"); GameObject val6 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_FeastEat"); GameObject val7 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_FeastSmall"); GameObject val8 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_FeastTemplate"); GameObject val9 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_fx_oven_add_wood"); GameObject val10 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_lightningAOE"); GameObject val11 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_blocked"); GameObject val12 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_cooking_station_transform"); GameObject val13 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_fermenter_add"); GameObject val14 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_fermenter_tap"); GameObject val15 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_FireAddFuel"); GameObject val16 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_HitSparks"); GameObject val17 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_MeadSplash"); GameObject val18 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_pickable_pick"); GameObject val19 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_Place_workbench"); GameObject val20 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_RockDestroyed"); GameObject val21 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_RockHit"); GameObject val22 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_SawDust"); GameObject val23 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_vfx_watersplash_bathtub"); GameObject val24 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_build_hammer_default"); GameObject val25 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_build_hammer_metal"); GameObject val26 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_build_hammer_wood"); GameObject val27 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_CauldronBubbles"); GameObject val28 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_cooking_station_done"); GameObject val29 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_cooking_station_take"); GameObject val30 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_darkwood_door_close"); GameObject val31 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_darkwood_door_open"); GameObject val32 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_door_close"); GameObject val33 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_door_open"); GameObject val34 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_drink"); GameObject val35 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_eat"); GameObject val36 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_EldhrimnirCraft"); GameObject val37 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_feast_destroyed"); GameObject val38 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_fermenter_add"); GameObject val39 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_fermenter_tap"); GameObject val40 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_FireAddFuel"); GameObject val41 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_gui_craftitem_workbench_end"); GameObject val42 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_gui_repairitem_workbench"); GameObject val43 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_lootspawn"); GameObject val44 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_MeadBurp"); GameObject val45 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_metal_blocked"); GameObject val46 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_pickable_pick"); GameObject val47 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_rock_destroyed"); GameObject val48 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_rock_hit"); GameObject val49 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_unarmed_hit"); GameObject val50 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_wood_blocked"); GameObject val51 = PrefabManager.RegisterPrefab("glitnircomidas", "GFG_sfx_wood_destroyed"); Assembly executingAssembly = Assembly.GetExecutingAssembly(); _harmony.PatchAll(executingAssembly); SetupOptimizedWatcher(); if (saveOnConfigSet) { ((BaseUnityPlugin)this).Config.SaveOnConfigSet = saveOnConfigSet; ((BaseUnityPlugin)this).Config.Save(); } } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); if (configReloadTimer != null) { configReloadTimer.Stop(); configReloadTimer.Dispose(); configReloadTimer = null; } if (configWatcher != null) { configWatcher.EnableRaisingEvents = false; configWatcher.Dispose(); configWatcher = null; } } private void SetupOptimizedWatcher() { configWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName); configWatcher.Changed += OnConfigFileChangedDebounced; configWatcher.Created += OnConfigFileChangedDebounced; configWatcher.Renamed += OnConfigFileChangedDebounced; configWatcher.IncludeSubdirectories = true; configWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject; configWatcher.EnableRaisingEvents = true; configReloadTimer = new System.Timers.Timer(2000.0); configReloadTimer.AutoReset = false; configReloadTimer.Elapsed += delegate { ThreadingHelper.Instance.StartSyncInvoke((Action)delegate { ReloadConfigOptimized(); }); }; GlitnirFomeEGloriaLogger.LogDebug((object)"Optimized config watcher initialized with debounce"); } private void OnConfigFileChangedDebounced(object sender, FileSystemEventArgs e) { configReloadTimer?.Stop(); configReloadTimer?.Start(); GlitnirFomeEGloriaLogger.LogDebug((object)$"Config file changed: {e.ChangeType} - reload scheduled"); } private void ReloadConfigOptimized() { if (!File.Exists(ConfigFileFullPath)) { return; } try { GlitnirFomeEGloriaLogger.LogInfo((object)"[Config] Reloading configuration..."); ((BaseUnityPlugin)this).Config.Reload(); if ((Object)(object)ZNetScene.instance != (Object)null) { conversionReloadPending = true; } } catch (Exception ex) { GlitnirFomeEGloriaLogger.LogError((object)("There was an issue loading your " + ConfigFileName)); GlitnirFomeEGloriaLogger.LogError((object)("Error: " + ex.Message)); GlitnirFomeEGloriaLogger.LogError((object)"Please check your config entries for spelling and format!"); } } private void Update() { if (conversionReloadPending && (Object)(object)ZNetScene.instance != (Object)null) { conversionReloadPending = false; GlitnirFomeEGloriaLogger.LogInfo((object)"[Config] Applying conversion changes..."); ConversionsZNetScene_AwakePost_Patch.ReapplyConversions(ZNetScene.instance); if ((Object)(object)Player.m_localPlayer != (Object)null) { ((Character)Player.m_localPlayer).Message((MessageType)2, "Glitnir: Conversions reloaded!", 0, (Sprite)null); } } } private static string GetFreyrText(string key) { string selectedLanguage = Localization.instance.GetSelectedLanguage(); bool flag = selectedLanguage.StartsWith("Portuguese") || selectedLanguage.StartsWith("Brazilian"); return key switch { "pickable_bonus" => flag ? "Bênção de Freyr!" : "Freyr's blessing!", "coins_bonus" => flag ? "Bênção de Freyr!" : "Freyr's fortune!", "chest_bonus" => flag ? "Bênção de Freyr!" : "Freyr's fortune!", _ => "", }; } private static bool HasFreyrEffect(Player player) { if ((Object)(object)player == (Object)null) { return false; } return ((Character)player).GetSEMan().HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Freyr")); } private static string StripLocalizationToken(string itemName) { if (string.IsNullOrEmpty(itemName)) { return itemName; } if (itemName.StartsWith("$item_")) { return itemName.Substring(6); } if (itemName.StartsWith("$")) { return itemName.Substring(1); } return itemName; } private static HashSet GetPickableItems() { if (_cachedPickableItems == null) { _cachedPickableItems = ParseConfigList(FreyrPickableItems.Value); } return _cachedPickableItems; } private static HashSet GetChestItems() { if (_cachedChestItems == null) { _cachedChestItems = ParseConfigList(FreyrChestItems.Value); } return _cachedChestItems; } private static HashSet GetCreaturePrefabs() { if (_cachedCreaturePrefabs == null) { _cachedCreaturePrefabs = ParseConfigList(FreyrCreatureNames.Value); } return _cachedCreaturePrefabs; } private static HashSet ParseConfigList(string configValue) { if (string.IsNullOrWhiteSpace(configValue)) { return new HashSet(); } return new HashSet(from s in configValue.Split(new char[1] { ',' }) select s.Trim() into s where !string.IsNullOrEmpty(s) select s.ToLower()); } private static bool IsPickableItem(string itemName) { string item = StripLocalizationToken(itemName).ToLower(); return GetPickableItems().Contains(item); } private static bool IsChestItem(string itemName) { string item = StripLocalizationToken(itemName).ToLower(); return GetChestItems().Contains(item); } private static bool IsTargetCreature(string prefabName) { string prefabName2 = prefabName; HashSet creaturePrefabs = GetCreaturePrefabs(); return creaturePrefabs.Any((string keyword) => prefabName2.ToLower().Contains(keyword)); } private static void ApplyMedicamentoFulingEffect() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_MedicamentoFuling")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val != null) { ((StatusEffect)val).m_ttl = MedicamentoFulingTTL.Value; val.m_healthUpFront = MedicamentoFulingHealthUpFront.Value; } } } private static void ApplyRoncaTuneisEffect() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_RoncaTuneis")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val != null) { ((StatusEffect)val).m_ttl = RoncaTuneisTTL.Value; val.m_healthUpFront = RoncaTuneisHealthUpFront.Value; } } } private static void ApplyLeiteLoxEffect() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_LeiteLox")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val != null) { ((StatusEffect)val).m_ttl = LeiteLoxTTL.Value; val.m_staminaUpFront = LeiteLoxStaminaUpFront.Value; } } } private static void ApplyLodoardenteEffect() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_Lodoardente")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val != null) { ((StatusEffect)val).m_ttl = LodoardenteTTL.Value; val.m_staminaUpFront = LodoardenteStaminaUpFront.Value; } } } private static void ApplyNeblinaMentesEffect() { if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("GFG_Efeito_NeblinaMentes")); SE_Stats val = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null); if (val != null) { ((StatusEffect)val).m_ttl = NeblinaMentesTTL.Value; val.m_eitrUpFront = NeblinaMentesEitrUpFront.Value; } } } private ConfigEntry config(string group, string name, T value, ConfigDescription description, bool synchronizedSetting = true) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown ConfigDescription val = new ConfigDescription(description.Description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]"), description.AcceptableValues, description.Tags); ConfigEntry val2 = ((BaseUnityPlugin)this).Config.Bind(group, name, value, val); SyncedConfigEntry syncedConfigEntry = ConfigSync.AddConfigEntry(val2); syncedConfigEntry.SynchronizedConfig = synchronizedSetting; return val2; } private ConfigEntry config(string group, string name, T value, string description, bool synchronizedSetting = true) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty()), synchronizedSetting); } static GlitnirFomeEGloriaPlugin() { string configPath = Paths.ConfigPath; char directorySeparatorChar = Path.DirectorySeparatorChar; ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName; ConnectionError = ""; GlitnirFomeEGloriaLogger = Logger.CreateLogSource("GlitnirFomeEGloria"); ConfigSync = new ConfigSync("XutzBR.GlitnirFomeEGloria") { DisplayName = "GlitnirFomeEGloria", CurrentVersion = "1.0.4", MinimumRequiredVersion = "1.0.4" }; conversionReloadPending = false; greydwarfDropChance = null; greydwarfDropMin = null; greydwarfDropMax = null; greydwarfEliteDropChance = null; greydwarfEliteDropMin = null; greydwarfEliteDropMax = null; greydwarfShamanDropChance = null; greydwarfShamanDropMin = null; greydwarfShamanDropMax = null; NjordrSailingSpeedMultiplier = null; FreyjaStaffEitrReduction = null; IdunnHealthBonus = null; IdunnStaminaBonus = null; IdunnEitrBonus = null; BaldrSpiritDamageBonus = null; MedicamentoFulingTTL = null; MedicamentoFulingHealthUpFront = null; RoncaTuneisTTL = null; RoncaTuneisHealthUpFront = null; LeiteLoxTTL = null; LeiteLoxStaminaUpFront = null; LodoardenteTTL = null; LodoardenteStaminaUpFront = null; NeblinaMentesTTL = null; NeblinaMentesEitrUpFront = null; DefaultCookingStationConversions = new Dictionary { { "GFG_CarnePassaro", new ConversionData("GFG_CarnePassaroCozida", 40f) }, { "GFG_PernilJavaliCru", new ConversionData("GFG_PernilJavaliCozido", 40f) }, { "GFG_CostelaCervoCrua", new ConversionData("GFG_CostelaCervoCozida", 40f) } }; DefaultIronCookingStationConversions = new Dictionary { { "GFG_CarnePassaro", new ConversionData("GFG_CarnePassaroCozida", 40f) }, { "GFG_PernilJavaliCru", new ConversionData("GFG_PernilJavaliCozido", 40f) }, { "GFG_CostelaCervoCrua", new ConversionData("GFG_CostelaCervoCozida", 40f) }, { "GFG_CarneTroll", new ConversionData("GFG_CarneTrollCozida", 60f) } }; DefaultOvenConversions = new Dictionary { { "GFG_TortaMirtiloVermelhoCrua", new ConversionData("GFG_TortaMirtiloVermelho", 50f) }, { "GFG_CaldoNoturnoCru", new ConversionData("GFG_CaldoNoturno", 60f) }, { "GFG_PaoViagemCru", new ConversionData("GFG_PaoViagem", 40f) }, { "GFG_KrakenAssadoCru", new ConversionData("GFG_KrakenAssado", 60f) } }; DefaultFermenterConversions = new Dictionary { { "GFG_CervejaCogumeloBase", new ConversionData("GFG_CervejaCogumelo", 0f, 6) }, { "GFG_HakarlBase", new ConversionData("GFG_Hakarl", 0f, 6) }, { "GFG_HakarlMandibulosseaBase", new ConversionData("GFG_HakarlMandibulossea", 0f, 6) }, { "GFG_PiclesLegumesBase", new ConversionData("GFG_PiclesLegumes", 0f, 6) }, { "GFG_QueijoLoxBase", new ConversionData("GFG_QueijoLox", 0f, 6) }, { "GFG_RakfiskBase", new ConversionData("GFG_Rakfisk", 0f, 6) }, { "GFG_SidraPicanteBase", new ConversionData("GFG_SidraPicante", 0f, 6) } }; DefaultSmokehouseWoodConversions = new Dictionary { { "GFG_CarnePassaro", new ConversionData("GFG_PassaroDefumado", 480f) }, { "NeckTail", new ConversionData("GFG_LagartoDefumado", 480f) }, { "RawMeat", new ConversionData("GFG_JavaliDefumado", 600f) }, { "DeerMeat", new ConversionData("GFG_CervoDefumado", 600f) }, { "BjornMeat", new ConversionData("GFG_UrsoDefumado", 600f) }, { "FishRaw", new ConversionData("GFG_PeixeDefumado", 600f) }, { "WolfMeat", new ConversionData("GFG_LoboDefumado", 600f) }, { "ChickenMeat", new ConversionData("GFG_FrangoDefumado", 480f) }, { "HareMeat", new ConversionData("GFG_LebreDefumada", 480f) } }; DefaultSmokehouseStoneConversions = new Dictionary { { "GFG_CarnePassaro", new ConversionData("GFG_PassaroDefumado", 420f) }, { "NeckTail", new ConversionData("GFG_LagartoDefumado", 420f) }, { "RawMeat", new ConversionData("GFG_JavaliDefumado", 540f) }, { "DeerMeat", new ConversionData("GFG_CervoDefumado", 540f) }, { "BjornMeat", new ConversionData("GFG_UrsoDefumado", 540f) }, { "FishRaw", new ConversionData("GFG_PeixeDefumado", 540f) }, { "GFG_CarneTroll", new ConversionData("GFG_TrollDefumado", 660f) }, { "WolfMeat", new ConversionData("GFG_LoboDefumado", 540f) }, { "GFG_PresuntoJavali", new ConversionData("GFG_PresuntoDefumado", 660f) }, { "LoxMeat", new ConversionData("GFG_LoxDefumado", 660f) }, { "ChickenMeat", new ConversionData("GFG_FrangoDefumado", 420f) }, { "BugMeat", new ConversionData("GFG_BuscadorDefumado", 540f) }, { "HareMeat", new ConversionData("GFG_LebreDefumada", 420f) }, { "AsksvinMeat", new ConversionData("GFG_AsksvinDefumado", 540f) }, { "VoltureMeat", new ConversionData("GFG_UruvulDefumado", 540f) }, { "BoneMawSerpentMeat", new ConversionData("GFG_MandibulosseaDefumada", 900f) }, { "SerpentMeat", new ConversionData("GFG_SerpenteDefumada", 900f) }, { "GFG_TentaculoKraken", new ConversionData("GFG_KrakenDefumado", 900f) } }; DefaultLegendFermenterConversions = new Dictionary { { "MeadBaseBugRepellent", new ConversionData("MeadBugRepellent", 0f, 7) }, { "MeadBaseBzerker", new ConversionData("MeadBzerker", 0f, 4) }, { "MeadBaseEitrLingering", new ConversionData("MeadEitrLingering", 0f, 7) }, { "MeadBaseEitrMinor", new ConversionData("MeadEitrMinor", 0f, 7) }, { "MeadBaseFrostResist", new ConversionData("MeadFrostResist", 0f, 7) }, { "MeadBaseHasty", new ConversionData("MeadHasty", 0f, 7) }, { "MeadBaseHealthLingering", new ConversionData("MeadHealthLingering", 0f, 7) }, { "MeadBaseHealthMajor", new ConversionData("MeadHealthMajor", 0f, 7) }, { "MeadBaseHealthMedium", new ConversionData("MeadHealthMedium", 0f, 7) }, { "MeadBaseHealthMinor", new ConversionData("MeadHealthMinor", 0f, 7) }, { "MeadBaseLightFoot", new ConversionData("MeadLightfoot", 0f, 7) }, { "MeadBasePoisonResist", new ConversionData("MeadPoisonResist", 0f, 7) }, { "MeadBaseStaminaLingering", new ConversionData("MeadStaminaLingering", 0f, 7) }, { "MeadBaseStaminaMedium", new ConversionData("MeadStaminaMedium", 0f, 7) }, { "MeadBaseStaminaMinor", new ConversionData("MeadStaminaMinor", 0f, 7) }, { "MeadBaseStrength", new ConversionData("MeadStrength", 0f, 7) }, { "MeadBaseSwimmer", new ConversionData("MeadSwimmer", 0f, 7) }, { "MeadBaseTamer", new ConversionData("MeadTamer", 0f, 7) }, { "MeadBaseTasty", new ConversionData("MeadTasty", 0f, 7) }, { "BarleyWineBase", new ConversionData("BarleyWine", 0f, 7) }, { "GFG_CervejaCogumeloBase", new ConversionData("GFG_CervejaCogumelo", 0f, 7) }, { "GFG_HakarlBase", new ConversionData("GFG_Hakarl", 0f, 7) }, { "GFG_HakarlMandibulosseaBase", new ConversionData("GFG_HakarlMandibulossea", 0f, 7) }, { "GFG_PiclesLegumesBase", new ConversionData("GFG_PiclesLegumes", 0f, 7) }, { "GFG_QueijoLoxBase", new ConversionData("GFG_QueijoLox", 0f, 7) }, { "GFG_RakfiskBase", new ConversionData("GFG_Rakfisk", 0f, 7) }, { "GFG_SidraPicanteBase", new ConversionData("GFG_SidraPicante", 0f, 7) } }; _serverConfigLocked = null; } } public static class KeyboardExtensions { public static bool IsKeyDown(this KeyboardShortcut shortcut) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKeyDown(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func)Input.GetKey); } public static bool IsKeyHeld(this KeyboardShortcut shortcut) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) return (int)((KeyboardShortcut)(ref shortcut)).MainKey != 0 && Input.GetKey(((KeyboardShortcut)(ref shortcut)).MainKey) && ((KeyboardShortcut)(ref shortcut)).Modifiers.All((Func)Input.GetKey); } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] public static class RegisterAndCheckVersion { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogDebug((object)"Registering version RPC handler"); peer.m_rpc.Register("GlitnirFomeEGloria_VersionCheck", (Action)RpcHandlers.RPC_GlitnirFomeEGloria_Version); GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogDebug((object)"Invoking version check"); ZPackage val = new ZPackage(); val.Write("1.0.4"); peer.m_rpc.Invoke("GlitnirFomeEGloria_VersionCheck", new object[1] { val }); } } [HarmonyPatch(typeof(ZNet), "RPC_PeerInfo")] public static class VerifyClient { private static bool Prefix(ZRpc rpc, ZPackage pkg, ref ZNet __instance) { if (!__instance.IsServer() || RpcHandlers.ValidatedPeers.Contains(rpc)) { return true; } GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") never sent version or couldn't due to previous disconnect, disconnecting")); rpc.Invoke("Error", new object[1] { 3 }); return false; } private static void Postfix(ZNet __instance) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.instance.GetServerPeerID(), "GlitnirFomeEGloriaRequestAdminSync", new object[1] { (object)new ZPackage() }); } } [HarmonyPatch(typeof(FejdStartup), "ShowConnectError")] public class ShowConnectionError { private static void Postfix(FejdStartup __instance) { if (__instance.m_connectionFailedPanel.activeSelf) { __instance.m_connectionFailedError.fontSizeMax = 25f; __instance.m_connectionFailedError.fontSizeMin = 15f; TMP_Text connectionFailedError = __instance.m_connectionFailedError; connectionFailedError.text = connectionFailedError.text + "\n" + GlitnirFomeEGloriaPlugin.ConnectionError; } } } [HarmonyPatch(typeof(ZNet), "Disconnect")] public static class RemoveDisconnectedPeerFromVerified { private static void Prefix(ZNetPeer peer, ref ZNet __instance) { if (__instance.IsServer()) { GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogInfo((object)("Peer (" + peer.m_rpc.m_socket.GetHostName() + ") disconnected, removing from validated list")); RpcHandlers.ValidatedPeers.Remove(peer.m_rpc); } } } public static class RpcHandlers { public static readonly List ValidatedPeers = new List(); public static void RPC_GlitnirFomeEGloria_Version(ZRpc rpc, ZPackage pkg) { string text = pkg.ReadString(); GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogInfo((object)("Version check, local: 1.0.4, remote: " + text)); if (text != "1.0.4") { GlitnirFomeEGloriaPlugin.ConnectionError = "GlitnirFomeEGloria Installed: 1.0.4\n Needed: " + text; if (ZNet.instance.IsServer()) { GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogWarning((object)("Peer (" + rpc.m_socket.GetHostName() + ") has incompatible version, disconnecting...")); rpc.Invoke("Error", new object[1] { 3 }); } } else if (!ZNet.instance.IsServer()) { GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogInfo((object)"Received same version from server!"); } else { GlitnirFomeEGloriaPlugin.GlitnirFomeEGloriaLogger.LogInfo((object)("Adding peer (" + rpc.m_socket.GetHostName() + ") to validated list")); ValidatedPeers.Add(rpc); } } } } namespace StatusEffectManager { [PublicAPI] [Description("The ItemDrop effect to apply the status effect")] public enum EffectType { Equip, Attack, Consume, Set } public struct SE_Item { public StatusEffect Effect; public EffectType Type; } [PublicAPI] public class CustomSE { private static readonly List RegisteredEffects = new List(); private static readonly Dictionary CustomEffectMap = new Dictionary(); internal static readonly List CustomSEs = new List(); internal static readonly Dictionary AddToPrefabs = new Dictionary(); [Description("Instance of the StatusEffect.")] public readonly StatusEffect Effect; public EffectType Type; private string _folderName = "icons"; private AssetBundle _assetBundle = null; [Description("Sets the icon for the StatusEffect. Must be 64x64")] public Sprite? IconSprite = null; private string? IconName = null; private LocalizeKey? _name; private static Localization? _english; private static BaseUnityPlugin? _plugin; private static bool hasConfigSync = true; private static object? _configSync; [Description("Sets the icon for the StatusEffect. Must be 64x64")] public string? Icon { get { return IconName; } set { IconName = value; IconSprite = ((IconName == null) ? null : loadSprite(IconName)); Effect.m_icon = IconSprite; } } [Description("Sets the in-game name for the StatusEffect")] public LocalizeKey Name { get { LocalizeKey name = _name; if (name != null) { return name; } StatusEffect effect = Effect; if (effect.m_name.StartsWith("$")) { _name = new LocalizeKey(effect.m_name); } else { string text = "$statuseffect_" + ((Object)Effect).name.Replace(" ", "_"); _name = new LocalizeKey(text).English(effect.m_name); effect.m_name = text; } return _name; } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } private static object? configSync { get { if (_configSync == null && hasConfigSync) { Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " ItemManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } } return _configSync; } } public CustomSE(string assetBundleFileName, string customEffectName, string folderName = "assets") : this(EffectManager.RegisterAssetBundle(assetBundleFileName, folderName), customEffectName) { } public CustomSE(AssetBundle bundle, string customEffectName) { Effect = EffectManager.RegisterCustomSE(bundle, customEffectName); RegisteredEffects.Add(this); CustomEffectMap[Effect] = this; } public CustomSE(string customEffectName) { Effect = ScriptableObject.CreateInstance(); EffectManager.RegisterCustomSE(Effect, customEffectName); RegisteredEffects.Add(this); CustomEffectMap[Effect] = this; } private byte[]? ReadEmbeddedFileBytes(string name) { using MemoryStream memoryStream = new MemoryStream(); Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + ((_folderName == "") ? "" : ".") + _folderName + "." + name); if (manifestResourceStream == null) { return null; } manifestResourceStream.CopyTo(memoryStream); return memoryStream.ToArray(); } private Texture2D? loadTexture(string name) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown byte[] array = ReadEmbeddedFileBytes(name); if (array != null) { Texture2D val = new Texture2D(0, 0); ImageConversion.LoadImage(val, array); return val; } return null; } private Sprite loadSprite(string name) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) Texture2D val = loadTexture(name); if (val != null) { return Sprite.Create(val, new Rect(0f, 0f, 64f, 64f), Vector2.zero); } AssetBundle assetBundle = _assetBundle; Sprite val2 = ((assetBundle != null) ? assetBundle.LoadAsset(name) : null); if (val2 != null) { return val2; } throw new FileNotFoundException("Could not find a file named " + name + " for the effect icon"); } public void AddSEToPrefab(CustomSE customSE, string prefabName) { SE_Item sE_Item = default(SE_Item); sE_Item.Effect = customSE.Effect; sE_Item.Type = customSE.Type; SE_Item key = sE_Item; AddToPrefabs.Add(key, prefabName); } private static ConfigEntry config(string group, string name, T value, ConfigDescription description) { ConfigEntry val = plugin.Config.Bind(group, name, value, description); configSync?.GetType().GetMethod("AddConfigEntry").MakeGenericMethod(typeof(T)) .Invoke(configSync, new object[1] { val }); return val; } private static ConfigEntry config(string group, string name, T value, string description) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty())); } } [PublicAPI] public class LocalizeKey { private static readonly List keys = new List(); public readonly string Key; public readonly Dictionary Localizations = new Dictionary(); public LocalizeKey(string key) { Key = key.Replace("$", ""); keys.Add(this); } public void Alias(string alias) { Localizations.Clear(); if (!alias.Contains("$")) { alias = "$" + alias; } Localizations["alias"] = alias; if (Localization.m_instance != null) { Localization.instance.AddWord(Key, Localization.instance.Localize(alias)); } } public LocalizeKey English(string key) { return addForLang("English", key); } public LocalizeKey Swedish(string key) { return addForLang("Swedish", key); } public LocalizeKey French(string key) { return addForLang("French", key); } public LocalizeKey Italian(string key) { return addForLang("Italian", key); } public LocalizeKey German(string key) { return addForLang("German", key); } public LocalizeKey Spanish(string key) { return addForLang("Spanish", key); } public LocalizeKey Russian(string key) { return addForLang("Russian", key); } public LocalizeKey Romanian(string key) { return addForLang("Romanian", key); } public LocalizeKey Bulgarian(string key) { return addForLang("Bulgarian", key); } public LocalizeKey Macedonian(string key) { return addForLang("Macedonian", key); } public LocalizeKey Finnish(string key) { return addForLang("Finnish", key); } public LocalizeKey Danish(string key) { return addForLang("Danish", key); } public LocalizeKey Norwegian(string key) { return addForLang("Norwegian", key); } public LocalizeKey Icelandic(string key) { return addForLang("Icelandic", key); } public LocalizeKey Turkish(string key) { return addForLang("Turkish", key); } public LocalizeKey Lithuanian(string key) { return addForLang("Lithuanian", key); } public LocalizeKey Czech(string key) { return addForLang("Czech", key); } public LocalizeKey Hungarian(string key) { return addForLang("Hungarian", key); } public LocalizeKey Slovak(string key) { return addForLang("Slovak", key); } public LocalizeKey Polish(string key) { return addForLang("Polish", key); } public LocalizeKey Dutch(string key) { return addForLang("Dutch", key); } public LocalizeKey Portuguese_European(string key) { return addForLang("Portuguese_European", key); } public LocalizeKey Portuguese_Brazilian(string key) { return addForLang("Portuguese_Brazilian", key); } public LocalizeKey Chinese(string key) { return addForLang("Chinese", key); } public LocalizeKey Japanese(string key) { return addForLang("Japanese", key); } public LocalizeKey Korean(string key) { return addForLang("Korean", key); } public LocalizeKey Hindi(string key) { return addForLang("Hindi", key); } public LocalizeKey Thai(string key) { return addForLang("Thai", key); } public LocalizeKey Abenaki(string key) { return addForLang("Abenaki", key); } public LocalizeKey Croatian(string key) { return addForLang("Croatian", key); } public LocalizeKey Georgian(string key) { return addForLang("Georgian", key); } public LocalizeKey Greek(string key) { return addForLang("Greek", key); } public LocalizeKey Serbian(string key) { return addForLang("Serbian", key); } public LocalizeKey Ukrainian(string key) { return addForLang("Ukrainian", key); } private LocalizeKey addForLang(string lang, string value) { Localizations[lang] = value; if (Localization.m_instance != null) { if (Localization.instance.GetSelectedLanguage() == lang) { Localization.instance.AddWord(Key, value); } else if (lang == "English" && !Localization.instance.m_translations.ContainsKey(Key)) { Localization.instance.AddWord(Key, value); } } return this; } [HarmonyPriority(300)] internal static void AddLocalizedKeys(Localization __instance, string language) { foreach (LocalizeKey key in keys) { string value2; if (key.Localizations.TryGetValue(language, out string value) || key.Localizations.TryGetValue("English", out value)) { __instance.AddWord(key.Key, value); } else if (key.Localizations.TryGetValue("alias", out value2)) { __instance.AddWord(key.Key, Localization.instance.Localize(value2)); } } } } public static class LocalizationCache { private static readonly Dictionary localizations = new Dictionary(); internal static void LocalizationPostfix(Localization __instance, string language) { Localization __instance2 = __instance; string key = localizations.FirstOrDefault>((KeyValuePair l) => l.Value == __instance2).Key; if (key != null) { localizations.Remove(key); } if (!localizations.ContainsKey(language)) { localizations.Add(language, __instance2); } } public static Localization ForLanguage(string? language = null) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (localizations.TryGetValue(language ?? PlayerPrefs.GetString("language", "English"), out Localization value)) { return value; } value = new Localization(); if (language != null) { value.SetupLanguage(language); } return value; } } public static class EffectManager { private struct BundleId { [UsedImplicitly] public string assetBundleFileName; [UsedImplicitly] public string folderName; } private static readonly Dictionary bundleCache; static EffectManager() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown bundleCache = new Dictionary(); Harmony val = new Harmony("org.bepinex.helpers.StatusEffectManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(EffectManager), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(EffectManager), "Patch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizeKey), "AddLocalizedKeys", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizationCache), "LocalizationPostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static AssetBundle RegisterAssetBundle(string assetBundleFileName, string folderName = "assets") { string assetBundleFileName2 = assetBundleFileName; BundleId bundleId = default(BundleId); bundleId.assetBundleFileName = assetBundleFileName2; bundleId.folderName = folderName; BundleId key = bundleId; if (!bundleCache.TryGetValue(key, out AssetBundle value)) { Dictionary dictionary = bundleCache; AssetBundle? obj = ((IEnumerable)Resources.FindObjectsOfTypeAll()).FirstOrDefault((Func)((AssetBundle a) => ((Object)a).name == assetBundleFileName2)) ?? AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + ((folderName == "") ? "" : ".") + folderName + "." + assetBundleFileName2)); AssetBundle result = obj; dictionary[key] = obj; return result; } return value; } public static StatusEffect RegisterCustomSE(string assetBundleFileName, string customEffectName, string folderName = "assets") { return RegisterCustomSE(RegisterAssetBundle(assetBundleFileName, folderName), customEffectName); } public static StatusEffect RegisterCustomSE(AssetBundle assets, string customEffectName) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown StatusEffect val = (StatusEffect)assets.LoadAsset(customEffectName); CustomSE.CustomSEs.Add(val); return val; } public static StatusEffect RegisterCustomSE(StatusEffect customSE, string customEffectName) { ((Object)customSE).name = customEffectName; CustomSE.CustomSEs.Add(customSE); return customSE; } [HarmonyPriority(700)] private static void Patch_ObjectDBInit(ObjectDB __instance) { foreach (StatusEffect customSE in CustomSE.CustomSEs) { if (!__instance.m_StatusEffects.Contains(customSE)) { __instance.m_StatusEffects.Add(customSE); } } __instance.UpdateRegisters(); } [HarmonyPriority(700)] private static void Patch_ZNetSceneAwake(ZNetScene __instance) { foreach (KeyValuePair addToPrefab in CustomSE.AddToPrefabs) { try { GameObject prefab = __instance.GetPrefab(addToPrefab.Value); ItemDrop val = (Object.op_Implicit((Object)(object)prefab) ? prefab.GetComponent() : prefab.GetComponentInChildren()); Aoe val2 = (Object.op_Implicit((Object)(object)prefab) ? prefab.GetComponent() : prefab.GetComponentInChildren()); EffectArea val3 = (Object.op_Implicit((Object)(object)prefab) ? prefab.GetComponent() : prefab.GetComponentInChildren()); if (Object.op_Implicit((Object)(object)val)) { switch (addToPrefab.Key.Type) { case EffectType.Equip: val.m_itemData.m_shared.m_equipStatusEffect = addToPrefab.Key.Effect; break; case EffectType.Attack: val.m_itemData.m_shared.m_attackStatusEffect = addToPrefab.Key.Effect; break; case EffectType.Consume: val.m_itemData.m_shared.m_consumeStatusEffect = addToPrefab.Key.Effect; break; case EffectType.Set: val.m_itemData.m_shared.m_setSize = 1; val.m_itemData.m_shared.m_setName = ((Object)addToPrefab.Key.Effect).name; val.m_itemData.m_shared.m_setStatusEffect = addToPrefab.Key.Effect; break; default: throw new ArgumentOutOfRangeException(); } } else if (Object.op_Implicit((Object)(object)val2)) { val2.m_statusEffect = ((Object)addToPrefab.Key.Effect).name; } else if (Object.op_Implicit((Object)(object)val3)) { val3.m_statusEffect = ((Object)addToPrefab.Key.Effect).name; } else { Debug.LogWarning((object)("The prefab '" + ((Object)prefab).name + "' does not have an ItemDrop, AOE, or EffectArea component. Cannot add the StatusEffect to the prefab.")); } } catch (Exception arg) { Debug.LogWarning((object)$"BROKE : {arg}"); } } } } public static class StatusEffectManagerVersion { public const string Version = "1.0.0"; } } namespace PieceManager { [PublicAPI] public static class MaterialReplacer { public enum ShaderType { PieceShader, VegetationShader, RockShader, RugShader, GrassShader, CustomCreature, UseUnityShader } private static readonly Dictionary ObjectToSwap; private static readonly Dictionary OriginalMaterials; private static readonly Dictionary ObjectsForShaderReplace; private static readonly HashSet CachedShaders; private static bool hasRun; static MaterialReplacer() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown CachedShaders = new HashSet(); hasRun = false; OriginalMaterials = new Dictionary(); ObjectToSwap = new Dictionary(); ObjectsForShaderReplace = new Dictionary(); Harmony val = new Harmony("org.bepinex.helpers.PieceManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZoneSystem), "Start", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(MaterialReplacer), "ReplaceAllMaterialsWithOriginal", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static void RegisterGameObjectForShaderSwap(GameObject go, ShaderType type) { if (!ObjectsForShaderReplace.ContainsKey(go)) { ObjectsForShaderReplace.Add(go, type); } } public static void RegisterGameObjectForMatSwap(GameObject go, bool isJotunnMock = false) { if (!((Object)(object)go == (Object)null) && !ObjectToSwap.ContainsKey(go)) { ObjectToSwap.Add(go, isJotunnMock); } } private static void GetAllMaterials() { Material[] array = Resources.FindObjectsOfTypeAll(); foreach (Material val in array) { OriginalMaterials[((Object)val).name] = val; } } [HarmonyPriority(700)] private static void ReplaceAllMaterialsWithOriginal() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)SystemInfo.graphicsDeviceType == 4 || hasRun) { return; } if (OriginalMaterials.Count == 0) { GetAllMaterials(); } foreach (KeyValuePair item in ObjectToSwap) { GameObject key = item.Key; bool value = item.Value; ProcessGameObjectMaterials(key, value); } AssetBundle[] array = Resources.FindObjectsOfTypeAll(); AssetBundle[] array2 = array; foreach (AssetBundle val in array2) { IEnumerable enumerable3; try { IEnumerable enumerable2; if (!val.isStreamedSceneAssetBundle || !Object.op_Implicit((Object)(object)val)) { IEnumerable enumerable = val.LoadAllAssets(); enumerable2 = enumerable; } else { enumerable2 = from shader in ((IEnumerable)val.GetAllAssetNames()).Select((Func)val.LoadAsset) where (Object)(object)shader != (Object)null select shader; } enumerable3 = enumerable2; } catch (Exception) { continue; } if (enumerable3 == null) { continue; } foreach (Shader item2 in enumerable3) { CachedShaders.Add(item2); } } foreach (KeyValuePair item3 in ObjectsForShaderReplace) { GameObject key2 = item3.Key; ShaderType value2 = item3.Value; ProcessGameObjectShaders(key2, value2); } hasRun = true; } private static void ProcessGameObjectMaterials(GameObject go, bool isJotunnMock) { Renderer[] componentsInChildren = go.GetComponentsInChildren(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials.Select((Material material) => ((Object)(object)material == (Object)null) ? null : ReplaceMaterial(material, isJotunnMock)).ToArray(); val.sharedMaterials = sharedMaterials; } } private static Material ReplaceMaterial(Material originalMaterial, bool isJotunnMock) { if ((Object)(object)originalMaterial == (Object)null) { return null; } string text = (isJotunnMock ? "JVLmock_" : "_REPLACE_"); if (!((Object)originalMaterial).name.StartsWith(text, StringComparison.Ordinal)) { return originalMaterial; } string text2 = ((Object)originalMaterial).name.Replace(" (Instance)", "").Replace(text, ""); if (OriginalMaterials.TryGetValue(text2, out Material value)) { return value; } Debug.LogWarning((object)("No suitable material found to replace: " + text2)); return originalMaterial; } private static void ProcessGameObjectShaders(GameObject go, ShaderType shaderType) { Renderer[] componentsInChildren = go.GetComponentsInChildren(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] sharedMaterials = val.sharedMaterials; foreach (Material val2 in sharedMaterials) { if ((Object)(object)val2 != (Object)null) { val2.shader = GetShaderForType(val2.shader, shaderType, ((Object)val2.shader).name); } } } } private static Shader GetShaderForType(Shader orig, ShaderType shaderType, string originalShaderName) { return (Shader)(shaderType switch { ShaderType.PieceShader => FindShaderWithName(orig, "Custom/Piece"), ShaderType.VegetationShader => FindShaderWithName(orig, "Custom/Vegetation"), ShaderType.RockShader => FindShaderWithName(orig, "Custom/StaticRock"), ShaderType.RugShader => FindShaderWithName(orig, "Custom/Rug"), ShaderType.GrassShader => FindShaderWithName(orig, "Custom/Grass"), ShaderType.CustomCreature => FindShaderWithName(orig, "Custom/Creature"), ShaderType.UseUnityShader => FindShaderWithName(orig, ((Object)(object)FindShaderWithName(orig, originalShaderName) != (Object)null) ? originalShaderName : "ToonDeferredShading2017"), _ => FindShaderWithName(orig, "Standard"), }); } public static Shader FindShaderWithName(Shader origShader, string name) { foreach (Shader cachedShader in CachedShaders) { if (((Object)cachedShader).name == name) { return cachedShader; } } return origShader; } } [PublicAPI] public enum CraftingTable { None, [InternalName("piece_workbench")] Workbench, [InternalName("piece_cauldron")] Cauldron, [InternalName("forge")] Forge, [InternalName("piece_artisanstation")] ArtisanTable, [InternalName("piece_stonecutter")] StoneCutter, [InternalName("piece_magetable")] MageTable, [InternalName("blackforge")] BlackForge, [InternalName("piece_preptable")] FoodPreparationTable, [InternalName("piece_MeadCauldron")] MeadKetill, Custom } public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [PublicAPI] public class ExtensionList { public readonly List ExtensionStations = new List(); public void Set(CraftingTable table, int maxStationDistance = 5) { ExtensionStations.Add(new ExtensionConfig { Table = table, maxStationDistance = maxStationDistance }); } public void Set(string customTable, int maxStationDistance = 5) { ExtensionStations.Add(new ExtensionConfig { Table = CraftingTable.Custom, custom = customTable, maxStationDistance = maxStationDistance }); } } public struct ExtensionConfig { public CraftingTable Table; public float maxStationDistance; public string? custom; } [PublicAPI] public class CraftingStationList { public readonly List Stations = new List(); public void Set(CraftingTable table) { Stations.Add(new CraftingStationConfig { Table = table }); } public void Set(string customTable) { Stations.Add(new CraftingStationConfig { Table = CraftingTable.Custom, custom = customTable }); } } public struct CraftingStationConfig { public CraftingTable Table; public int level; public string? custom; } [PublicAPI] public enum BuildPieceCategory { Misc = 0, Crafting = 1, BuildingWorkbench = 2, BuildingStonecutter = 3, Furniture = 4, All = 100, Custom = 99 } [PublicAPI] public class RequiredResourcesList { public readonly List Requirements = new List(); public void Add(string item, int amount, bool recover) { Requirements.Add(new Requirement { itemName = item, amount = amount, recover = recover }); } } public struct Requirement { public string itemName; public int amount; public bool recover; } public struct SpecialProperties { [Description("Admins should be the only ones that can build this piece.")] public bool AdminOnly; [Description("Turns off generating a config for this build piece.")] public bool NoConfig; } [PublicAPI] public class BuildingPieceCategory { public BuildPieceCategory Category; public string custom = ""; public void Set(BuildPieceCategory category) { Category = category; } public void Set(string customCategory) { Category = BuildPieceCategory.Custom; custom = customCategory; } } [PublicAPI] public class PieceTool { public readonly HashSet Tools = new HashSet(); public void Add(string tool) { Tools.Add(tool); } } [PublicAPI] public class BuildPiece { internal class PieceConfig { public ConfigEntry craft = null; public ConfigEntry category = null; public ConfigEntry customCategory = null; public ConfigEntry tools = null; public ConfigEntry extensionTable = null; public ConfigEntry customExtentionTable = null; public ConfigEntry maxStationDistance = null; public ConfigEntry table = null; public ConfigEntry customTable = null; } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string? Category; [UsedImplicitly] public Action? CustomDrawer; } private class SerializedRequirements { public readonly List Reqs; public SerializedRequirements(List reqs) { Reqs = reqs; } public SerializedRequirements(string reqs) { Reqs = reqs.Split(new char[1] { ',' }).Select(delegate(string r) { string[] array = r.Split(new char[1] { ':' }); Requirement result = default(Requirement); result.itemName = array[0]; result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2); bool result3 = default(bool); result.recover = array.Length <= 2 || !bool.TryParse(array[2], out result3) || result3; return result; }).ToList(); } public override string ToString() { return string.Join(",", Reqs.Select((Requirement r) => $"{r.itemName}:{r.amount}:{r.recover}")); } public static ItemDrop? fetchByName(ObjectDB objectDB, string name) { GameObject itemPrefab = objectDB.GetItemPrefab(name); ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)(((!string.IsNullOrWhiteSpace(((Object)plugin).name)) ? ("[" + ((Object)plugin).name + "]") : "") + " The required item '" + name + "' does not exist.")); } return val; } public static Requirement[] toPieceReqs(SerializedRequirements craft) { Dictionary dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func)((Requirement r) => r.itemName), (Func)delegate(Requirement r) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = ResItem(r); return (val == null) ? ((Requirement)null) : new Requirement { m_amount = r.amount, m_resItem = val, m_recover = r.recover }; }); return dictionary.Values.Where((Requirement v) => v != null).ToArray(); static ItemDrop? ResItem(Requirement r) { return fetchByName(ObjectDB.instance, r.itemName); } } } internal static readonly List registeredPieces = new List(); private static readonly Dictionary pieceMap = new Dictionary(); internal static Dictionary pieceConfigs = new Dictionary(); internal List Conversions = new List(); internal List conversions = new List(); [Description("Disables generation of the configs for your pieces. This is global, this turns it off for all pieces in your mod.")] public static bool ConfigurationEnabled = true; public readonly GameObject Prefab; [Description("Specifies the resources needed to craft the piece.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the building piece should need.")] public readonly RequiredResourcesList RequiredItems = new RequiredResourcesList(); [Description("Sets the category for the building piece.")] public readonly BuildingPieceCategory Category = new BuildingPieceCategory(); [Description("Specifies the tool needed to build your piece.\nUse .Add to add a tool.")] public readonly PieceTool Tool = new PieceTool(); [Description("Specifies the crafting station needed to build your piece.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.")] public CraftingStationList Crafting = new CraftingStationList(); [Description("Makes this piece a station extension")] public ExtensionList Extension = new ExtensionList(); [Description("Change the extended/special properties of your build piece.")] public SpecialProperties SpecialProperties; [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase? RecipeIsActive = null; private LocalizeKey? _name; private LocalizeKey? _description; internal string[] activeTools = null; private static object? configManager; private static Localization? _english; internal static BaseUnityPlugin? _plugin = null; private static bool hasConfigSync = true; private static object? _configSync; public LocalizeKey Name { get { LocalizeKey name = _name; if (name != null) { return name; } Piece component = Prefab.GetComponent(); if (component.m_name.StartsWith("$")) { _name = new LocalizeKey(component.m_name); } else { string text = "$piece_" + ((Object)Prefab).name.Replace(" ", "_"); _name = new LocalizeKey(text).English(component.m_name); component.m_name = text; } return _name; } } public LocalizeKey Description { get { LocalizeKey description = _description; if (description != null) { return description; } Piece component = Prefab.GetComponent(); if (component.m_description.StartsWith("$")) { _description = new LocalizeKey(component.m_description); } else { string text = "$piece_" + ((Object)Prefab).name.Replace(" ", "_") + "_description"; _description = new LocalizeKey(text).English(component.m_description); component.m_description = text; } return _description; } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); internal static BaseUnityPlugin plugin { get { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Expected O, but got Unknown if (_plugin != null) { return _plugin; } IEnumerable source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); return _plugin; } } private static object? configSync { get { if (_configSync != null || !hasConfigSync) { return _configSync; } Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " PieceManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } return _configSync; } } public BuildPiece(string assetBundleFileName, string prefabName, string folderName = "assets") : this(PiecePrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName) { } public BuildPiece(AssetBundle bundle, string prefabName) { Prefab = PiecePrefabManager.RegisterPrefab(bundle, prefabName); registeredPieces.Add(this); } internal static void Patch_FejdStartup(FejdStartup __instance) { //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Expected O, but got Unknown //IL_0431: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0410: Unknown result type (might be due to invalid IL or missing references) //IL_048c: Unknown result type (might be due to invalid IL or missing references) //IL_0496: Expected O, but got Unknown //IL_0606: Unknown result type (might be due to invalid IL or missing references) //IL_0610: Expected O, but got Unknown //IL_08ea: Unknown result type (might be due to invalid IL or missing references) //IL_08f4: Expected O, but got Unknown //IL_067b: Unknown result type (might be due to invalid IL or missing references) //IL_0685: Expected O, but got Unknown //IL_0721: Unknown result type (might be due to invalid IL or missing references) //IL_072b: Expected O, but got Unknown //IL_095f: Unknown result type (might be due to invalid IL or missing references) //IL_0969: Expected O, but got Unknown //IL_0b7e: Unknown result type (might be due to invalid IL or missing references) //IL_0b88: Expected O, but got Unknown //IL_0c18: Unknown result type (might be due to invalid IL or missing references) //IL_0c22: Expected O, but got Unknown Type configManagerType = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); configManager = ((configManagerType == null) ? null : Chainloader.ManagerObject.GetComponent(configManagerType)); foreach (BuildPiece registeredPiece in registeredPieces) { registeredPiece.activeTools = registeredPiece.Tool.Tools.DefaultIfEmpty("Hammer").ToArray(); if (registeredPiece.Category.Category != BuildPieceCategory.Custom) { registeredPiece.Prefab.GetComponent().m_category = (PieceCategory)registeredPiece.Category.Category; } else { registeredPiece.Prefab.GetComponent().m_category = PiecePrefabManager.GetCategory(registeredPiece.Category.custom); } } if (!ConfigurationEnabled) { return; } bool saveOnConfigSet = plugin.Config.SaveOnConfigSet; plugin.Config.SaveOnConfigSet = false; foreach (BuildPiece registeredPiece2 in registeredPieces) { BuildPiece piece = registeredPiece2; if (piece.SpecialProperties.NoConfig) { continue; } PieceConfig pieceConfig2 = (pieceConfigs[piece] = new PieceConfig()); PieceConfig cfg = pieceConfig2; Piece piecePrefab2 = piece.Prefab.GetComponent(); string pieceName = piecePrefab2.m_name; string englishName = new Regex("[=\\n\\t\\\\\"\\'\\[\\]]*").Replace(english.Localize(pieceName), "").Trim(); string localizedName = Localization.instance.Localize(pieceName).Trim(); int order = 0; cfg.category = config(englishName, "Build Table Category", piece.Category.Category, new ConfigDescription("Build Category where " + localizedName + " is available.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Category = localizedName } })); ConfigurationManagerAttributes customTableAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = (cfg.category.Value == BuildPieceCategory.Custom), Category = localizedName }; cfg.customCategory = config(englishName, "Custom Build Category", piece.Category.custom, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.category.SettingChanged += BuildTableConfigChanged; cfg.customCategory.SettingChanged += BuildTableConfigChanged; if (cfg.category.Value == BuildPieceCategory.Custom) { piecePrefab2.m_category = PiecePrefabManager.GetCategory(cfg.customCategory.Value); } else { piecePrefab2.m_category = (PieceCategory)cfg.category.Value; } cfg.tools = config(englishName, "Tools", string.Join(", ", piece.activeTools), new ConfigDescription("Comma separated list of tools where " + localizedName + " is available.", (AcceptableValueBase)null, new object[1] { customTableAttributes })); piece.activeTools = (from s in cfg.tools.Value.Split(new char[1] { ',' }) select s.Trim()).ToArray(); cfg.tools.SettingChanged += delegate { Inventory[] source = (from c in Player.s_players.Select((Player p) => ((Humanoid)p).GetInventory()).Concat(from c in Object.FindObjectsOfType() select c.GetInventory()) where c != null select c).ToArray(); Dictionary> dictionary = (from kv in (from i in (from p in ObjectDB.instance.m_items select p.GetComponent() into c where Object.op_Implicit((Object)(object)c) && Object.op_Implicit((Object)(object)((Component)c).GetComponent()) select c).Concat(ItemDrop.s_instances) select new KeyValuePair(Utils.GetPrefabName(((Component)i).gameObject), i.m_itemData)).Concat(from i in source.SelectMany((Inventory i) => i.GetAllItems()) select new KeyValuePair(((Object)i.m_dropPrefab).name, i)) where Object.op_Implicit((Object)(object)kv.Value.m_shared.m_buildPieces) group kv by kv.Key).ToDictionary((IGrouping> g) => g.Key, (IGrouping> g) => g.Select((KeyValuePair kv) => kv.Value.m_shared.m_buildPieces).Distinct().ToList()); string[] array5 = piece.activeTools; foreach (string key in array5) { if (dictionary.TryGetValue(key, out var value3)) { foreach (PieceTable item3 in value3) { item3.m_pieces.Remove(piece.Prefab); } } } piece.activeTools = (from s in cfg.tools.Value.Split(new char[1] { ',' }) select s.Trim()).ToArray(); if (Object.op_Implicit((Object)(object)ObjectDB.instance)) { string[] array6 = piece.activeTools; foreach (string key2 in array6) { if (dictionary.TryGetValue(key2, out var value4)) { foreach (PieceTable item4 in value4) { if (!item4.m_pieces.Contains(piece.Prefab)) { item4.m_pieces.Add(piece.Prefab); } } } } if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { PiecePrefabManager.CategoryRefreshNeeded = true; ((Humanoid)Player.m_localPlayer).SetPlaceMode(Player.m_localPlayer.m_buildPieces); } } }; StationExtension pieceExtensionComp; List hideWhenNoneAttributes2; if (piece.Extension.ExtensionStations.Count > 0) { pieceExtensionComp = piece.Prefab.GetOrAddComponent(); PieceConfig pieceConfig3 = cfg; string group = englishName; CraftingTable table = piece.Extension.ExtensionStations.First().Table; string text = "Crafting station that " + localizedName + " extends."; object[] array = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes = new ConfigurationManagerAttributes(); int num = order - 1; order = num; configurationManagerAttributes.Order = num; array[0] = configurationManagerAttributes; pieceConfig3.extensionTable = config(group, "Extends Station", table, new ConfigDescription(text, (AcceptableValueBase)null, array)); cfg.customExtentionTable = config(englishName, "Custom Extend Station", piece.Extension.ExtensionStations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); PieceConfig pieceConfig4 = cfg; string group2 = englishName; float maxStationDistance = piece.Extension.ExtensionStations.First().maxStationDistance; string text2 = "Distance from the station that " + localizedName + " can be placed."; object[] array2 = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes2 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes2.Order = num; array2[0] = configurationManagerAttributes2; pieceConfig4.maxStationDistance = config(group2, "Max Station Distance", maxStationDistance, new ConfigDescription(text2, (AcceptableValueBase)null, array2)); hideWhenNoneAttributes2 = new List(); cfg.extensionTable.SettingChanged += ExtensionTableConfigChanged; cfg.customExtentionTable.SettingChanged += ExtensionTableConfigChanged; cfg.maxStationDistance.SettingChanged += ExtensionTableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes3 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes3.Order = num; configurationManagerAttributes3.Browsable = cfg.extensionTable.Value != CraftingTable.None; ConfigurationManagerAttributes item = configurationManagerAttributes3; hideWhenNoneAttributes2.Add(item); } List hideWhenNoneAttributes; if (piece.Crafting.Stations.Count > 0) { hideWhenNoneAttributes = new List(); PieceConfig pieceConfig5 = cfg; string group3 = englishName; CraftingTable table2 = piece.Crafting.Stations.First().Table; string text3 = "Crafting station where " + localizedName + " is available."; object[] array3 = new object[1]; ConfigurationManagerAttributes configurationManagerAttributes4 = new ConfigurationManagerAttributes(); int num = order - 1; order = num; configurationManagerAttributes4.Order = num; array3[0] = configurationManagerAttributes4; pieceConfig5.table = config(group3, "Crafting Station", table2, new ConfigDescription(text3, (AcceptableValueBase)null, array3)); cfg.customTable = config(englishName, "Custom Crafting Station", piece.Crafting.Stations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.table.SettingChanged += TableConfigChanged; cfg.customTable.SettingChanged += TableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes5 = new ConfigurationManagerAttributes(); num = order - 1; order = num; configurationManagerAttributes5.Order = num; configurationManagerAttributes5.Browsable = cfg.table.Value != CraftingTable.None; ConfigurationManagerAttributes item2 = configurationManagerAttributes5; hideWhenNoneAttributes.Add(item2); } cfg.craft = itemConfig("Crafting Costs", new SerializedRequirements(piece.RequiredItems.Requirements).ToString(), "Item costs to craft " + localizedName); cfg.craft.SettingChanged += delegate { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") != (Object)null) { Requirement[] resources = SerializedRequirements.toPieceReqs(new SerializedRequirements(cfg.craft.Value)); piecePrefab2.m_resources = resources; Piece[] array4 = Object.FindObjectsOfType(); foreach (Piece val in array4) { if (val.m_name == pieceName) { val.m_resources = resources; } } } }; for (int j = 0; j < piece.Conversions.Count; j++) { string text4 = ((piece.Conversions.Count > 1) ? $"{j + 1}. " : ""); Conversion conversion = piece.Conversions[j]; conversion.config = new Conversion.ConversionConfig(); int index = j; conversion.config.input = config(englishName, text4 + "Conversion Input Item", conversion.Input, new ConfigDescription("Conversion input item within " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName } })); conversion.config.input.SettingChanged += delegate { if (index < piece.conversions.Count) { ObjectDB instance2 = ObjectDB.instance; if (instance2 != null) { ItemDrop from = SerializedRequirements.fetchByName(instance2, conversion.config.input.Value); piece.conversions[index].m_from = from; } } }; conversion.config.output = config(englishName, text4 + "Conversion Output Item", conversion.Output, new ConfigDescription("Conversion output item within " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName } })); conversion.config.output.SettingChanged += delegate { if (index < piece.conversions.Count) { ObjectDB instance = ObjectDB.instance; if (instance != null) { ItemDrop to = SerializedRequirements.fetchByName(instance, conversion.config.output.Value); piece.conversions[index].m_to = to; } } }; } void BuildTableConfigChanged(object o, EventArgs e) { //IL_0066: 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_0047: Unknown result type (might be due to invalid IL or missing references) if (registeredPieces.Count > 0) { if (cfg.category.Value == BuildPieceCategory.Custom) { piecePrefab2.m_category = PiecePrefabManager.GetCategory(cfg.customCategory.Value); } else { piecePrefab2.m_category = (PieceCategory)cfg.category.Value; } if (Object.op_Implicit((Object)(object)Hud.instance)) { PiecePrefabManager.CategoryRefreshNeeded = true; PiecePrefabManager.CreateCategoryTabs(); } } customTableAttributes.Browsable = cfg.category.Value == BuildPieceCategory.Custom; ReloadConfigDisplay(); } void ExtensionTableConfigChanged(object o, EventArgs e) { if (piece.RequiredItems.Requirements.Count > 0) { CraftingTable value2 = cfg.extensionTable.Value; CraftingTable craftingTable = value2; if (craftingTable == CraftingTable.Custom) { StationExtension obj2 = pieceExtensionComp; GameObject prefab2 = ZNetScene.instance.GetPrefab(cfg.customExtentionTable.Value); obj2.m_craftingStation = ((prefab2 != null) ? prefab2.GetComponent() : null); } else { pieceExtensionComp.m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(cfg.extensionTable.Value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } pieceExtensionComp.m_maxStationDistance = cfg.maxStationDistance.Value; } customTableAttributes.Browsable = cfg.extensionTable.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item5 in hideWhenNoneAttributes2) { item5.Browsable = cfg.extensionTable.Value != CraftingTable.None; } ReloadConfigDisplay(); plugin.Config.Save(); } void TableConfigChanged(object o, EventArgs e) { if (piece.RequiredItems.Requirements.Count > 0) { switch (cfg.table.Value) { case CraftingTable.None: piecePrefab2.m_craftingStation = null; break; case CraftingTable.Custom: { Piece obj = piecePrefab2; GameObject prefab = ZNetScene.instance.GetPrefab(cfg.customTable.Value); obj.m_craftingStation = ((prefab != null) ? prefab.GetComponent() : null); break; } default: piecePrefab2.m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(cfg.table.Value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); break; } } customTableAttributes.Browsable = cfg.table.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item6 in hideWhenNoneAttributes) { item6.Browsable = cfg.table.Value != CraftingTable.None; } ReloadConfigDisplay(); plugin.Config.Save(); } ConfigEntry itemConfig(string name, string value, string desc) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes6 = new ConfigurationManagerAttributes { CustomDrawer = DrawConfigTable, Order = (order -= 1), Category = localizedName }; return config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes6 })); } } foreach (BuildPiece registeredPiece3 in registeredPieces) { ConfigEntryBase enabledCfg = registeredPiece3.RecipeIsActive; Piece piecePrefab; if (enabledCfg != null) { piecePrefab = registeredPiece3.Prefab.GetComponent(); ConfigChanged(null, null); ((object)enabledCfg).GetType().GetEvent("SettingChanged").AddEventHandler(enabledCfg, new EventHandler(ConfigChanged)); } registeredPiece3.InitializeNewRegisteredPiece(registeredPiece3); void ConfigChanged(object? o, EventArgs? e) { piecePrefab.m_enabled = (int)enabledCfg.BoxedValue != 0; } } if (saveOnConfigSet) { plugin.Config.SaveOnConfigSet = true; plugin.Config.Save(); } void ReloadConfigDisplay() { object obj3 = configManagerType?.GetProperty("DisplayingWindow").GetValue(configManager); if (obj3 is bool && (bool)obj3) { configManagerType.GetMethod("BuildSettingList").Invoke(configManager, Array.Empty()); } } } private void InitializeNewRegisteredPiece(BuildPiece piece) { ConfigEntryBase recipeIsActive = piece.RecipeIsActive; PieceConfig cfg; Piece piecePrefab; string pieceName; if (recipeIsActive != null) { pieceConfigs.TryGetValue(piece, out cfg); piecePrefab = piece.Prefab.GetComponent(); pieceName = piecePrefab.m_name; ((object)recipeIsActive).GetType().GetEvent("SettingChanged").AddEventHandler(recipeIsActive, new EventHandler(ConfigChanged)); } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") != (Object)null && cfg != null) { Requirement[] resources = SerializedRequirements.toPieceReqs(new SerializedRequirements(cfg.craft.Value)); piecePrefab.m_resources = resources; Piece[] array = Object.FindObjectsOfType(); foreach (Piece val in array) { if (val.m_name == pieceName) { val.m_resources = resources; } } } } } [HarmonyPriority(700)] internal static void Patch_ObjectDBInit(ObjectDB __instance) { //IL_0489: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_04f9: Expected O, but got Unknown if ((Object)(object)__instance.GetItemPrefab("YmirRemains") == (Object)null) { return; } foreach (BuildPiece registeredPiece in registeredPieces) { pieceConfigs.TryGetValue(registeredPiece, out PieceConfig value); registeredPiece.Prefab.GetComponent().m_resources = SerializedRequirements.toPieceReqs((value == null) ? new SerializedRequirements(registeredPiece.RequiredItems.Requirements) : new SerializedRequirements(value.craft.Value)); foreach (ExtensionConfig extensionStation in registeredPiece.Extension.ExtensionStations) { switch ((value == null || registeredPiece.Extension.ExtensionStations.Count > 1) ? extensionStation.Table : value.extensionTable.Value) { case CraftingTable.None: registeredPiece.Prefab.GetComponent().m_craftingStation = null; break; case CraftingTable.Custom: { GameObject prefab = ZNetScene.instance.GetPrefab((value == null || registeredPiece.Extension.ExtensionStations.Count > 0) ? extensionStation.custom : value.customExtentionTable.Value); if (prefab != null) { registeredPiece.Prefab.GetComponent().m_craftingStation = prefab.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((value == null || registeredPiece.Extension.ExtensionStations.Count > 0) ? extensionStation.custom : value.customExtentionTable.Value) + "' does not exist")); } break; } default: if (value != null && value.table.Value == CraftingTable.None) { registeredPiece.Prefab.GetComponent().m_craftingStation = null; } else { registeredPiece.Prefab.GetComponent().m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(((value == null || registeredPiece.Extension.ExtensionStations.Count > 1) ? extensionStation.Table : value.extensionTable.Value).ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } break; } } foreach (CraftingStationConfig station in registeredPiece.Crafting.Stations) { switch ((value == null || registeredPiece.Crafting.Stations.Count > 1) ? station.Table : value.table.Value) { case CraftingTable.None: registeredPiece.Prefab.GetComponent().m_craftingStation = null; break; case CraftingTable.Custom: { GameObject prefab2 = ZNetScene.instance.GetPrefab((value == null || registeredPiece.Crafting.Stations.Count > 0) ? station.custom : value.customTable.Value); if (prefab2 != null) { registeredPiece.Prefab.GetComponent().m_craftingStation = prefab2.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((value == null || registeredPiece.Crafting.Stations.Count > 0) ? station.custom : value.customTable.Value) + "' does not exist")); } break; } default: if (value != null && value.table.Value == CraftingTable.None) { registeredPiece.Prefab.GetComponent().m_craftingStation = null; } else { registeredPiece.Prefab.GetComponent().m_craftingStation = ZNetScene.instance.GetPrefab(((InternalName)typeof(CraftingTable).GetMember(((value == null || registeredPiece.Crafting.Stations.Count > 1) ? station.Table : value.table.Value).ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName).GetComponent(); } break; } } registeredPiece.conversions = new List(); for (int i = 0; i < registeredPiece.Conversions.Count; i++) { Conversion conversion = registeredPiece.Conversions[i]; registeredPiece.conversions.Add(new ItemConversion { m_from = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.input.Value ?? conversion.Input), m_to = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.output.Value ?? conversion.Output) }); if (registeredPiece.conversions[i].m_from != null && registeredPiece.conversions[i].m_to != null) { registeredPiece.Prefab.GetComponent().m_conversion.Add(registeredPiece.conversions[i]); } } } } public void Snapshot(float lightIntensity = 1.3f, Quaternion? cameraRotation = null) { SnapshotPiece(Prefab, lightIntensity, cameraRotation); } internal void SnapshotPiece(GameObject prefab, float lightIntensity = 1.3f, Quaternion? cameraRotation = null) { //IL_0055: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_036f: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Expected O, but got Unknown //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_03d5: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)prefab == (Object)null) && (prefab.GetComponentsInChildren().Any() || prefab.GetComponentsInChildren().Any())) { Camera component = new GameObject("CameraIcon", new Type[1] { typeof(Camera) }).GetComponent(); component.backgroundColor = Color.clear; component.clearFlags = (CameraClearFlags)2; ((Component)component).transform.position = new Vector3(10000f, 10000f, 10000f); ((Component)component).transform.rotation = (Quaternion)(((??)cameraRotation) ?? Quaternion.Euler(0f, 180f, 0f)); component.fieldOfView = 0.5f; component.farClipPlane = 100000f; component.cullingMask = 8; Light component2 = new GameObject("LightIcon", new Type[1] { typeof(Light) }).GetComponent(); ((Component)component2).transform.position = new Vector3(10000f, 10000f, 10000f); ((Component)component2).transform.rotation = Quaternion.Euler(5f, 180f, 5f); component2.type = (LightType)1; component2.cullingMask = 8; component2.intensity = lightIntensity; GameObject val = Object.Instantiate(prefab); Transform[] componentsInChildren = val.GetComponentsInChildren(); foreach (Transform val2 in componentsInChildren) { ((Component)val2).gameObject.layer = 3; } val.transform.position = Vector3.zero; val.transform.rotation = Quaternion.Euler(23f, 51f, 25.8f); ((Object)val).name = ((Object)prefab).name; MeshRenderer[] componentsInChildren2 = val.GetComponentsInChildren(); Vector3 val3 = componentsInChildren2.Aggregate(Vector3.positiveInfinity, delegate(Vector3 cur, MeshRenderer renderer) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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) Bounds bounds2 = ((Renderer)renderer).bounds; return Vector3.Min(cur, ((Bounds)(ref bounds2)).min); }); Vector3 val4 = componentsInChildren2.Aggregate(Vector3.negativeInfinity, delegate(Vector3 cur, MeshRenderer renderer) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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) Bounds bounds = ((Renderer)renderer).bounds; return Vector3.Max(cur, ((Bounds)(ref bounds)).max); }); val.transform.position = new Vector3(10000f, 10000f, 10000f) - (val3 + val4) / 2f; Vector3 val5 = val4 - val3; TimedDestruction val6 = val.AddComponent(); val6.Trigger(1f); Rect val7 = default(Rect); ((Rect)(ref val7))..ctor(0f, 0f, 128f, 128f); component.targetTexture = RenderTexture.GetTemporary((int)((Rect)(ref val7)).width, (int)((Rect)(ref val7)).height); component.fieldOfView = 20f; float num = Mathf.Max(val5.x, val5.y) + 0.1f; float num2 = num / Mathf.Tan(component.fieldOfView * ((float)Math.PI / 180f)) * 1.1f; ((Component)component).transform.position = new Vector3(10000f, 10000f, 10000f) + new Vector3(0f, 0f, num2); component.Render(); RenderTexture active = RenderTexture.active; RenderTexture.active = component.targetTexture; Texture2D val8 = new Texture2D((int)((Rect)(ref val7)).width, (int)((Rect)(ref val7)).height, (TextureFormat)4, false); val8.ReadPixels(new Rect(0f, 0f, (float)(int)((Rect)(ref val7)).width, (float)(int)((Rect)(ref val7)).height), 0, 0); val8.Apply(); RenderTexture.active = active; prefab.GetComponent().m_icon = Sprite.Create(val8, new Rect(0f, 0f, (float)(int)((Rect)(ref val7)).width, (float)(int)((Rect)(ref val7)).height), Vector2.one / 2f); ((Component)component2).gameObject.SetActive(false); component.targetTexture.Release(); ((Component)component).gameObject.SetActive(false); val.SetActive(false); Object.DestroyImmediate((Object)(object)val); Object.Destroy((Object)(object)component); Object.Destroy((Object)(object)component2); Object.Destroy((Object)(object)((Component)component).gameObject); Object.Destroy((Object)(object)((Component)component2).gameObject); } } private static void DrawConfigTable(ConfigEntryBase cfg) { //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected O, but got Unknown //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Expected O, but got Unknown //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Expected O, but got Unknown bool valueOrDefault = cfg.Description.Tags.Select((object a) => (a.GetType().Name == "ConfigurationManagerAttributes") ? ((bool?)a.GetType().GetField("ReadOnly")?.GetValue(a)) : null).FirstOrDefault((bool? v) => v.HasValue).GetValueOrDefault(); List list = new List(); bool flag = false; int num = (int)(configManager?.GetType().GetProperty("RightColumnWidth", BindingFlags.Instance | BindingFlags.NonPublic).GetGetMethod(nonPublic: true) .Invoke(configManager, Array.Empty()) ?? ((object)130)); GUILayout.BeginVertical(Array.Empty()); foreach (Requirement req in new SerializedRequirements((string)cfg.BoxedValue).Reqs) { GUILayout.BeginHorizontal(Array.Empty()); int num2 = req.amount; if (int.TryParse(GUILayout.TextField(num2.ToString(), new GUIStyle(GUI.skin.textField) { fixedWidth = 40f }, Array.Empty()), out var result) && result != num2 && !valueOrDefault) { num2 = result; flag = true; } string text = GUILayout.TextField(req.itemName, new GUIStyle(GUI.skin.textField) { fixedWidth = num - 40 - 67 - 21 - 21 - 12 }, Array.Empty()); string text2 = (valueOrDefault ? req.itemName : text); flag = flag || text2 != req.itemName; bool flag2 = req.recover; if (GUILayout.Toggle(req.recover, "Recover", new GUIStyle(GUI.skin.toggle) { fixedWidth = 67f }, Array.Empty()) != req.recover) { flag2 = !flag2; flag = true; } if (GUILayout.Button("x", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault) { flag = true; } else { list.Add(new Requirement { amount = num2, itemName = text2, recover = flag2 }); } if (GUILayout.Button("+", new GUIStyle(GUI.skin.button) { fixedWidth = 21f }, Array.Empty()) && !valueOrDefault) { flag = true; list.Add(new Requirement { amount = 1, itemName = "", recover = false }); } GUILayout.EndHorizontal(); } GUILayout.EndVertical(); if (flag) { cfg.BoxedValue = new SerializedRequirements(list).ToString(); } } private static ConfigEntry config(string group, string name, T value, ConfigDescription description) { ConfigEntry val = plugin.Config.Bind(group, name, value, description); configSync?.GetType().GetMethod("AddConfigEntry").MakeGenericMethod(typeof(T)) .Invoke(configSync, new object[1] { val }); return val; } private static ConfigEntry config(string group, string name, T value, string description) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown return config(group, name, value, new ConfigDescription(description, (AcceptableValueBase)null, Array.Empty())); } } public static class GoExtensions { public static T GetOrAddComponent(this GameObject gameObject) where T : Component { return gameObject.GetComponent() ?? gameObject.AddComponent(); } } [PublicAPI] public class LocalizeKey { private static readonly List keys = new List(); public readonly string Key; public readonly Dictionary Localizations = new Dictionary(); public LocalizeKey(string key) { Key = key.Replace("$", ""); keys.Add(this); } public void Alias(string alias) { Localizations.Clear(); if (!alias.Contains("$")) { alias = "$" + alias; } Localizations["alias"] = alias; if (Localization.m_instance != null) { Localization.instance.AddWord(Key, Localization.instance.Localize(alias)); } } public LocalizeKey English(string key) { return addForLang("English", key); } public LocalizeKey Swedish(string key) { return addForLang("Swedish", key); } public LocalizeKey French(string key) { return addForLang("French", key); } public LocalizeKey Italian(string key) { return addForLang("Italian", key); } public LocalizeKey German(string key) { return addForLang("German", key); } public LocalizeKey Spanish(string key) { return addForLang("Spanish", key); } public LocalizeKey Russian(string key) { return addForLang("Russian", key); } public LocalizeKey Romanian(string key) { return addForLang("Romanian", key); } public LocalizeKey Bulgarian(string key) { return addForLang("Bulgarian", key); } public LocalizeKey Macedonian(string key) { return addForLang("Macedonian", key); } public LocalizeKey Finnish(string key) { return addForLang("Finnish", key); } public LocalizeKey Danish(string key) { return addForLang("Danish", key); } public LocalizeKey Norwegian(string key) { return addForLang("Norwegian", key); } public LocalizeKey Icelandic(string key) { return addForLang("Icelandic", key); } public LocalizeKey Turkish(string key) { return addForLang("Turkish", key); } public LocalizeKey Lithuanian(string key) { return addForLang("Lithuanian", key); } public LocalizeKey Czech(string key) { return addForLang("Czech", key); } public LocalizeKey Hungarian(string key) { return addForLang("Hungarian", key); } public LocalizeKey Slovak(string key) { return addForLang("Slovak", key); } public LocalizeKey Polish(string key) { return addForLang("Polish", key); } public LocalizeKey Dutch(string key) { return addForLang("Dutch", key); } public LocalizeKey Portuguese_European(string key) { return addForLang("Portuguese_European", key); } public LocalizeKey Portuguese_Brazilian(string key) { return addForLang("Portuguese_Brazilian", key); } public LocalizeKey Chinese(string key) { return addForLang("Chinese", key); } public LocalizeKey Japanese(string key) { return addForLang("Japanese", key); } public LocalizeKey Korean(string key) { return addForLang("Korean", key); } public LocalizeKey Hindi(string key) { return addForLang("Hindi", key); } public LocalizeKey Thai(string key) { return addForLang("Thai", key); } public LocalizeKey Abenaki(string key) { return addForLang("Abenaki", key); } public LocalizeKey Croatian(string key) { return addForLang("Croatian", key); } public LocalizeKey Georgian(string key) { return addForLang("Georgian", key); } public LocalizeKey Greek(string key) { return addForLang("Greek", key); } public LocalizeKey Serbian(string key) { return addForLang("Serbian", key); } public LocalizeKey Ukrainian(string key) { return addForLang("Ukrainian", key); } private LocalizeKey addForLang(string lang, string value) { Localizations[lang] = value; if (Localization.m_instance != null) { if (Localization.instance.GetSelectedLanguage() == lang) { Localization.instance.AddWord(Key, value); } else if (lang == "English" && !Localization.instance.m_translations.ContainsKey(Key)) { Localization.instance.AddWord(Key, value); } } return this; } [HarmonyPriority(300)] internal static void AddLocalizedKeys(Localization __instance, string language) { foreach (LocalizeKey key in keys) { string value2; if (key.Localizations.TryGetValue(language, out string value) || key.Localizations.TryGetValue("English", out value)) { __instance.AddWord(key.Key, value); } else if (key.Localizations.TryGetValue("alias", out value2)) { __instance.AddWord(key.Key, Localization.instance.Localize(value2)); } } } } public static class LocalizationCache { private static readonly Dictionary localizations = new Dictionary(); internal static void LocalizationPostfix(Localization __instance, string language) { Localization __instance2 = __instance; string key = localizations.FirstOrDefault>((KeyValuePair l) => l.Value == __instance2).Key; if (key != null) { localizations.Remove(key); } if (!localizations.ContainsKey(language)) { localizations.Add(language, __instance2); } } public static Localization ForLanguage(string? language = null) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (localizations.TryGetValue(language ?? PlayerPrefs.GetString("language", "English"), out Localization value)) { return value; } value = new Localization(); if (language != null) { value.SetupLanguage(language); } return value; } } public class AdminSyncing { [CompilerGenerated] private sealed class <g__WatchAdminListChanges|2_0>d : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; private List 5__1; private List 5__2; private List 5__3; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <g__WatchAdminListChanges|2_0>d(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { 5__1 = null; 5__2 = null; 5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; if (!ZNet.instance.m_adminList.GetList().SequenceEqual(5__1)) { 5__1 = new List(ZNet.instance.m_adminList.GetList()); 5__2 = (from p in ZNet.instance.GetPeers() where ZNet.instance.ListContainsId(ZNet.instance.m_adminList, p.m_rpc.GetSocket().GetHostName()) select p).ToList(); 5__3 = ZNet.instance.GetPeers().Except(5__2).ToList(); g__SendAdmin|2_2(5__3, isAdmin: false); g__SendAdmin|2_2(5__2, isAdmin: true); 5__2 = null; 5__3 = null; } } else { <>1__state = -1; 5__1 = new List(ZNet.instance.m_adminList.GetList()); } <>2__current = (object)new WaitForSeconds(30f); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <>c__DisplayClass3_0 { public ZPackage package; internal IEnumerator b__1(ZNetPeer p) { return TellPeerAdminStatus(p, package); } } [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <>c__DisplayClass4_0 { public ZNetPeer peer; public ZRoutedRpc rpc; } [CompilerGenerated] private sealed class d__4 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private bool <>2__current; public ZNetPeer peer; public ZPackage package; private <>c__DisplayClass4_0 <>8__1; bool IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = default(<>c__DisplayClass4_0); <>1__state = -2; } private bool MoveNext() { if (<>1__state != 0) { return false; } <>1__state = -1; <>8__1.peer = peer; <>8__1.rpc = ZRoutedRpc.instance; if (<>8__1.rpc == null) { return false; } g__SendPackage|4_0(package, ref <>8__1); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class d__3 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public List peers; public ZPackage package; private <>c__DisplayClass3_0 <>8__1; private byte[] 5__2; private List> 5__3; private ZPackage 5__4; private MemoryStream 5__5; private DeflateStream 5__6; object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>8__1 = null; 5__2 = null; 5__3 = null; 5__4 = null; 5__5 = null; 5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>8__1 = new <>c__DisplayClass3_0(); <>8__1.package = package; if (!Object.op_Implicit((Object)(object)ZNet.instance)) { return false; } 5__2 = <>8__1.package.GetArray(); if (5__2 != null && 5__2.LongLength > 10000) { 5__4 = new ZPackage(); 5__4.Write(4); 5__5 = new MemoryStream(); 5__6 = new DeflateStream(5__5, CompressionLevel.Optimal); try { 5__6.Write(5__2, 0, 5__2.Length); } finally { if (5__6 != null) { ((IDisposable)5__6).Dispose(); } } 5__6 = null; 5__4.Write(5__5.ToArray()); <>8__1.package = 5__4; 5__4 = null; 5__5 = null; } 5__3 = (from peer in peers where peer.IsReady() select peer into p select TellPeerAdminStatus(p, <>8__1.package)).ToList(); 5__3.RemoveAll((IEnumerator writer) => !writer.MoveNext()); break; case 1: <>1__state = -1; 5__3.RemoveAll((IEnumerator writer) => !writer.MoveNext()); break; } if (5__3.Count > 0) { <>2__current = null; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static bool isServer; internal static bool registeredOnClient; [HarmonyPriority(700)] internal static void AdminStatusSync(ZNet __instance) { isServer = __instance.IsServer(); if (BuildPiece._plugin != null) { if (isServer) { ZRoutedRpc.instance.Register(BuildPiece._plugin.Info.Metadata.Name + " PMAdminStatusSync", (Action)RPC_AdminPieceAddRemove); } else if (!registeredOnClient) { ZRoutedRpc.instance.Register(BuildPiece._plugin.Info.Metadata.Name + " PMAdminStatusSync", (Action)RPC_AdminPieceAddRemove); registeredOnClient = true; } } if (isServer) { ((MonoBehaviour)ZNet.instance).StartCoroutine(WatchAdminListChanges()); } [IteratorStateMachine(typeof(<g__WatchAdminListChanges|2_0>d))] static IEnumerator WatchAdminListChanges() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <g__WatchAdminListChanges|2_0>d(0); } } [IteratorStateMachine(typeof(d__3))] private static IEnumerator sendZPackage(List peers, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__3(0) { peers = peers, package = package }; } [IteratorStateMachine(typeof(d__4))] private static IEnumerator TellPeerAdminStatus(ZNetPeer peer, ZPackage package) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new d__4(0) { peer = peer, package = package }; } internal static void RPC_AdminPieceAddRemove(long sender, ZPackage package) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown ZNetPeer peer = ZNet.instance.GetPeer(sender); bool flag = false; try { flag = package.ReadBool(); } catch { } if (isServer) { ZRoutedRpc instance = ZRoutedRpc.instance; long everybody = ZRoutedRpc.Everybody; BaseUnityPlugin? plugin = BuildPiece._plugin; instance.InvokeRoutedRPC(everybody, ((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { (object)new ZPackage() }); if (ZNet.instance.ListContainsId(ZNet.instance.m_adminList, peer.m_rpc.GetSocket().GetHostName())) { ZPackage val = new ZPackage(); val.Write(true); ZRpc rpc = peer.m_rpc; BaseUnityPlugin? plugin2 = BuildPiece._plugin; rpc.Invoke(((plugin2 != null) ? plugin2.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { val }); } return; } foreach (BuildPiece registeredPiece in BuildPiece.registeredPieces) { if (!registeredPiece.SpecialProperties.AdminOnly) { continue; } Piece component = registeredPiece.Prefab.GetComponent(); string name = component.m_name; string text = Localization.instance.Localize(name).Trim(); if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || (Object)(object)ObjectDB.instance.GetItemPrefab("YmirRemains") == (Object)null) { continue; } Piece[] array = Object.FindObjectsOfType(); foreach (Piece val2 in array) { if (flag) { if (val2.m_name == name) { val2.m_enabled = true; } } else if (val2.m_name == name) { val2.m_enabled = false; } } List pieces = ObjectDB.instance.GetItemPrefab("Hammer").GetComponent().m_itemData.m_shared.m_buildPieces.m_pieces; if (flag) { if (!pieces.Contains(ZNetScene.instance.GetPrefab(((Object)component).name))) { pieces.Add(ZNetScene.instance.GetPrefab(((Object)component).name)); } } else if (pieces.Contains(ZNetScene.instance.GetPrefab(((Object)component).name))) { pieces.Remove(ZNetScene.instance.GetPrefab(((Object)component).name)); } } } [CompilerGenerated] internal static void g__SendAdmin|2_2(List peers, bool isAdmin) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ZPackage val = new ZPackage(); val.Write(isAdmin); ((MonoBehaviour)ZNet.instance).StartCoroutine(sendZPackage(peers, val)); } [CompilerGenerated] internal static void g__SendPackage|4_0(ZPackage pkg, ref <>c__DisplayClass4_0 P_1) { BaseUnityPlugin? plugin = BuildPiece._plugin; string text = ((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync"; if (isServer) { P_1.peer.m_rpc.Invoke(text, new object[1] { pkg }); } else { P_1.rpc.InvokeRoutedRPC(P_1.peer.m_server ? 0 : P_1.peer.m_uid, text, new object[1] { pkg }); } } } [HarmonyPatch(typeof(ZNet), "OnNewConnection")] internal class RegisterClientRPCPatch { private static void Postfix(ZNet __instance, ZNetPeer peer) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Expected O, but got Unknown if (!__instance.IsServer()) { ZRpc rpc = peer.m_rpc; BaseUnityPlugin? plugin = BuildPiece._plugin; rpc.Register(((plugin != null) ? plugin.Info.Metadata.Name : null) + " PMAdminStatusSync", (Action)RPC_InitialAdminSync); return; } ZPackage val = new ZPackage(); val.Write(__instance.ListContainsId(__instance.m_adminList, peer.m_rpc.GetSocket().GetHostName())); ZRpc rpc2 = peer.m_rpc; BaseUnityPlugin? plugin2 = BuildPiece._plugin; rpc2.Invoke(((plugin2 != null) ? plugin2.Info.Metadata.Name : null) + " PMAdminStatusSync", new object[1] { val }); } private static void RPC_InitialAdminSync(ZRpc rpc, ZPackage package) { AdminSyncing.RPC_AdminPieceAddRemove(0L, package); } } public static class PiecePrefabManager { private struct BundleId { [UsedImplicitly] public string assetBundleFileName; [UsedImplicitly] public string folderName; } private static readonly Dictionary bundleCache; private static readonly List piecePrefabs; private static readonly Dictionary PieceCategories; private static readonly Dictionary OtherPieceCategories; private static readonly Dictionary VanillaLabels; internal static bool CategoryRefreshNeeded; static PiecePrefabManager() { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Expected O, but got Unknown //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Expected O, but got Unknown //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Expected O, but got Unknown //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Expected O, but got Unknown //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Expected O, but got Unknown //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_02eb: Expected O, but got Unknown //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_0327: Expected O, but got Unknown //IL_0356: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Expected O, but got Unknown //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Expected O, but got Unknown //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03db: Expected O, but got Unknown //IL_040a: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Expected O, but got Unknown //IL_0446: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Expected O, but got Unknown bundleCache = new Dictionary(); piecePrefabs = new List(); PieceCategories = new Dictionary(); OtherPieceCategories = new Dictionary(); VanillaLabels = new Dictionary(); Harmony val = new Harmony("org.bepinex.helpers.PieceManager"); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(FejdStartup), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(BuildPiece), "Patch_FejdStartup", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "LoadCSV", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizeKey), "AddLocalizedKeys", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Localization), "SetupLanguage", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(LocalizationCache), "LocalizationPostfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(BuildPiece), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ObjectDB), "CopyOtherDB", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ObjectDBInit", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNet), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(AdminSyncing), "AdminStatusSync", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(ZNetScene), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RefFixPatch_ZNetSceneAwake", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(PieceTable), "UpdateAvailable", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Transpiler", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(PieceTable), "UpdateAvailable", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Prefix", (Type[])null, (Type[])null)), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "UpdateAvailable_Postfix", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Player), "SetPlaceMode", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Patch_SetPlaceMode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "Hud_AwakeCreateTabs", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "UpdateBuild", (Type[])null, (Type[])null), new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RepositionCatsIfNeeded", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Hud), "LateUpdate", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "RepositionCatsIfNeeded", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Enum), "GetValues", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "EnumGetValuesPatch", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); val.Patch((MethodBase)AccessTools.DeclaredMethod(typeof(Enum), "GetNames", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "EnumGetNamesPatch", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } public static AssetBundle RegisterAssetBundle(string assetBundleFileName, string folderName = "assets") { string assetBundleFileName2 = assetBundleFileName; BundleId bundleId = default(BundleId); bundleId.assetBundleFileName = assetBundleFileName2; bundleId.folderName = folderName; BundleId key = bundleId; if (!bundleCache.TryGetValue(key, out AssetBundle value)) { Dictionary dictionary = bundleCache; AssetBundle? obj = ((IEnumerable)Resources.FindObjectsOfTypeAll()).FirstOrDefault((Func)((AssetBundle a) => ((Object)a).name == assetBundleFileName2)) ?? AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + "." + folderName + "." + assetBundleFileName2)); AssetBundle result = obj; dictionary[key] = obj; return result; } return value; } public static IEnumerable FixRefs(AssetBundle assetBundle) { return assetBundle.LoadAllAssets(); } public static GameObject RegisterPrefab(string assetBundleFileName, string prefabName, string folderName = "assets") { return RegisterPrefab(RegisterAssetBundle(assetBundleFileName, folderName), prefabName); } public static GameObject RegisterPrefab(AssetBundle assets, string prefabName) { if ((Object)(object)assets == (Object)null) { Debug.LogError((object)"Failed to load asset bundle. Please make sure to mark all asset bundles as embedded resources."); return null; } GameObject val = assets.LoadAsset(prefabName); if ((Object)(object)val == (Object)null) { Debug.LogError((object)("Failed to load prefab " + prefabName + " from asset bundle " + ((Object)assets).name)); return null; } piecePrefabs.Add(val); return val; } public static Sprite RegisterSprite(string assetBundleFileName, string prefabName, string folderName = "assets") { return RegisterSprite(RegisterAssetBundle(assetBundleFileName, folderName), prefabName); } public static Sprite RegisterSprite(AssetBundle assets, string prefabName) { return assets.LoadAsset(prefabName); } private static void EnumGetValuesPatch(Type enumType, ref Array __result) { if (!(enumType != typeof(PieceCategory)) && PieceCategories.Count != 0) { PieceCategory[] array = (PieceCategory[])(object)new PieceCategory[__result.Length + PieceCategories.Count]; __result.CopyTo(array, 0); PieceCategories.Values.CopyTo(array, __result.Length); __result = array; } } private static void EnumGetNamesPatch(Type enumType, ref string[] __result) { if (!(enumType != typeof(PieceCategory)) && PieceCategories.Count != 0) { __result = CollectionExtensions.AddRangeToArray(__result, PieceCategories.Keys.ToArray()); } } public static Dictionary GetPieceCategoriesMap() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) Array values = Enum.GetValues(typeof(PieceCategory)); string[] names = Enum.GetNames(typeof(PieceCategory)); Dictionary dictionary = new Dictionary(); for (int i = 0; i < values.Length; i++) { dictionary[(PieceCategory)values.GetValue(i)] = names[i]; } return dictionary; } public static PieceCategory GetCategory(string name) { //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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) if (Enum.TryParse(name, ignoreCase: true, out PieceCategory result)) { return result; } if (PieceCategories.TryGetValue(name, out result)) { return result; } if (OtherPieceCategories.TryGetValue(name, out result)) { return result; } Dictionary pieceCategoriesMap = GetPieceCategoriesMap(); foreach (KeyValuePair item in pieceCategoriesMap) { if (item.Value == name) { result = item.Key; OtherPieceCategories[name] = result; return result; } } result = (PieceCategory)(pieceCategoriesMap.Count - 1); PieceCategories[name] = result; string categoryToken = GetCategoryToken(name); Localization.instance.AddWord(categoryToken, name); return result; } internal static void CreateCategoryTabs() { if (Object.op_Implicit((Object)(object)Hud.instance)) { int num = ModifiedMaxCategory(); for (int i = Hud.instance.m_pieceCategoryTabs.Length; i < num; i++) { GameObject val = CreateCategoryTab(); Hud.instance.m_pieceCategoryTabs = CollectionExtensions.AddItem((IEnumerable)Hud.instance.m_pieceCategoryTabs, val).ToArray(); } if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { RepositionCategories(Player.m_localPlayer.m_buildPieces); Player.m_localPlayer.UpdateAvailablePiecesList(); } } } private static GameObject CreateCategoryTab() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) GameObject val = Hud.instance.m_pieceCategoryTabs[0]; GameObject val2 = Object.Instantiate(Hud.instance.m_pieceCategoryTabs[0], val.transform.parent); val2.SetActive(false); UIInputHandler orAddComponent = val2.GetOrAddComponent(); orAddComponent.m_onLeftDown = (Action)Delegate.Combine(orAddComponent.m_onLeftDown, new Action(Hud.instance.OnLeftClickCategory)); TMP_Text[] componentsInChildren = val2.GetComponentsInChildren(); foreach (TMP_Text val3 in componentsInChildren) { val3.rectTransform.offsetMin = new Vector2(3f, 1f); val3.rectTransform.offsetMax = new Vector2(-3f, -1f); val3.enableAutoSizing = true; val3.fontSizeMin = 12f; val3.fontSizeMax = 20f; val3.lineSpacing = 0.8f; val3.textWrappingMode = (TextWrappingModes)1; val3.overflowMode = (TextOverflowModes)3; } return val2; } private static int ModifiedMaxCategory() { return Enum.GetValues(typeof(PieceCategory)).Length - 1; } private static int GetMaxCategoryOrDefault() { try { return (int)Enum.Parse(typeof(PieceCategory), "Max"); } catch (ArgumentException) { Debug.LogWarning((object)"Could not find Piece.PieceCategory.Max, using fallback value 4"); return 4; } } private static List TranspileMaxCategory(IEnumerable instructions, int maxOffset) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Expected O, but got Unknown //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown int num = GetMaxCategoryOrDefault() + maxOffset; List list = new List(); foreach (CodeInstruction instruction in instructions) { if (CodeInstructionExtensions.LoadsConstant(instruction, (long)num)) { list.Add(new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(PiecePrefabManager), "ModifiedMaxCategory", (Type[])null, (Type[])null))); if (maxOffset != 0) { list.Add(new CodeInstruction(OpCodes.Ldc_I4, (object)maxOffset)); list.Add(new CodeInstruction(OpCodes.Add, (object)null)); } } else { list.Add(instruction); } } return list; } private static IEnumerable UpdateAvailable_Transpiler(IEnumerable instructions) { return TranspileMaxCategory(instructions, 0); } private static HashSet CategoriesInPieceTable(PieceTable pieceTable) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) HashSet hashSet = new HashSet(); Piece val = default(Piece); foreach (GameObject item in pieceTable.m_pieces.Where((GameObject pieceFab) => (Object)(object)pieceFab != (Object)null)) { if (item.TryGetComponent(ref val)) { hashSet.Add(val.m_category); } } return hashSet; } private static void RepositionCatsIfNeeded() { if (CategoryRefreshNeeded) { CategoryRefreshNeeded = false; CreateCategoryTabs(); RepositionCats(); } } private static void RepositionCats() { if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Object.op_Implicit((Object)(object)Player.m_localPlayer.m_buildPieces)) { RepositionCategories(Player.m_localPlayer.m_buildPieces); } } private static void RepositionCategories(PieceTable pieceTable) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_021d: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Expected O, but got Unknown //IL_029b: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Unknown result type (might be due to invalid IL or missing references) RectTransform val = (RectTransform)Hud.instance.m_pieceCategoryTabs[0].transform; RectTransform val2 = (RectTransform)Hud.instance.m_pieceCategoryRoot.transform; RectTransform val3 = (RectTransform)Hud.instance.m_pieceSelectionWindow.transform; HorizontalLayoutGroup val4 = default(HorizontalLayoutGroup); if (((Component)((Transform)val).parent).TryGetComponent(ref val4)) { Object.DestroyImmediate((Object)(object)val4); } Rect rect = val.rect; Vector2 size = ((Rect)(ref rect)).size; GridLayoutGroup val5 = default(GridLayoutGroup); GridLayoutGroup val6 = (((Component)((Transform)val).parent).TryGetComponent(ref val5) ? val5 : ((Component)((Transform)val).parent).gameObject.AddComponent()); val6.cellSize = size; val6.spacing = new Vector2(0f, 1f); val6.constraint = (Constraint)1; val6.constraintCount = 5; ((LayoutGroup)val6).childAlignment = (TextAnchor)4; HashSet hashSet = CategoriesInPieceTable(pieceTable); UpdatePieceTableCategories(pieceTable, hashSet); rect = val2.rect; int num = Mathf.Max((int)(((Rect)(ref rect)).width / size.x), 1); int count = pieceTable.m_categories.Count; float num2 = (0f - size.x) * (float)num / 2f + size.x / 2f; float num3 = (size.y + 1f) * Mathf.Floor((float)(count - 1) / (float)num) + 5f; Vector2 val7 = default(Vector2); ((Vector2)(ref val7))..ctor(num2, num3); int num4 = Mathf.CeilToInt((float)count / (float)num); float num5 = (size.y + 1f) * (float)num4; RectTransform component = ((Component)((Transform)val).parent).GetComponent(); component.anchoredPosition = new Vector2(component.anchoredPosition.x, num5 / 2f); int num6 = 0; for (int i = 0; i < Hud.instance.m_pieceCategoryTabs.Length; i++) { GameObject val8 = Hud.instance.m_pieceCategoryTabs[i]; if ((Object)(object)val8 == (Object)null) { continue; } if (i >= pieceTable.m_categories.Count) { val8.SetActive(false); continue; } PieceCategory item = pieceTable.m_categories[i]; string text = pieceTable.m_categoryLabels[i]; if (hashSet.Contains(item)) { num6++; } val8.GetComponentInChildren().text = Localization.instance.Localize(text); } Transform obj = ((Transform)val3).Find("Bkg2"); RectTransform val9 = (RectTransform)((obj != null) ? ((Component)obj).transform : null); if (Object.op_Implicit((Object)(object)val9)) { float num7 = (size.y + 1f) * (float)Mathf.Max(0, Mathf.FloorToInt((float)(num6 - 1) / (float)num)); val9.offsetMax = new Vector2(val9.offsetMax.x, num7); } else { Debug.LogWarning((object)"RefreshCategories: Could not find background image"); } ((Component)Hud.instance).GetComponentInParent().RefreshLocalization(); } private static void UpdatePieceTableCategories(PieceTable pieceTable, HashSet visibleCategories) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < GetMaxCategoryOrDefault(); i++) { PieceCategory val = (PieceCategory)i; if (visibleCategories.Contains(val) && !pieceTable.m_categories.Contains(val)) { pieceTable.m_categories.Add(val); pieceTable.m_categoryLabels.Add(GetVanillaLabel(val)); } if (!visibleCategories.Contains(val) && pieceTable.m_categories.Contains(val)) { int index = pieceTable.m_categories.IndexOf(val); pieceTable.m_categories.RemoveAt(index); pieceTable.m_categoryLabels.RemoveAt(index); } } foreach (KeyValuePair pieceCategory in PieceCategories) { string key = pieceCategory.Key; PieceCategory value = pieceCategory.Value; if (visibleCategories.Contains(value) && !pieceTable.m_categories.Contains(value)) { pieceTable.m_categories.Add(value); pieceTable.m_categoryLabels.Add("$" + GetCategoryToken(key)); } if (visibleCategories.Contains(value) && !pieceTable.m_categoryLabels.Contains("$" + GetCategoryToken(key))) { pieceTable.m_categoryLabels.Add("$" + GetCategoryToken(key)); } if (!visibleCategories.Contains(value) && pieceTable.m_categories.Contains(value)) { int index2 = pieceTable.m_categories.IndexOf(value); pieceTable.m_categories.RemoveAt(index2); pieceTable.m_categoryLabels.RemoveAt(index2); } } } private static string GetVanillaLabel(PieceCategory category) { //IL_0006: 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) if (!VanillaLabels.ContainsKey(category)) { SearchVanillaLabels(); } string value; return VanillaLabels.TryGetValue(category, out value) ? value : string.Empty; } private static void SearchVanillaLabels() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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) PieceTable[] array = Resources.FindObjectsOfTypeAll(); foreach (PieceTable val in array) { for (int j = 0; j < val.m_categories.Count; j++) { PieceCategory key = val.m_categories[j]; if (j < val.m_categoryLabels.Count && !VanillaLabels.ContainsKey(key) && !string.IsNullOrEmpty(val.m_categoryLabels[j])) { VanillaLabels[key] = val.m_categoryLabels[j]; } } } } private static string GetCategoryToken(string name) { char[] endChars = Localization.instance.m_endChars; string text = string.Concat(name.ToLower().Split(endChars)); return "piecemanager_cat_" + text; } private static void Patch_SetPlaceMode(Player __instance) { if (Object.op_Implicit((Object)(object)__instance.m_buildPieces)) { RepositionCategories(__instance.m_buildPieces); } } private static void UpdateAvailable_Prefix(PieceTable __instance) { if (__instance.m_availablePieces.Count > 0) { int num = ModifiedMaxCategory() - __instance.m_availablePieces.Count; for (int i = 0; i < num; i++) { __instance.m_availablePieces.Add(new List()); } } } private static void UpdateAvailable_Postfix(PieceTable __instance) { Array.Resize(ref __instance.m_selectedPiece, __instance.m_availablePieces.Count); Array.Resize(ref __instance.m_lastSelectedPiece, __instance.m_availablePieces.Count); } [HarmonyPriority(200)] private static void Hud_AwakeCreateTabs() { CreateCategoryTabs(); } [HarmonyPriority(700)] private static void Patch_ZNetSceneAwake(ZNetScene __instance) { foreach (GameObject piecePrefab in piecePrefabs) { if (!__instance.m_prefabs.Contains(piecePrefab)) { __instance.m_prefabs.Add(piecePrefab); } } } [HarmonyPriority(700)] private static void RefFixPatch_ZNetSceneAwake(ZNetScene __instance) { //IL_007b: 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) foreach (GameObject piecePrefab in piecePrefabs) { if (__instance.m_prefabs.Contains(piecePrefab) && Object.op_Implicit((Object)(object)piecePrefab.GetComponent())) { piecePrefab.GetComponent().m_isUpgrade = true; piecePrefab.GetComponent().m_connectionPrefab = __instance.GetPrefab("piece_workbench_ext3").GetComponent().m_connectionPrefab; piecePrefab.GetComponent().m_connectionOffset = __instance.GetPrefab("piece_workbench_ext3").GetComponent().m_connectionOffset; } } } [HarmonyPriority(300)] private static void Patch_ObjectDBInit(ObjectDB __instance) { foreach (BuildPiece registeredPiece in BuildPiece.registeredPieces) { string[] activeTools = registeredPiece.activeTools; foreach (string text in activeTools) { GameObject itemPrefab = __instance.GetItemPrefab(text); PieceTable val = ((itemPrefab != null) ? itemPrefab.GetComponent().m_itemData.m_shared.m_buildPieces : null); if (val != null && !val.m_pieces.Contains(registeredPiece.Prefab)) { val.m_pieces.Add(registeredPiece.Prefab); } } } } } public static class PieceManagerVersion { public const string Version = "1.2.9"; } [PublicAPI] public class Conversion { internal class ConversionConfig { public ConfigEntry input = null; public ConfigEntry output = null; } public string Input = null; public string Output = null; internal ConversionConfig? config; public Conversion(BuildPiece conversionPiece) { conversionPiece.Conversions.Add(this); } } [PublicAPI] public class SnapPointMaker { private static List _objectsToApplySnaps; static SnapPointMaker() { _objectsToApplySnaps = new List(); } public static void AddObjectForSnapPoints(GameObject obj) { _objectsToApplySnaps.Add(obj); } public static void ApplySnapPoints() { foreach (GameObject objectsToApplySnap in _objectsToApplySnaps) { GrabVerticesAssignSnaps(objectsToApplySnap); } } private static void GrabVerticesAssignSnaps(GameObject obj) { Vector3[] colliderVertexPosRotated = GetColliderVertexPosRotated(obj); AttachSnapPoints(obj, colliderVertexPosRotated); } private static Vector3[] GetColliderVertexPosRotated(GameObject obj) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //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_018b: Unknown result type (might be due to invalid IL or missing references) Vector3[] array = (Vector3[])(object)new Vector3[8]; BoxCollider componentInChildren = obj.GetComponentInChildren(); if ((Object)(object)componentInChildren == (Object)null) { return array; } Transform transform = obj.transform; Vector3 val = componentInChildren.center - componentInChildren.size * 0.5f; Vector3 val2 = componentInChildren.center + componentInChildren.size * 0.5f; array[0] = transform.TransformPoint(new Vector3(val.x, val.y, val.z)); array[1] = transform.TransformPoint(new Vector3(val.x, val.y, val2.z)); array[2] = transform.TransformPoint(new Vector3(val.x, val2.y, val.z)); array[3] = transform.TransformPoint(new Vector3(val.x, val2.y, val2.z)); array[4] = transform.TransformPoint(new Vector3(val2.x, val.y, val.z)); array[5] = transform.TransformPoint(new Vector3(val2.x, val.y, val2.z)); array[6] = transform.TransformPoint(new Vector3(val2.x, val2.y, val.z)); array[7] = transform.TransformPoint(new Vector3(val2.x, val2.y, val2.z)); return array; } private static void AttachSnapPoints(GameObject objecttosnap, Vector3[] vector3S) { //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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) foreach (Vector3 val in vector3S) { GameObject val2 = new GameObject(); ((Object)val2).name = "_snappoint"; val2.tag = "snappoint"; val2.layer = 10; GameObject val3 = Object.Instantiate(val2, val, Quaternion.identity, objecttosnap.transform); val3.SetActive(false); } } } } namespace ItemManager { [PublicAPI] public enum CraftingTable { Disabled, Inventory, [InternalName("piece_workbench")] Workbench, [InternalName("piece_cauldron")] Cauldron, [InternalName("piece_MeadCauldron")] MeadCauldron, [InternalName("forge")] Forge, [InternalName("piece_artisanstation")] ArtisanTable, [InternalName("piece_stonecutter")] StoneCutter, [InternalName("piece_magetable")] MageTable, [InternalName("piece_preptable")] PrepTable, [InternalName("blackforge")] BlackForge, Custom } [PublicAPI] public enum ConversionPiece { Disabled, [InternalName("smelter")] Smelter, [InternalName("charcoal_kiln")] CharcoalKiln, [InternalName("blastfurnace")] BlastFurnace, [InternalName("windmill")] Windmill, [InternalName("piece_spinningwheel")] SpinningWheel, [InternalName("eitrrefinery")] EitrRefinery, Custom } public class InternalName : Attribute { public readonly string internalName; public InternalName(string internalName) { this.internalName = internalName; } } [PublicAPI] public class RequiredResourceList { public readonly List Requirements = new List(); public bool Free = false; public void Add(string itemName, int amount, int quality = 0) { Requirements.Add(new Requirement { itemName = itemName, amount = amount, quality = quality }); } public void Add(string itemName, ConfigEntry amountConfig, int quality = 0) { Requirements.Add(new Requirement { itemName = itemName, amountConfig = amountConfig, quality = quality }); } } [PublicAPI] public class CraftingStationList { public readonly List Stations = new List(); public void Add(CraftingTable table, int level) { Stations.Add(new CraftingStationConfig { Table = table, level = level }); } public void Add(string customTable, int level) { Stations.Add(new CraftingStationConfig { Table = CraftingTable.Custom, level = level, custom = customTable }); } } [PublicAPI] public class ItemRecipe { public readonly RequiredResourceList RequiredItems = new RequiredResourceList(); public readonly RequiredResourceList RequiredUpgradeItems = new RequiredResourceList(); public readonly CraftingStationList Crafting = new CraftingStationList(); public int CraftAmount = 1; public bool RequireOnlyOneIngredient = false; public float QualityResultAmountMultiplier = 1f; public ConfigEntryBase? RecipeIsActive = null; } [PublicAPI] public class Trade { public Trader Trader = Trader.None; public uint Price = 0u; public uint Stack = 1u; public string? RequiredGlobalKey = null; } [PublicAPI] [Flags] public enum Trader { None = 0, Haldor = 1, Hildir = 2, BogWitch = 4 } public struct Requirement { public string itemName; public int amount; public ConfigEntry? amountConfig; [Description("Set to a non-zero value to apply the requirement only for a specific quality")] public int quality; } public struct CraftingStationConfig { public CraftingTable Table; public int level; public string? custom; } [Flags] public enum Configurability { Disabled = 0, Recipe = 1, Stats = 2, Drop = 4, Trader = 8, Full = 0xF } [PublicAPI] public class DropTargets { public readonly List Drops = new List(); public void Add(string creatureName, float chance, int min = 1, int? max = null, bool levelMultiplier = true) { Drops.Add(new DropTarget { creature = creatureName, chance = chance, min = min, max = max.GetValueOrDefault(min), levelMultiplier = levelMultiplier }); } } public struct DropTarget { public string creature; public int min; public int max; public float chance; public bool levelMultiplier; } public enum Toggle { On = 1, Off = 0 } [PublicAPI] public class Item { private class ItemConfig { public ConfigEntry? craft; public ConfigEntry? upgrade; public ConfigEntry table = null; public ConfigEntry tableLevel = null; public ConfigEntry customTable = null; public ConfigEntry? maximumTableLevel; public ConfigEntry requireOneIngredient = null; public ConfigEntry qualityResultAmountMultiplier = null; } private class TraderConfig { public ConfigEntry trader = null; public ConfigEntry price = null; public ConfigEntry stack = null; public ConfigEntry requiredGlobalKey = null; } private class RequirementQuality { public int quality; } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] public string? Category; [UsedImplicitly] public Action? CustomDrawer; public Func? browsability; } [PublicAPI] public enum DamageModifier { Normal, Resistant, Weak, Immune, Ignore, VeryResistant, VeryWeak, None } private delegate void setDmgFunc(ref DamageTypes dmg, float value); private class SerializedRequirements { public readonly List Reqs; public SerializedRequirements(List reqs) { Reqs = reqs; } public SerializedRequirements(string reqs) : this(reqs.Split(new char[1] { ',' }).Select(delegate(string r) { string[] array = r.Split(new char[1] { ':' }); Requirement result = default(Requirement); result.itemName = array[0]; result.amount = ((array.Length <= 1 || !int.TryParse(array[1], out var result2)) ? 1 : result2); result.quality = ((array.Length > 2 && int.TryParse(array[2], out var result3)) ? result3 : 0); return result; }).ToList()) { } public override string ToString() { return string.Join(",", Reqs.Select((Requirement r) => $"{r.itemName}:{r.amount}" + ((r.quality > 0) ? $":{r.quality}" : ""))); } public static ItemDrop? fetchByName(ObjectDB objectDB, string name) { GameObject itemPrefab = objectDB.GetItemPrefab(name); ItemDrop val = ((itemPrefab != null) ? itemPrefab.GetComponent() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("The required item '" + name + "' does not exist.")); } return val; } public static Requirement[] toPieceReqs(ObjectDB objectDB, SerializedRequirements craft, SerializedRequirements upgrade) { //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01b7: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Expected O, but got Unknown ObjectDB objectDB2 = objectDB; Dictionary dictionary = craft.Reqs.Where((Requirement r) => r.itemName != "").ToDictionary((Func)((Requirement r) => r.itemName), (Func)delegate(Requirement r) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) ItemDrop val6 = ResItem(r); return (val6 == null) ? ((Requirement)null) : new Requirement { m_amount = (r.amountConfig?.Value ?? r.amount), m_resItem = val6, m_amountPerLevel = 0 }; }); List list = dictionary.Values.Where((Requirement v) => v != null).ToList(); foreach (Requirement item in upgrade.Reqs.Where((Requirement r) => r.itemName != "")) { if (item.quality > 0) { ItemDrop val = ResItem(item); if (val != null) { Requirement val2 = new Requirement { m_resItem = val, m_amountPerLevel = (item.amountConfig?.Value ?? item.amount), m_amount = 0 }; list.Add(val2); requirementQuality.Add(val2, new RequirementQuality { quality = item.quality }); } continue; } if (!dictionary.TryGetValue(item.itemName, out var value) || value == null) { ItemDrop val3 = ResItem(item); if (val3 != null) { string itemName = item.itemName; Requirement val4 = new Requirement { m_resItem = val3, m_amount = 0 }; Requirement val5 = val4; dictionary[itemName] = val4; value = val5; list.Add(value); } } if (value != null) { value.m_amountPerLevel = item.amountConfig?.Value ?? item.amount; } } return list.ToArray(); ItemDrop? ResItem(Requirement r) { return fetchByName(objectDB2, r.itemName); } } } private class SerializedDrop { public readonly List Drops; public SerializedDrop(List drops) { Drops = drops; } public SerializedDrop(string drops) { Drops = ((drops == "") ? ((IEnumerable)Array.Empty()) : ((IEnumerable)drops.Split(new char[1] { ',' }))).Select(delegate(string r) { string[] array = r.Split(new char[1] { ':' }); if (array.Length <= 2 || !int.TryParse(array[2], out var result)) { result = 1; } if (array.Length <= 3 || !int.TryParse(array[3], out var result2)) { result2 = result; } bool levelMultiplier = array.Length <= 4 || array[4] != "0"; DropTarget result3 = default(DropTarget); result3.creature = array[0]; result3.chance = ((array.Length > 1 && float.TryParse(array[1], out var result4)) ? result4 : 1f); result3.min = result; result3.max = result2; result3.levelMultiplier = levelMultiplier; return result3; }).ToList(); } public override string ToString() { return string.Join(",", Drops.Select((DropTarget r) => $"{r.creature}:{r.chance.ToString(CultureInfo.InvariantCulture)}:{r.min}:" + ((r.min == r.max) ? "" : $"{r.max}") + (r.levelMultiplier ? "" : ":0"))); } private static Character? fetchByName(ZNetScene netScene, string name) { GameObject prefab = netScene.GetPrefab(name); Character val = ((prefab != null) ? prefab.GetComponent() : null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("The drop target character '" + name + "' does not exist.")); } return val; } public Dictionary toCharacterDrops(ZNetScene netScene, GameObject item) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown Dictionary dictionary = new Dictionary(); foreach (DropTarget drop in Drops) { Character val = fetchByName(netScene, drop.creature); if (val != null) { dictionary[val] = new Drop { m_prefab = item, m_amountMin = drop.min, m_amountMax = drop.max, m_chance = drop.chance, m_levelMultiplier = drop.levelMultiplier }; } } return dictionary; } } [CompilerGenerated] private sealed class <>c__DisplayClass83_0 { public Quaternion? cameraRotation; public float lightIntensity; public ItemDrop item; public Quaternion? itemRotation; } [CompilerGenerated] private sealed class d__85 : IEnumerable, IEnumerable, IEnumerator, IDisposable, IEnumerator { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; private IEnumerable instructions; public IEnumerable <>3__instructions; private List 5__1; private FieldInfo 5__2; private int 5__3; CodeInstruction IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public d__85(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { 5__1 = null; 5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Expected O, but got Unknown //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown int num; switch (<>1__state) { default: return false; case 0: <>1__state = -1; 5__1 = instructions.ToList(); 5__2 = AccessTools.DeclaredField(typeof(Recipe), "m_amount"); 5__3 = 0; break; case 1: <>1__state = -1; if (5__3 > 1 && 5__1[5__3 - 2].opcode == OpCodes.Ldfld && CodeInstructionExtensions.OperandIs(5__1[5__3 - 2], (MemberInfo)5__2) && 5__1[5__3 - 1].opcode == OpCodes.Ldc_I4_1 && 5__1[5__3].operand is Label) { <>2__current = new CodeInstruction(OpCodes.Ldarg_0, (object)null); <>1__state = 2; return true; } goto IL_01ca; case 2: <>1__state = -1; <>2__current = new CodeInstruction(OpCodes.Call, (object)AccessTools.DeclaredMethod(typeof(Item), "CheckItemIsUpgrade", (Type[])null, (Type[])null)); <>1__state = 3; return true; case 3: <>1__state = -1; <>2__current = new CodeInstruction(OpCodes.Brtrue, 5__1[5__3].operand); <>1__state = 4; return true; case 4: { <>1__state = -1; goto IL_01ca; } IL_01ca: num = 5__3 + 1; 5__3 = num; break; } if (5__3 < 5__1.Count) { <>2__current = 5__1[5__3]; <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { d__85 d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; d__ = this; } else { d__ = new d__85(0); } d__.instructions = <>3__instructions; return d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)this).GetEnumerator(); } } private static readonly List registeredItems = new List(); private static readonly Dictionary itemDropMap = new Dictionary(); private static Dictionary>> activeRecipes = new Dictionary>>(); private static Dictionary hiddenCraftRecipes = new Dictionary(); private static Dictionary hiddenUpgradeRecipes = new Dictionary(); private static Dictionary> itemCraftConfigs = new Dictionary>(); private static Dictionary> itemDropConfigs = new Dictionary>(); private Dictionary characterDrops = new Dictionary(); private readonly Dictionary statsConfigs = new Dictionary(); private static readonly ConditionalWeakTable requirementQuality = new ConditionalWeakTable(); public static Configurability DefaultConfigurability = Configurability.Full; public Configurability? Configurable = null; private Configurability configurationVisible = Configurability.Full; private TraderConfig? traderConfig; public readonly GameObject Prefab; [Description("Specifies the maximum required crafting station level to upgrade and repair the item.\nDefault is calculated from crafting station level and maximum quality.")] public int MaximumRequiredStationLevel = int.MaxValue; [Description("Assigns the item as a drop item to a creature.\nUses a creature name, a drop chance and a minimum and maximum amount.")] public readonly DropTargets DropsFrom = new DropTargets(); [Description("Configures whether the item can be bought at the trader.\nDon't forget to set cost to something above 0 or the item will be sold for free.")] public readonly Trade Trade = new Trade(); internal List Conversions = new List(); internal List conversions = new List(); public Dictionary Recipes = new Dictionary(); private LocalizeKey? _name; private LocalizeKey? _description; private static object? configManager; private static Localization? _english; private static BaseUnityPlugin? _plugin; private static bool hasConfigSync = true; private static object? _configSync; private Configurability configurability => Configurable ?? DefaultConfigurability; [Description("Specifies the resources needed to craft the item.\nUse .Add to add resources with their internal ID and an amount.\nUse one .Add for each resource type the item should need.")] public RequiredResourceList RequiredItems => this[""].RequiredItems; [Description("Specifies the resources needed to upgrade the item.\nUse .Add to add resources with their internal ID and an amount. This amount will be multipled by the item quality level.\nUse one .Add for each resource type the upgrade should need.")] public RequiredResourceList RequiredUpgradeItems => this[""].RequiredUpgradeItems; [Description("Specifies the crafting station needed to craft the item.\nUse .Add to add a crafting station, using the CraftingTable enum and a minimum level for the crafting station.\nUse one .Add for each crafting station.")] public CraftingStationList Crafting => this[""].Crafting; [Description("Specifies a config entry which toggles whether a recipe is active.")] public ConfigEntryBase? RecipeIsActive { get { return this[""].RecipeIsActive; } set { this[""].RecipeIsActive = value; } } [Description("Specifies the number of items that should be given to the player with a single craft of the item.\nDefaults to 1.")] public int CraftAmount { get { return this[""].CraftAmount; } set { this[""].CraftAmount = value; } } public bool RequireOnlyOneIngredient { get { return this[""].RequireOnlyOneIngredient; } set { this[""].RequireOnlyOneIngredient = value; } } public float QualityResultAmountMultiplier { get { return this[""].QualityResultAmountMultiplier; } set { this[""].QualityResultAmountMultiplier = value; } } public ItemRecipe this[string name] { get { if (Recipes.TryGetValue(name, out ItemRecipe value)) { return value; } return Recipes[name] = new ItemRecipe(); } } public LocalizeKey Name { get { LocalizeKey name = _name; if (name != null) { return name; } SharedData shared = Prefab.GetComponent().m_itemData.m_shared; if (shared.m_name.StartsWith("$")) { _name = new LocalizeKey(shared.m_name); } else { string text = "$item_" + ((Object)Prefab).name.Replace(" ", "_"); _name = new LocalizeKey(text).English(shared.m_name); shared.m_name = text; } return _name; } } public LocalizeKey Description { get { LocalizeKey description = _description; if (description != null) { return description; } SharedData shared = Prefab.GetComponent().m_itemData.m_shared; if (shared.m_description.StartsWith("$")) { _description = new LocalizeKey(shared.m_description); } else { string text = "$itemdesc_" + ((Object)Prefab).name.Replace(" ", "_"); _description = new LocalizeKey(text).English(shared.m_description); shared.m_description = text; } return _description; } } private static Localization english => _english ?? (_english = LocalizationCache.ForLanguage("English")); private static BaseUnityPlugin plugin { get { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown if (_plugin == null) { IEnumerable source; try { source = Assembly.GetExecutingAssembly().DefinedTypes.ToList(); } catch (ReflectionTypeLoadException ex) { source = from t in ex.Types where t != null select t.GetTypeInfo(); } _plugin = (BaseUnityPlugin)Chainloader.ManagerObject.GetComponent((Type)source.First((TypeInfo t) => t.IsClass && typeof(BaseUnityPlugin).IsAssignableFrom(t))); } return _plugin; } } private static object? configSync { get { if (_configSync == null && hasConfigSync) { Type type = Assembly.GetExecutingAssembly().GetType("ServerSync.ConfigSync"); if ((object)type != null) { _configSync = Activator.CreateInstance(type, plugin.Info.Metadata.GUID + " ItemManager"); type.GetField("CurrentVersion").SetValue(_configSync, plugin.Info.Metadata.Version.ToString()); type.GetProperty("IsLocked").SetValue(_configSync, true); } else { hasConfigSync = false; } } return _configSync; } } public Item(string assetBundleFileName, string prefabName, string folderName = "assets") : this(PrefabManager.RegisterAssetBundle(assetBundleFileName, folderName), prefabName) { } public Item(AssetBundle bundle, string prefabName) : this(PrefabManager.RegisterPrefab(bundle, prefabName, addToObjectDb: true), skipRegistering: true) { } public Item(GameObject prefab, bool skipRegistering = false) { if (!skipRegistering) { PrefabManager.RegisterPrefab(prefab, addToObjectDb: true); } Prefab = prefab; registeredItems.Add(this); itemDropMap[Prefab.GetComponent()] = this; Prefab.GetComponent().m_itemData.m_dropPrefab = Prefab; } public void ToggleConfigurationVisibility(Configurability visible) { configurationVisible = visible; if (itemDropConfigs.TryGetValue(this, out ConfigEntry value)) { Toggle((ConfigEntryBase)(object)value, Configurability.Drop); } if (itemCraftConfigs.TryGetValue(this, out Dictionary value2)) { foreach (ItemConfig value4 in value2.Values) { ToggleObj(value4, Configurability.Recipe); } } foreach (Conversion conversion in Conversions) { if (conversion.config != null) { ToggleObj(conversion.config, Configurability.Recipe); } } foreach (KeyValuePair statsConfig in statsConfigs) { Toggle(statsConfig.Key, Configurability.Stats); if ((visible & Configurability.Stats) != 0) { statsConfig.Value(); } } reloadConfigDisplay(); void Toggle(ConfigEntryBase cfg, Configurability check) { object[] tags = cfg.Description.Tags; foreach (object obj2 in tags) { if (obj2 is ConfigurationManagerAttributes configurationManagerAttributes) { configurationManagerAttributes.Browsable = (visible & check) != 0 && (configurationManagerAttributes.browsability == null || configurationManagerAttributes.browsability()); } } } void ToggleObj(object obj, Configurability check) { FieldInfo[] fields = obj.GetType().GetFields(); foreach (FieldInfo fieldInfo in fields) { object? value3 = fieldInfo.GetValue(obj); ConfigEntryBase val = (ConfigEntryBase)((value3 is ConfigEntryBase) ? value3 : null); if (val != null) { Toggle(val, check); } } } } internal static void reloadConfigDisplay() { object obj = configManager?.GetType().GetProperty("DisplayingWindow").GetValue(configManager); if (obj is bool && (bool)obj) { configManager.GetType().GetMethod("BuildSettingList").Invoke(configManager, Array.Empty()); } } private void UpdateItemTableConfig(string recipeKey, CraftingTable table, string customTableValue) { if (activeRecipes.ContainsKey(this) && activeRecipes[this].TryGetValue(recipeKey, out List value)) { value.First().m_enabled = table != CraftingTable.Disabled; if ((uint)table <= 1u) { value.First().m_craftingStation = null; } else if (table == CraftingTable.Custom) { Recipe obj = value.First(); GameObject prefab = ZNetScene.instance.GetPrefab(customTableValue); obj.m_craftingStation = ((prefab != null) ? prefab.GetComponent() : null); } else { value.First().m_craftingStation = ZNetScene.instance.GetPrefab(getInternalName(table)).GetComponent(); } } } private void UpdateCraftConfig(string recipeKey, SerializedRequirements craftRequirements, SerializedRequirements upgradeRequirements) { if (!Object.op_Implicit((Object)(object)ObjectDB.instance) || !activeRecipes.ContainsKey(this) || !activeRecipes[this].TryGetValue(recipeKey, out List value)) { return; } foreach (Recipe item in value) { item.m_resources = SerializedRequirements.toPieceReqs(ObjectDB.instance, craftRequirements, upgradeRequirements); } } internal static void Patch_FejdStartup() { //IL_1001: Unknown result type (might be due to invalid IL or missing references) //IL_1006: Unknown result type (might be due to invalid IL or missing references) //IL_2395: Unknown result type (might be due to invalid IL or missing references) //IL_239f: Expected O, but got Unknown //IL_10ce: Unknown result type (might be due to invalid IL or missing references) //IL_10d1: Unknown result type (might be due to invalid IL or missing references) //IL_1127: Expected I4, but got Unknown //IL_0ccc: Unknown result type (might be due to invalid IL or missing references) //IL_0cd6: Expected O, but got Unknown //IL_1267: Unknown result type (might be due to invalid IL or missing references) //IL_126a: Unknown result type (might be due to invalid IL or missing references) //IL_126c: Invalid comparison between Unknown and I4 //IL_035b: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Expected O, but got Unknown //IL_0dfa: Unknown result type (might be due to invalid IL or missing references) //IL_0e04: Expected O, but got Unknown //IL_0ea6: Unknown result type (might be due to invalid IL or missing references) //IL_0eb0: Expected O, but got Unknown //IL_1270: Unknown result type (might be due to invalid IL or missing references) //IL_1274: Invalid comparison between Unknown and I4 //IL_0f5b: Unknown result type (might be due to invalid IL or missing references) //IL_0f65: Expected O, but got Unknown //IL_1489: Unknown result type (might be due to invalid IL or missing references) //IL_148c: Unknown result type (might be due to invalid IL or missing references) //IL_148e: Invalid comparison between Unknown and I4 //IL_045e: Unknown result type (might be due to invalid IL or missing references) //IL_0468: Expected O, but got Unknown //IL_1278: Unknown result type (might be due to invalid IL or missing references) //IL_127c: Invalid comparison between Unknown and I4 //IL_1492: Unknown result type (might be due to invalid IL or missing references) //IL_1496: Unknown result type (might be due to invalid IL or missing references) //IL_1498: Invalid comparison between Unknown and I4 //IL_05ad: Unknown result type (might be due to invalid IL or missing references) //IL_05b7: Expected O, but got Unknown //IL_1581: Unknown result type (might be due to invalid IL or missing references) //IL_1586: Unknown result type (might be due to invalid IL or missing references) //IL_1588: Unknown result type (might be due to invalid IL or missing references) //IL_158b: Invalid comparison between Unknown and I4 //IL_149c: Unknown result type (might be due to invalid IL or missing references) //IL_14a0: Invalid comparison between Unknown and I4 //IL_158f: Unknown result type (might be due to invalid IL or missing references) //IL_1593: Invalid comparison between Unknown and I4 //IL_0796: Unknown result type (might be due to invalid IL or missing references) //IL_07a0: Expected O, but got Unknown //IL_06eb: Unknown result type (might be due to invalid IL or missing references) //IL_06f5: Expected O, but got Unknown //IL_160c: Unknown result type (might be due to invalid IL or missing references) //IL_160f: Unknown result type (might be due to invalid IL or missing references) //IL_1611: Invalid comparison between Unknown and I4 //IL_08b0: Unknown result type (might be due to invalid IL or missing references) //IL_08ba: Expected O, but got Unknown //IL_1615: Unknown result type (might be due to invalid IL or missing references) //IL_1619: Unknown result type (might be due to invalid IL or missing references) //IL_161b: Invalid comparison between Unknown and I4 //IL_176e: Unknown result type (might be due to invalid IL or missing references) //IL_1771: Invalid comparison between Unknown and I4 //IL_161f: Unknown result type (might be due to invalid IL or missing references) //IL_1623: Invalid comparison between Unknown and I4 //IL_1980: Unknown result type (might be due to invalid IL or missing references) //IL_1987: Invalid comparison between Unknown and I4 //IL_1a5c: Unknown result type (might be due to invalid IL or missing references) //IL_1a61: Unknown result type (might be due to invalid IL or missing references) //IL_1a63: Unknown result type (might be due to invalid IL or missing references) //IL_1a67: Unknown result type (might be due to invalid IL or missing references) //IL_1a69: Invalid comparison between Unknown and I4 //IL_16de: Unknown result type (might be due to invalid IL or missing references) //IL_16e3: Unknown result type (might be due to invalid IL or missing references) //IL_1ae2: Unknown result type (might be due to invalid IL or missing references) //IL_1ae5: Unknown result type (might be due to invalid IL or missing references) //IL_1ae7: Invalid comparison between Unknown and I4 //IL_1aeb: Unknown result type (might be due to invalid IL or missing references) //IL_1aef: Invalid comparison between Unknown and I4 //IL_1af3: Unknown result type (might be due to invalid IL or missing references) //IL_1af7: Invalid comparison between Unknown and I4 //IL_1f88: Unknown result type (might be due to invalid IL or missing references) //IL_1f8b: Invalid comparison between Unknown and I4 Type type = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault((Assembly a) => a.GetName().Name == "ConfigurationManager")?.GetType("ConfigurationManager.ConfigurationManager"); if (DefaultConfigurability != 0) { bool saveOnConfigSet = plugin.Config.SaveOnConfigSet; plugin.Config.SaveOnConfigSet = false; foreach (Item item4 in registeredItems.Where((Item i) => i.configurability != Configurability.Disabled)) { Item item3 = item4; string name2 = item3.Prefab.GetComponent().m_itemData.m_shared.m_name; string englishName = new Regex("[=\\n\\t\\\\\"\\'\\[\\]]*").Replace(english.Localize(name2), "").Trim(); string localizedName = Localization.instance.Localize(name2).Trim(); int order = 0; if ((item3.configurability & Configurability.Recipe) != 0) { itemCraftConfigs[item3] = new Dictionary(); foreach (string item5 in item3.Recipes.Keys.DefaultIfEmpty("")) { string configKey = item5; string text = ((configKey == "") ? "" : (" (" + configKey + ")")); if (!item3.Recipes.ContainsKey(configKey) || item3.Recipes[configKey].Crafting.Stations.Count <= 0) { continue; } ItemConfig itemConfig2 = (itemCraftConfigs[item3][configKey] = new ItemConfig()); ItemConfig cfg = itemConfig2; List hideWhenNoneAttributes = new List(); cfg.table = config(englishName, "Crafting Station" + text, item3.Recipes[configKey].Crafting.Stations.First().Table, new ConfigDescription("Crafting station where " + englishName + " is available.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName } })); ConfigurationManagerAttributes customTableAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = CustomTableBrowsability, Browsable = (CustomTableBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; cfg.customTable = config(englishName, "Custom Crafting Station" + text, item3.Recipes[configKey].Crafting.Stations.First().custom ?? "", new ConfigDescription("", (AcceptableValueBase)null, new object[1] { customTableAttributes })); cfg.table.SettingChanged += TableConfigChanged; cfg.customTable.SettingChanged += TableConfigChanged; ConfigurationManagerAttributes configurationManagerAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = TableLevelBrowsability, Browsable = (TableLevelBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; hideWhenNoneAttributes.Add(configurationManagerAttributes); cfg.tableLevel = config(englishName, "Crafting Station Level" + text, item3.Recipes[configKey].Crafting.Stations.First().level, new ConfigDescription("Required crafting station level to craft " + englishName + ".", (AcceptableValueBase)null, new object[1] { configurationManagerAttributes })); cfg.tableLevel.SettingChanged += delegate { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out List value6)) { value6.First().m_minStationLevel = cfg.tableLevel.Value; } }; if (item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality > 1) { cfg.maximumTableLevel = config(englishName, "Maximum Crafting Station Level" + text, (item3.MaximumRequiredStationLevel == int.MaxValue) ? (item3.Recipes[configKey].Crafting.Stations.First().level + item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality - 1) : item3.MaximumRequiredStationLevel, new ConfigDescription("Maximum crafting station level to upgrade and repair " + englishName + ".", (AcceptableValueBase)null, new object[1] { configurationManagerAttributes })); } cfg.requireOneIngredient = config(englishName, "Require only one resource" + text, item3.Recipes[configKey].RequireOnlyOneIngredient ? Toggle.On : Toggle.Off, new ConfigDescription("Whether only one of the ingredients is needed to craft " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Category = localizedName } })); ConfigurationManagerAttributes qualityResultAttributes = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = QualityResultBrowsability, Browsable = (QualityResultBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; cfg.requireOneIngredient.SettingChanged += delegate { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out List value5)) { foreach (Recipe item6 in value5) { item6.m_requireOnlyOneIngredient = cfg.requireOneIngredient.Value == Toggle.On; } } qualityResultAttributes.Browsable = QualityResultBrowsability(); reloadConfigDisplay(); }; cfg.qualityResultAmountMultiplier = config(englishName, "Quality Multiplier" + text, item3.Recipes[configKey].QualityResultAmountMultiplier, new ConfigDescription("Multiplies the crafted amount based on the quality of the resources when crafting " + englishName + ". Only works, if Require Only One Resource is true.", (AcceptableValueBase)null, new object[1] { qualityResultAttributes })); cfg.qualityResultAmountMultiplier.SettingChanged += delegate { if (activeRecipes.ContainsKey(item3) && activeRecipes[item3].TryGetValue(configKey, out List value4)) { foreach (Recipe item7 in value4) { item7.m_qualityResultAmountMultiplier = cfg.qualityResultAmountMultiplier.Value; } } }; if ((!item3.Recipes[configKey].RequiredItems.Free || item3.Recipes[configKey].RequiredItems.Requirements.Count > 0) && item3.Recipes[configKey].RequiredItems.Requirements.All((Requirement r) => r.amountConfig == null)) { cfg.craft = itemConfig("Crafting Costs" + text, new SerializedRequirements(item3.Recipes[configKey].RequiredItems.Requirements).ToString(), "Item costs to craft " + englishName, isUpgrade: false); } if (item3.Prefab.GetComponent().m_itemData.m_shared.m_maxQuality > 1 && (!item3.Recipes[configKey].RequiredUpgradeItems.Free || item3.Recipes[configKey].RequiredUpgradeItems.Requirements.Count > 0) && item3.Recipes[configKey].RequiredUpgradeItems.Requirements.All((Requirement r) => r.amountConfig == null)) { cfg.upgrade = itemConfig("Upgrading Costs" + text, new SerializedRequirements(item3.Recipes[configKey].RequiredUpgradeItems.Requirements).ToString(), "Item costs per level to upgrade " + englishName, isUpgrade: true); } if (cfg.craft != null) { cfg.craft.SettingChanged += ConfigChanged; } if (cfg.upgrade != null) { cfg.upgrade.SettingChanged += ConfigChanged; } void ConfigChanged(object o, EventArgs e) { item3.UpdateCraftConfig(configKey, new SerializedRequirements(cfg.craft?.Value ?? ""), new SerializedRequirements(cfg.upgrade?.Value ?? "")); } bool CustomTableBrowsability() { return cfg.table.Value == CraftingTable.Custom; } bool ItemBrowsability() { return cfg.table.Value != CraftingTable.Disabled; } bool QualityResultBrowsability() { return cfg.requireOneIngredient.Value == Toggle.On; } void TableConfigChanged(object o, EventArgs e) { item3.UpdateItemTableConfig(configKey, cfg.table.Value, cfg.customTable.Value); customTableAttributes.Browsable = cfg.table.Value == CraftingTable.Custom; foreach (ConfigurationManagerAttributes item8 in hideWhenNoneAttributes) { item8.Browsable = cfg.table.Value != CraftingTable.Disabled; } reloadConfigDisplay(); } bool TableLevelBrowsability() { return cfg.table.Value != CraftingTable.Disabled; } ConfigEntry itemConfig(string name, string value, string desc, bool isUpgrade) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes3 = new ConfigurationManagerAttributes { CustomDrawer = drawRequirementsConfigTable(item3, isUpgrade), Order = (order -= 1), browsability = ItemBrowsability, Browsable = (ItemBrowsability() && (item3.configurationVisible & Configurability.Recipe) != 0), Category = localizedName }; hideWhenNoneAttributes.Add(configurationManagerAttributes3); return config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes3 })); } } if ((item3.configurability & Configurability.Drop) != 0) { ConfigEntry val3 = (itemDropConfigs[item3] = config(englishName, "Drops from", new SerializedDrop(item3.DropsFrom.Drops).ToString(), new ConfigDescription(englishName + " drops from this creature.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { CustomDrawer = drawDropsConfigTable, Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Drop) != 0) } }))); ConfigEntry val4 = val3; val4.SettingChanged += delegate { item3.UpdateCharacterDrop(); }; } for (int j = 0; j < item3.Conversions.Count; j++) { string text2 = ((item3.Conversions.Count > 1) ? $"{j + 1}. " : ""); Conversion conversion = item3.Conversions[j]; conversion.config = new Conversion.ConversionConfig(); int index = j; conversion.config.input = config(englishName, text2 + "Conversion Input Item", conversion.Input, new ConfigDescription("Input item to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.input.SettingChanged += delegate { if (index < item3.conversions.Count) { ObjectDB instance = ObjectDB.instance; if (instance != null) { ItemDrop from = SerializedRequirements.fetchByName(instance, conversion.config.input.Value); item3.conversions[index].m_from = from; UpdatePiece(); } } }; conversion.config.piece = config(englishName, text2 + "Conversion Piece", conversion.Piece, new ConfigDescription("Conversion piece used to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.piece.SettingChanged += delegate { UpdatePiece(); }; conversion.config.customPiece = config(englishName, text2 + "Conversion Custom Piece", conversion.customPiece ?? "", new ConfigDescription("Custom conversion piece to create " + englishName, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Recipe) != 0) } })); conversion.config.customPiece.SettingChanged += delegate { UpdatePiece(); }; void UpdatePiece() { if (index < item3.conversions.Count && Object.op_Implicit((Object)(object)ZNetScene.instance)) { string text3 = ((conversion.config.piece.Value == ConversionPiece.Disabled) ? null : ((conversion.config.piece.Value == ConversionPiece.Custom) ? conversion.config.customPiece.Value : getInternalName(conversion.config.piece.Value))); string activePiece = conversion.config.activePiece; if (conversion.config.activePiece != null) { Smelter component = ZNetScene.instance.GetPrefab(conversion.config.activePiece).GetComponent(); int num = component.m_conversion.IndexOf(item3.conversions[index]); if (num >= 0) { Smelter[] array3 = Resources.FindObjectsOfTypeAll(); foreach (Smelter val6 in array3) { if (Utils.GetPrefabName(((Component)val6).gameObject) == activePiece) { val6.m_conversion.RemoveAt(num); } } } conversion.config.activePiece = null; } if (item3.conversions[index].m_from != null && conversion.config.piece.Value != 0) { GameObject prefab = ZNetScene.instance.GetPrefab(text3); if (((prefab != null) ? prefab.GetComponent() : null) != null) { conversion.config.activePiece = text3; Smelter[] array4 = Resources.FindObjectsOfTypeAll(); foreach (Smelter val7 in array4) { if (Utils.GetPrefabName(((Component)val7).gameObject) == text3) { val7.m_conversion.Add(item3.conversions[index]); } } } } } } } } if ((item3.configurability & Configurability.Stats) != 0) { item3.statsConfigs.Clear(); SharedData shared2 = item3.Prefab.GetComponent().m_itemData.m_shared; ItemType itemType = shared2.m_itemType; statcfg("Weight", "Weight of " + englishName + ".", (SharedData shared) => shared.m_weight, delegate(SharedData shared, float value) { shared.m_weight = value; }); statcfg("Trader Value", "Trader value of " + englishName + ".", (SharedData shared) => shared.m_value, delegate(SharedData shared, int value) { shared.m_value = value; }); bool flag; switch (itemType - 3) { case 0: case 1: case 2: case 3: case 4: case 8: case 9: case 11: case 14: case 16: case 19: flag = true; break; default: flag = false; break; } if (flag) { statcfg("Durability", "Durability of " + englishName + ".", (SharedData shared) => shared.m_maxDurability, delegate(SharedData shared, float value) { shared.m_maxDurability = value; }); statcfg("Durability per Level", "Durability gain per level of " + englishName + ".", (SharedData shared) => shared.m_durabilityPerLevel, delegate(SharedData shared, float value) { shared.m_durabilityPerLevel = value; }); statcfg("Movement Speed Modifier", "Movement speed modifier of " + englishName + ".", (SharedData shared) => shared.m_movementModifier, delegate(SharedData shared, float value) { shared.m_movementModifier = value; }); } if ((itemType - 3 <= 2 || (int)itemType == 14 || (int)itemType == 22) ? true : false) { statcfg("Block Armor", "Block armor of " + englishName + ".", (SharedData shared) => shared.m_blockPower, delegate(SharedData shared, float value) { shared.m_blockPower = value; }); statcfg("Block Armor per Level", "Block armor per level for " + englishName + ".", (SharedData shared) => shared.m_blockPowerPerLevel, delegate(SharedData shared, float value) { shared.m_blockPowerPerLevel = value; }); statcfg("Block Force", "Block force of " + englishName + ".", (SharedData shared) => shared.m_deflectionForce, delegate(SharedData shared, float value) { shared.m_deflectionForce = value; }); statcfg("Block Force per Level", "Block force per level for " + englishName + ".", (SharedData shared) => shared.m_deflectionForcePerLevel, delegate(SharedData shared, float value) { shared.m_deflectionForcePerLevel = value; }); statcfg("Parry Bonus", "Parry bonus of " + englishName + ".", (SharedData shared) => shared.m_timedBlockBonus, delegate(SharedData shared, float value) { shared.m_timedBlockBonus = value; }); } else if ((itemType - 6 <= 1 || itemType - 11 <= 1 || (int)itemType == 17) ? true : false) { statcfg("Armor", "Armor of " + englishName + ".", (SharedData shared) => shared.m_armor, delegate(SharedData shared, float value) { shared.m_armor = value; }); statcfg("Armor per Level", "Armor per level for " + englishName + ".", (SharedData shared) => shared.m_armorPerLevel, delegate(SharedData shared, float value) { shared.m_armorPerLevel = value; }); } SkillType skillType = shared2.m_skillType; if (((int)skillType == 7 || (int)skillType == 12) ? true : false) { statcfg("Tool tier", "Tool tier of " + englishName + ".", (SharedData shared) => shared.m_toolTier, delegate(SharedData shared, int value) { shared.m_toolTier = value; }); } if ((itemType - 5 <= 2 || itemType - 11 <= 1 || (int)itemType == 17) ? true : false) { Dictionary modifiers = shared2.m_damageModifiers.ToDictionary((DamageModPair d) => d.m_type, (DamageModPair d) => (DamageModifier)d.m_modifier); DamageType[] first = (DamageType[])Enum.GetValues(typeof(DamageType)); DamageType[] array = new DamageType[5]; RuntimeHelpers.InitializeArray(array, (RuntimeFieldHandle)/*OpCode not supported: LdMemberToken*/); foreach (DamageType item9 in first.Except((IEnumerable)(object)array)) { DamageType damageType = item9; statcfg(((object)(DamageType)(ref damageType)).ToString() + " Resistance", ((object)(DamageType)(ref damageType)).ToString() + " resistance of " + englishName + ".", (SharedData _) => modifiers.TryGetValue(damageType, out var value3) ? value3 : DamageModifier.None, delegate(SharedData shared, DamageModifier value) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_009d: 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) DamageModPair val8 = default(DamageModPair); val8.m_type = damageType; val8.m_modifier = (DamageModifier)value; DamageModPair val9 = val8; for (int num2 = 0; num2 < shared.m_damageModifiers.Count; num2++) { if (shared.m_damageModifiers[num2].m_type == damageType) { if (value == DamageModifier.None) { shared.m_damageModifiers.RemoveAt(num2); } else { shared.m_damageModifiers[num2] = val9; } return; } } if (value != DamageModifier.None) { shared.m_damageModifiers.Add(val9); } }); } } if ((int)itemType == 2 && shared2.m_food > 0f) { statcfg("Health", "Health value of " + englishName + ".", (SharedData shared) => shared.m_food, delegate(SharedData shared, float value) { shared.m_food = value; }); statcfg("Stamina", "Stamina value of " + englishName + ".", (SharedData shared) => shared.m_foodStamina, delegate(SharedData shared, float value) { shared.m_foodStamina = value; }); statcfg("Eitr", "Eitr value of " + englishName + ".", (SharedData shared) => shared.m_foodEitr, delegate(SharedData shared, float value) { shared.m_foodEitr = value; }); statcfg("Duration", "Duration of " + englishName + ".", (SharedData shared) => shared.m_foodBurnTime, delegate(SharedData shared, float value) { shared.m_foodBurnTime = value; }); statcfg("Health Regen", "Health regen value of " + englishName + ".", (SharedData shared) => shared.m_foodRegen, delegate(SharedData shared, float value) { shared.m_foodRegen = value; }); } if ((int)shared2.m_skillType == 10) { statcfg("Health Cost", "Health cost of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackHealth, delegate(SharedData shared, float value) { shared.m_attack.m_attackHealth = value; }); statcfg("Health Cost Percentage", "Health cost percentage of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackHealthPercentage, delegate(SharedData shared, float value) { shared.m_attack.m_attackHealthPercentage = value; }); } skillType = shared2.m_skillType; if (skillType - 9 <= 1) { statcfg("Eitr Cost", "Eitr cost of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackEitr, delegate(SharedData shared, float value) { shared.m_attack.m_attackEitr = value; }); } if ((itemType - 3 <= 1 || (int)itemType == 14 || (int)itemType == 22) ? true : false) { statcfg("Knockback", "Knockback of " + englishName + ".", (SharedData shared) => shared.m_attackForce, delegate(SharedData shared, float value) { shared.m_attackForce = value; }); statcfg("Backstab Bonus", "Backstab bonus of " + englishName + ".", (SharedData shared) => shared.m_backstabBonus, delegate(SharedData shared, float value) { shared.m_backstabBonus = value; }); statcfg("Attack Stamina", "Attack stamina of " + englishName + ".", (SharedData shared) => shared.m_attack.m_attackStamina, delegate(SharedData shared, float value) { shared.m_attack.m_attackStamina = value; }); SetDmg("True", (DamageTypes dmg) => dmg.m_damage, delegate(ref DamageTypes dmg, float val) { dmg.m_damage = val; }); SetDmg("Slash", (DamageTypes dmg) => dmg.m_slash, delegate(ref DamageTypes dmg, float val) { dmg.m_slash = val; }); SetDmg("Pierce", (DamageTypes dmg) => dmg.m_pierce, delegate(ref DamageTypes dmg, float val) { dmg.m_pierce = val; }); SetDmg("Blunt", (DamageTypes dmg) => dmg.m_blunt, delegate(ref DamageTypes dmg, float val) { dmg.m_blunt = val; }); SetDmg("Chop", (DamageTypes dmg) => dmg.m_chop, delegate(ref DamageTypes dmg, float val) { dmg.m_chop = val; }); SetDmg("Pickaxe", (DamageTypes dmg) => dmg.m_pickaxe, delegate(ref DamageTypes dmg, float val) { dmg.m_pickaxe = val; }); SetDmg("Fire", (DamageTypes dmg) => dmg.m_fire, delegate(ref DamageTypes dmg, float val) { dmg.m_fire = val; }); SetDmg("Poison", (DamageTypes dmg) => dmg.m_poison, delegate(ref DamageTypes dmg, float val) { dmg.m_poison = val; }); SetDmg("Frost", (DamageTypes dmg) => dmg.m_frost, delegate(ref DamageTypes dmg, float val) { dmg.m_frost = val; }); SetDmg("Lightning", (DamageTypes dmg) => dmg.m_lightning, delegate(ref DamageTypes dmg, float val) { dmg.m_lightning = val; }); SetDmg("Spirit", (DamageTypes dmg) => dmg.m_spirit, delegate(ref DamageTypes dmg, float val) { dmg.m_spirit = val; }); if ((int)itemType == 4) { statcfg("Projectiles", "Number of projectiles that " + englishName + " shoots at once.", (SharedData shared) => shared.m_attack.m_projectileBursts, delegate(SharedData shared, int value) { shared.m_attack.m_projectileBursts = value; }); statcfg("Burst Interval", "Time between the projectiles " + englishName + " shoots at once.", (SharedData shared) => shared.m_attack.m_burstInterval, delegate(SharedData shared, float value) { shared.m_attack.m_burstInterval = value; }); statcfg("Minimum Accuracy", "Minimum accuracy for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileAccuracyMin, delegate(SharedData shared, float value) { shared.m_attack.m_projectileAccuracyMin = value; }); statcfg("Accuracy", "Accuracy for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileAccuracy, delegate(SharedData shared, float value) { shared.m_attack.m_projectileAccuracy = value; }); statcfg("Minimum Velocity", "Minimum velocity for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileVelMin, delegate(SharedData shared, float value) { shared.m_attack.m_projectileVelMin = value; }); statcfg("Velocity", "Velocity for " + englishName + ".", (SharedData shared) => shared.m_attack.m_projectileVel, delegate(SharedData shared, float value) { shared.m_attack.m_projectileVel = value; }); statcfg("Maximum Draw Time", "Time until " + englishName + " is fully drawn at skill level 0.", (SharedData shared) => shared.m_attack.m_drawDurationMin, delegate(SharedData shared, float value) { shared.m_attack.m_drawDurationMin = value; }); statcfg("Stamina Drain", "Stamina drain per second while drawing " + englishName + ".", (SharedData shared) => shared.m_attack.m_drawStaminaDrain, delegate(SharedData shared, float value) { shared.m_attack.m_drawStaminaDrain = value; }); } } } List traderAttributes; if ((item3.configurability & Configurability.Trader) != 0) { traderAttributes = new List(); item3.traderConfig = new TraderConfig { trader = config(englishName, "Trader Selling", item3.Trade.Trader, new ConfigDescription("Which traders sell " + englishName + ".", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = (order -= 1), Browsable = ((item3.configurationVisible & Configurability.Trader) != 0), Category = localizedName } })) }; item3.traderConfig.trader.SettingChanged += delegate { item3.ReloadTraderConfiguration(); foreach (ConfigurationManagerAttributes item10 in traderAttributes) { item10.Browsable = TraderBrowsability(); } reloadConfigDisplay(); }; item3.traderConfig.price = traderConfig("Trader Price", item3.Trade.Price, "Price of " + englishName + " at the trader."); item3.traderConfig.stack = traderConfig("Trader Stack", item3.Trade.Stack, "Stack size of " + englishName + " in the trader. Also known as the number of items sold by a trader in one transaction."); item3.traderConfig.requiredGlobalKey = traderConfig("Trader Required Global Key", item3.Trade.RequiredGlobalKey ?? "", "Required global key to unlock " + englishName + " at the trader."); if (item3.traderConfig.trader.Value != 0) { PrefabManager.AddItemToTrader(item3.Prefab, item3.traderConfig.trader.Value, item3.traderConfig.price.Value, item3.traderConfig.stack.Value, item3.traderConfig.requiredGlobalKey.Value); } } else if (item3.Trade.Trader != 0) { PrefabManager.AddItemToTrader(item3.Prefab, item3.Trade.Trader, item3.Trade.Price, item3.Trade.Stack, item3.Trade.RequiredGlobalKey); } void SetDmg(string dmgType, Func readDmg, setDmgFunc setDmg) { Func readDmg2 = readDmg; setDmgFunc setDmg2 = setDmg; statcfg(dmgType + " Damage", dmgType + " damage dealt by " + englishName + ".", (SharedData shared) => readDmg2(shared.m_damages), delegate(SharedData shared, float val) { setDmg2(ref shared.m_damages, val); }); statcfg(dmgType + " Damage Per Level", dmgType + " damage dealt increase per level for " + englishName + ".", (SharedData shared) => readDmg2(shared.m_damagesPerLevel), delegate(SharedData shared, float val) { setDmg2(ref shared.m_damagesPerLevel, val); }); } bool TraderBrowsability() { return item3.traderConfig.trader.Value != Trader.None; } void statcfg(string configName, string description, Func readDefault, Action setValue) where T : notnull { //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown Action setValue2 = setValue; SharedData shared3 = item3.Prefab.GetComponent().m_itemData.m_shared; ConfigEntry cfg2 = config(englishName, configName, readDefault(shared3), new ConfigDescription(description, (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Category = localizedName, Browsable = ((item3.configurationVisible & Configurability.Stats) != 0) } })); if ((item3.configurationVisible & Configurability.Stats) != 0) { setValue2(shared3, cfg2.Value); } item3.statsConfigs.Add((ConfigEntryBase)(object)cfg2, ApplyConfig); cfg2.SettingChanged += delegate { if ((item3.configurationVisible & Configurability.Stats) != 0) { ApplyConfig(); } }; void ApplyConfig() { item3.ApplyToAllInstances(delegate(ItemData item) { setValue2(item.m_shared, cfg2.Value); }); } } ConfigEntry traderConfig(string name, T value, string desc) where T : notnull { //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Expected O, but got Unknown ConfigurationManagerAttributes configurationManagerAttributes2 = new ConfigurationManagerAttributes { Order = (order -= 1), browsability = TraderBrowsability, Browsable = (TraderBrowsability() && (item3.configurationVisible & Configurability.Trader) != 0), Category = localizedName }; traderAttributes.Add(configurationManagerAttributes2); ConfigEntry val5 = config(englishName, name, value, new ConfigDescription(desc, (AcceptableValueBase)null, new object[1] { configurationManagerAttributes2 })); val5.SettingChanged += delegate { item3.ReloadTraderConfiguration(); }; return val5; } } if (saveOnConfigSet) { plugin.Config.SaveOnConfigSet = true; plugin.Config.Save(); } } configManager = ((type == null) ? null : Chainloader.ManagerObject.GetComponent(type)); foreach (Item registeredItem in registeredItems) { Item item2 = registeredItem; foreach (KeyValuePair recipe in item2.Recipes) { KeyValuePair kv = recipe; RequiredResourceList[] array2 = new RequiredResourceList[2] { kv.Value.RequiredItems, kv.Value.RequiredUpgradeItems }; foreach (RequiredResourceList requiredResourceList in array2) { for (int l = 0; l < requiredResourceList.Requirements.Count; l++) { ConfigEntry amountCfg; int resourceIndex; if ((item2.configurability & Configurability.Recipe) != 0) { amountCfg = requiredResourceList.Requirements[l].amountConfig; if (amountCfg != null) { resourceIndex = l; amountCfg.SettingChanged += ConfigChanged; } } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && activeRecipes.ContainsKey(item2) && activeRecipes[item2].TryGetValue(kv.Key, out List value2)) { foreach (Recipe item11 in value2) { item11.m_resources[resourceIndex].m_amount = amountCfg.Value; } } } } } } item2.InitializeNewRegisteredItem(); } } private void InitializeNewRegisteredItem() { foreach (KeyValuePair recipe in Recipes) { KeyValuePair kv = recipe; ConfigEntryBase enabledCfg = kv.Value.RecipeIsActive; if (enabledCfg != null) { ((object)enabledCfg).GetType().GetEvent("SettingChanged").AddEventHandler(enabledCfg, new EventHandler(ConfigChanged)); } void ConfigChanged(object o, EventArgs e) { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && activeRecipes.ContainsKey(this) && activeRecipes[this].TryGetValue(kv.Key, out List value)) { foreach (Recipe item in value) { item.m_enabled = (int)enabledCfg.BoxedValue != 0; } } } } } public void ReloadCraftingConfiguration() { if (Object.op_Implicit((Object)(object)ObjectDB.instance) && ObjectDB.instance.GetItemPrefab(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name)) == null) { registerRecipesInObjectDB(ObjectDB.instance); ObjectDB.instance.m_items.Add(Prefab); ObjectDB.instance.m_itemByHash.Add(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name), Prefab); ZNetScene.instance.m_prefabs.Add(Prefab); ZNetScene.instance.m_namedPrefabs.Add(StringExtensionMethods.GetStableHashCode(((Object)Prefab).name), Prefab); } foreach (string item in Recipes.Keys.DefaultIfEmpty("")) { if (Recipes.TryGetValue(item, out ItemRecipe value) && value.Crafting.Stations.Count > 0) { UpdateItemTableConfig(item, value.Crafting.Stations.First().Table, value.Crafting.Stations.First().custom ?? ""); UpdateCraftConfig(item, new SerializedRequirements(value.RequiredItems.Requirements), new SerializedRequirements(value.RequiredUpgradeItems.Requirements)); } } } private void ReloadTraderConfiguration() { if (traderConfig.trader.Value == Trader.None) { PrefabManager.RemoveItemFromTrader(Prefab); } else { PrefabManager.AddItemToTrader(Prefab, traderConfig.trader.Value, traderConfig.price.Value, traderConfig.stack.Value, traderConfig.requiredGlobalKey.Value); } } public static void ApplyToAllInstances(GameObject prefab, Action callback) { callback(prefab.GetComponent().m_itemData); string name = prefab.GetComponent().m_itemData.m_shared.m_name; Inventory[] source = (from c in Player.s_players.Select((Player p) => ((Humanoid)p).GetInventory()).Concat(from c in Object.FindObjectsOfType() select c.GetInventory()) where c != null select c).ToArray(); foreach (ItemData item in (from i in (from p in ObjectDB.instance.m_items select p.GetComponent() into c where Object.op_Implicit((Object)(object)c) && Object.op_Implicit((Object)(object)((Component)c).GetComponent()) select c).Concat(ItemDrop.s_instances) select i.m_itemData).Concat(source.SelectMany((Inventory i) => i.GetAllItems()))) { if (item.m_shared.m_name == name) { callback(item); } } } public void ApplyToAllInstances(Action callback) { ApplyToAllInstances(Prefab, callback); } private static string getInternalName(T value) where T : struct { return ((InternalName)typeof(T).GetMember(value.ToString())[0].GetCustomAttributes(typeof(InternalName)).First()).internalName; } private void registerRecipesInObjectDB(ObjectDB objectDB) { //IL_0498: Unknown result type (might be due to invalid IL or missing references) //IL_049d: Unknown result type (might be due to invalid IL or missing references) //IL_04d0: Unknown result type (might be due to invalid IL or missing references) //IL_04e6: Expected O, but got Unknown activeRecipes[this] = new Dictionary>(); itemCraftConfigs.TryGetValue(this, out Dictionary value); foreach (KeyValuePair recipe in Recipes) { List list = new List(); foreach (CraftingStationConfig station in recipe.Value.Crafting.Stations) { ItemConfig itemConfig = value?[recipe.Key]; Recipe val = ScriptableObject.CreateInstance(); string name = ((Object)Prefab).name; CraftingTable table = station.Table; ((Object)val).name = name + "_Recipe_" + table; val.m_amount = recipe.Value.CraftAmount; bool enabled; if (itemConfig != null) { enabled = itemConfig.table.Value != CraftingTable.Disabled; } else { ConfigEntryBase? recipeIsActive = recipe.Value.RecipeIsActive; enabled = (int)(((recipeIsActive != null) ? recipeIsActive.BoxedValue : null) ?? ((object)1)) != 0; } val.m_enabled = enabled; val.m_item = Prefab.GetComponent(); val.m_resources = SerializedRequirements.toPieceReqs(objectDB, (itemConfig?.craft == null) ? new SerializedRequirements(recipe.Value.RequiredItems.Requirements) : new SerializedRequirements(itemConfig.craft.Value), (itemConfig?.upgrade == null) ? new SerializedRequirements(recipe.Value.RequiredUpgradeItems.Requirements) : new SerializedRequirements(itemConfig.upgrade.Value)); table = ((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value); if ((uint)table <= 1u) { val.m_craftingStation = null; } else if (((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value) == CraftingTable.Custom) { GameObject prefab = ZNetScene.instance.GetPrefab((itemConfig == null || list.Count > 0) ? station.custom : itemConfig.customTable.Value); if (prefab != null) { val.m_craftingStation = prefab.GetComponent(); } else { Debug.LogWarning((object)("Custom crafting station '" + ((itemConfig == null || list.Count > 0) ? station.custom : itemConfig.customTable.Value) + "' does not exist")); } } else { val.m_craftingStation = ZNetScene.instance.GetPrefab(getInternalName((itemConfig == null || list.Count > 0) ? station.Table : itemConfig.table.Value)).GetComponent(); } val.m_minStationLevel = ((itemConfig == null || list.Count > 0) ? station.level : itemConfig.tableLevel.Value); val.m_requireOnlyOneIngredient = ((itemConfig == null) ? recipe.Value.RequireOnlyOneIngredient : (itemConfig.requireOneIngredient.Value == Toggle.On)); val.m_qualityResultAmountMultiplier = itemConfig?.qualityResultAmountMultiplier.Value ?? recipe.Value.QualityResultAmountMultiplier; list.Add(val); RequiredResourceList requiredItems = recipe.Value.RequiredItems; if (requiredItems != null && !requiredItems.Free) { List requirements = requiredItems.Requirements; if (requirements != null && requirements.Count == 0) { hiddenCraftRecipes.Add(val, recipe.Value.RecipeIsActive); } } requiredItems = recipe.Value.RequiredUpgradeItems; if (requiredItems != null && !requiredItems.Free) { List requirements = requiredItems.Requirements; if (requirements != null && requirements.Count == 0) { hiddenUpgradeRecipes.Add(val, recipe.Value.RecipeIsActive); } } } activeRecipes[this].Add(recipe.Key, list); objectDB.m_recipes.AddRange(list); } conversions = new List(); for (int i = 0; i < Conversions.Count; i++) { Conversion conversion = Conversions[i]; conversions.Add(new ItemConversion { m_from = SerializedRequirements.fetchByName(ObjectDB.instance, conversion.config?.input.Value ?? conversion.Input), m_to = Prefab.GetComponent() }); ConversionPiece conversionPiece = conversion.config?.piece.Value ?? conversion.Piece; string text = null; if (conversionPiece != 0 && conversions[i].m_from != null) { text = ((conversionPiece != ConversionPiece.Custom) ? getInternalName(conversionPiece) : (conversion.config?.customPiece.Value ?? conversion.customPiece)); GameObject prefab2 = ZNetScene.instance.GetPrefab(text); Smelter val2 = ((prefab2 != null) ? prefab2.GetComponent() : null); if (val2 != null) { val2.m_conversion.Add(conversions[i]); } else { text = null; } } if (conversion.config != null) { conversion.config.activePiece = text; } } } [HarmonyPriority(0)] internal static void Patch_ObjectDBInit(ObjectDB __instance) { if ((Object)(object)__instance.GetItemPrefab("YagluthDrop") == (Object)null) { return; } hiddenCraftRecipes.Clear(); hiddenUpgradeRecipes.Clear(); foreach (Item registeredItem in registeredItems) { registeredItem.registerRecipesInObjectDB(__instance); } } internal static void Patch_TraderGetAvailableItems(Trader __instance, ref List __result) { string prefabName = Utils.GetPrefabName(((Component)__instance).gameObject); if (1 == 0) { } Trader trader2 = ((prefabName == "Haldor") ? Trader.Haldor : ((prefabName == "Hildir") ? Trader.Hildir : Trader.None)); if (1 == 0) { } Trader trader = trader2; __result.AddRange(from tuple in PrefabManager.CustomTradeItems.Values where (tuple.Item1 & trader) != 0 select tuple.Item2 into tradeItem where string.IsNullOrEmpty(tradeItem.m_requiredGlobalKey) || ZoneSystem.instance.GetGlobalKey(tradeItem.m_requiredGlobalKey) select tradeItem); } internal static void Patch_OnAddSmelterInput(ItemData item, bool __result) { if (__result) { ((Humanoid)Player.m_localPlayer).UnequipItem(item, true); } } internal static void Patch_MaximumRequiredStationLevel(Recipe __instance, ref int __result, int quality) { if (!itemDropMap.TryGetValue(__instance.m_item, out Item value)) { return; } IEnumerable source; if (!itemCraftConfigs.TryGetValue(value, out Dictionary value2)) { source = Enumerable.Empty(); } else { CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation(); if (currentCraftingStation != null) { string stationName = Utils.GetPrefabName(((Component)currentCraftingStation).gameObject); source = from c in value2.Where(delegate(KeyValuePair c) { CraftingTable value3 = c.Value.table.Value; if (1 == 0) { } bool result; switch (value3) { case CraftingTable.Disabled: case CraftingTable.Inventory: result = false; break; case CraftingTable.Custom: result = c.Value.customTable.Value == stationName; break; default: result = getInternalName(c.Value.table.Value) == stationName; break; } if (1 == 0) { } return result; }) select c.Value; } else { source = value2.Values; } } __result = Mathf.Min(Mathf.Max(1, __instance.m_minStationLevel) + (quality - 1), (from cfg in source where cfg.maximumTableLevel != null select cfg.maximumTableLevel.Value).DefaultIfEmpty(value.MaximumRequiredStationLevel).Max()); } internal static void Patch_GetAvailableRecipesPrefix(ref Dictionary>? __state) { if (__state == null) { __state = new Dictionary>(); } Dictionary dictionary; if (InventoryGui.instance.InCraftTab()) { dictionary = hiddenCraftRecipes; } else { if (!InventoryGui.instance.InUpradeTab()) { return; } dictionary = hiddenUpgradeRecipes; } foreach (Recipe key in dictionary.Keys) { key.m_enabled = false; } __state[Assembly.GetExecutingAssembly()] = dictionary; } internal static void Patch_GetAvailableRecipesFinalizer(Dictionary> __state) { if (!__state.TryGetValue(Assembly.GetExecutingAssembly(), out Dictionary value)) { return; } foreach (KeyValuePair item in value) { Recipe key = item.Key; ConfigEntryBase value2 = item.Value; key.m_enabled = (int)(((value2 != null) ? value2.BoxedValue : null) ?? ((object)1)) != 0; } } internal static IEnumerable Transpile_SetupRequirementList(IEnumerable instructionsEnumerable, ILGenerator ilg) { //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Expected O, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Expected O, but got Unknown //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Expected O, but got Unknown //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Expected O, but got Unknown //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Expected O, but got Unknown //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Expected O, but got Unknown //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Expected O, but got Unknown //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Expected O, but got Unknown //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Expected O, but got Unknown //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Expected O, but got Unknown List list = instructionsEnumerable.ToList(); MethodInfo methodInfo = AccessTools.DeclaredMethod(typeof(InventoryGui), "SetupRequirement", (Type[])null, (Type[])null); CodeInstruction val = null; CodeInstruction val2 = null; LocalBuilder localBuilder = ilg.DeclareLocal(typeof(int)); Dictionary dictionary = new Dictionary(); bool flag = false; int num = 0; int value = 0; Label? label = default(Label?); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], methodInfo)) { val = list[i + 2]; val2 = list[i + 5]; flag = true; } if (flag) { if (CodeInstructionExtensions.Branches(list[i], ref label) && dictionary.TryGetValue(label.Value, out value)) { num = i; break; } continue; } foreach (Label label4 in list[i].labels) { dictionary[label4] = i; } } if (list[value - 3].opcode == OpCodes.Dup) { return list; } Label label2 = ilg.DefineLabel(); Label label3 = ilg.DefineLabel(); list[num + 1].labels.Add(label2); list.InsertRange(num + 1, (IEnumerable)(object)new CodeInstruction[11] { new CodeInstruction(OpCodes.Ldloc, (object)localBuilder), new CodeInstruction(OpCodes.Brfalse, (object)label2), val.Clone(), new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldfld, (object)AccessTools.DeclaredField(typeof(InventoryGui), "m_recipeRequirementList")), new CodeInstruction(OpCodes.Ldlen, (object)null), new CodeInstruction(OpCodes.Bgt, (object)label2), new CodeInstruction(OpCodes.Ldc_I4_0, (object)null), val2.Clone(), new CodeInstruction(OpCodes.Ldc_I4_0, (object)null), new CodeInstruction(OpCodes.Br, (object)label3) }); list.InsertRange(value - 2, (IEnumerable)(object)new CodeInstruction[2] { new CodeInstruction(OpCodes.Dup, (object)null) { labels = new List