Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of GlitnirFomeEGloria v0.0.1
GlitnirFomeEGloria.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
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.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.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.0")] 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<ItemConversion> vanillaCookingStationConversions; private static List<ItemConversion> vanillaCookingStationIronConversions; private static List<ItemConversion> vanillaOvenConversions; private static List<ItemConversion> 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<GameObject> prefabs = scene.m_prefabs; if (prefabs == null || prefabs.Count <= 0) { return; } try { GameObject prefab = scene.GetPrefab("piece_cookingstation"); CookingStation val = ((prefab != null) ? prefab.GetComponent<CookingStation>() : null); GameObject prefab2 = scene.GetPrefab("piece_cookingstation_iron"); CookingStation val2 = ((prefab2 != null) ? prefab2.GetComponent<CookingStation>() : null); GameObject prefab3 = scene.GetPrefab("piece_oven"); CookingStation val3 = ((prefab3 != null) ? prefab3.GetComponent<CookingStation>() : null); GameObject prefab4 = scene.GetPrefab("fermenter"); Fermenter val4 = ((prefab4 != null) ? prefab4.GetComponent<Fermenter>() : null); if (vanillaCookingStationConversions == null && (Object)(object)val != (Object)null && val.m_conversion != null) { vanillaCookingStationConversions = new List<ItemConversion>(val.m_conversion); } if (vanillaCookingStationIronConversions == null && (Object)(object)val2 != (Object)null && val2.m_conversion != null) { vanillaCookingStationIronConversions = new List<ItemConversion>(val2.m_conversion); } if (vanillaOvenConversions == null && (Object)(object)val3 != (Object)null && val3.m_conversion != null) { vanillaOvenConversions = new List<ItemConversion>(val3.m_conversion); } if (vanillaFermenterConversions == null && (Object)(object)val4 != (Object)null && val4.m_conversion != null) { vanillaFermenterConversions = new List<ItemConversion>(val4.m_conversion); } GameObject prefab5 = scene.GetPrefab("GFG_DefumadorMadeira"); CookingStation val5 = ((prefab5 != null) ? prefab5.GetComponent<CookingStation>() : null); GameObject prefab6 = scene.GetPrefab("GFG_DefumadorPedra"); CookingStation val6 = ((prefab6 != null) ? prefab6.GetComponent<CookingStation>() : null); GameObject prefab7 = scene.GetPrefab("GFG_FermentadorDvergr"); Fermenter val7 = ((prefab7 != null) ? prefab7.GetComponent<Fermenter>() : 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<ItemConversion> 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<ItemConversion> 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<CookingStation>((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<ItemConversion>(cookingStationPrefab.m_conversion); num++; } else if (prefabName == "piece_cookingstation_iron" && (Object)(object)cookingStationIronPrefab != (Object)null) { val.m_conversion = new List<ItemConversion>(cookingStationIronPrefab.m_conversion); num++; } else if (prefabName == "piece_oven" && (Object)(object)cookingStationOvenPrefab != (Object)null) { val.m_conversion = new List<ItemConversion>(cookingStationOvenPrefab.m_conversion); num++; } else if (prefabName == "GFG_DefumadorMadeira" && (Object)(object)smokehouseWoodPrefab != (Object)null) { val.m_conversion = new List<ItemConversion>(smokehouseWoodPrefab.m_conversion); num++; } else if (prefabName == "GFG_DefumadorPedra" && (Object)(object)smokehouseStonePrefab != (Object)null) { val.m_conversion = new List<ItemConversion>(smokehouseStonePrefab.m_conversion); num++; } } } Fermenter[] array2 = Object.FindObjectsByType<Fermenter>((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<ItemConversion>(fermenterPrefab.m_conversion); num++; } else if (prefabName2 == "GFG_FermentadorDvergr" && (Object)(object)legendFermenterPrefab != (Object)null) { val2.m_conversion = new List<ItemConversion>(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>(); ItemDrop component2 = prefab2.GetComponent<ItemDrop>(); 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>(); ItemDrop component2 = prefab2.GetComponent<ItemDrop>(); 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<DropOnDestroyed>(); 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<string> noOvercookList = new HashSet<string>(); private static HashSet<string> multiFuelList = new HashSet<string>(); private static HashSet<string> passiveCookingList = new HashSet<string>(); private static Dictionary<string, List<string>> prefabFuelMap = new Dictionary<string, List<string>>(); 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<string> 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<string> 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<string> 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<object>()); __result = true; return false; } [HarmonyPostfix] [HarmonyPatch("OnHoverFuelSwitch")] public static void OnHoverFuelSwitch_Postfix(CookingStation __instance, ref string __result) { if (!IsMultiFuelStation(__instance)) { return; } List<string> allowedFuels = GetAllowedFuels(__instance); if (allowedFuels == null || allowedFuels.Count == 0) { return; } float fuel = __instance.GetFuel(); List<string> list = new List<string>(); 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<ItemDrop>(); 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" + "[<color=yellow><b>$KEY_Use</b></color>] $piece_smelter_add " + text); } [HarmonyPostfix] [HarmonyPatch("TryGetItems")] public static void TryGetItems_Postfix(CookingStation __instance, Switch switchRef, ref List<string> items, ref bool __result) { if (__result && IsMultiFuelStation(__instance) && (Object)(object)switchRef == (Object)(object)__instance.m_addFuelSwitch) { List<string> 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<CookingStation>(); 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<ItemDrop>(); 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<KeyValuePair<GameObject, int>> __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<GameObject, int>(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<KeyValuePair<GameObject, int>> __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<KeyValuePair<GameObject, int>> list = new List<KeyValuePair<GameObject, int>>(); foreach (KeyValuePair<GameObject, int> item in __result) { if ((Object)(object)item.Key == (Object)null) { list.Add(item); continue; } ItemDrop component = item.Key.GetComponent<ItemDrop>(); 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<GameObject, int>(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<ItemDrop>(); 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<GameObject, int> 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<GameObject, int>(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>)Player.s_players).FirstOrDefault((Func<Player, bool>)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<ItemDrop>(); 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>)Player.s_players).FirstOrDefault((Func<Player, bool>)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<KeyValuePair<GameObject, int>> __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>)Player.GetAllPlayers()).FirstOrDefault((Func<Player, bool>)((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<Character>(); 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<GameObject, int> keyValuePair = __result[i]; if (!((Object)(object)keyValuePair.Key == (Object)null)) { ItemDrop component2 = keyValuePair.Key.GetComponent<ItemDrop>(); 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<GameObject, int>(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<GameObject, int>(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<string, HashSet<long>> ProcessedContainers = new Dictionary<string, HashSet<long>>(); [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<long>(); } if (ProcessedContainers[key].Contains(playerID)) { return; } ProcessedContainers[key].Add(playerID); if (__instance.m_inventory == null) { return; } List<ItemData> list = new List<ItemData>(__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<ItemDrop>(); 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<GameObject>(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}"); } } } } private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order = null; [UsedImplicitly] public bool? Browsable = null; [UsedImplicitly] public string? Category = null; [UsedImplicitly] public Action<ConfigEntryBase>? 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.0"; 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<string> SmokehouseNoOvercookPrefabs; public static ConfigEntry<string> SmokehouseMultiFuelPrefabs; public static ConfigEntry<string> SmokehouseAllowedFuels; public static ConfigEntry<string> PassiveCookingPrefabs; private static ConfigEntry<float> greydwarfDropChance; private static ConfigEntry<int> greydwarfDropMin; private static ConfigEntry<int> greydwarfDropMax; private static ConfigEntry<float> greydwarfEliteDropChance; private static ConfigEntry<int> greydwarfEliteDropMin; private static ConfigEntry<int> greydwarfEliteDropMax; private static ConfigEntry<float> greydwarfShamanDropChance; private static ConfigEntry<int> greydwarfShamanDropMin; private static ConfigEntry<int> greydwarfShamanDropMax; public static ConfigEntry<float> VidarrBossDamageMultiplier; public static ConfigEntry<float> TrophyDropBonusPercent; public static ConfigEntry<int> MeatDropBonus; public static ConfigEntry<float> FreyrPickableBonusChance; public static ConfigEntry<int> FreyrPickableBonusAmount; public static ConfigEntry<float> FreyrCreatureCoinBonusChance; public static ConfigEntry<int> FreyrCreatureCoinBonusAmount; public static ConfigEntry<float> FreyrChestBonusChance; public static ConfigEntry<int> FreyrChestBonusAmount; public static ConfigEntry<string> FreyrPickableItems; public static ConfigEntry<string> FreyrChestItems; public static ConfigEntry<string> FreyrCreatureNames; public static ConfigEntry<float> NjordrSailingSpeedMultiplier; public static ConfigEntry<float> TorrDraughtPowerAttackBonus; public static ConfigEntry<float> TorrDraughtLightningChance; public static ConfigEntry<float> FreyjaStaffEitrReduction; public static ConfigEntry<float> IdunnHealthBonus; public static ConfigEntry<float> IdunnStaminaBonus; public static ConfigEntry<float> IdunnEitrBonus; public static ConfigEntry<float> BaldrSpiritDamageBonus; private static Dictionary<string, ConversionData> DefaultCookingStationConversions; private static Dictionary<string, ConversionData> DefaultIronCookingStationConversions; private static Dictionary<string, ConversionData> DefaultOvenConversions; private static Dictionary<string, ConversionData> DefaultFermenterConversions; private static Dictionary<string, ConversionData> DefaultSmokehouseWoodConversions; private static Dictionary<string, ConversionData> DefaultSmokehouseStoneConversions; private static Dictionary<string, ConversionData> DefaultLegendFermenterConversions; public static ConfigEntry<string> CookingStationConversions; public static ConfigEntry<string> CookingStationIronConversions; public static ConfigEntry<string> OvenConversions; public static ConfigEntry<string> FermenterConversions; public static ConfigEntry<string> SmokehouseWoodConversions; public static ConfigEntry<string> SmokehouseStoneConversions; public static ConfigEntry<string> LegendFermenterConversions; public Texture2D tex = null; private static HashSet<string> _cachedPickableItems; private static HashSet<string> _cachedChestItems; private static HashSet<string> _cachedCreaturePrefabs; private static ConfigEntry<Toggle> _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<string, ConversionData> dict, bool isFermenter = false) { if (dict == null || dict.Count == 0) { return ""; } List<string> list = new List<string>(); foreach (KeyValuePair<string, ConversionData> 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 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<Toggle>(_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<float>(0f, 100f), Array.Empty<object>())); greydwarfDropMin = config("Greydwarf Blue Mushroom Drops", "Greydwarf Drop Min", 1, new ConfigDescription("Minimum amount of blue mushrooms dropped by Greydwarf", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>())); greydwarfDropMax = config("Greydwarf Blue Mushroom Drops", "Greydwarf Drop Max", 2, new ConfigDescription("Maximum amount of blue mushrooms dropped by Greydwarf", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>())); 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<float>(0f, 100f), Array.Empty<object>())); 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<int>(1, 10), Array.Empty<object>())); 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<int>(1, 10), Array.Empty<object>())); 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<float>(0f, 100f), Array.Empty<object>())); 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<int>(1, 10), Array.Empty<object>())); 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<int>(1, 10), Array.Empty<object>())); 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<float>(1f, 3f), Array.Empty<object>())); 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<float>(0f, 100f), Array.Empty<object>())); 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<int>(0, 10), Array.Empty<object>())); 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<float>(0f, 1f), Array.Empty<object>())); 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<int>(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<float>(0f, 1f), Array.Empty<object>())); 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<int>(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<float>(0f, 1f), Array.Empty<object>())); 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<int>(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<float>(1f, 10f), Array.Empty<object>())); 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<float>(0f, 10f), Array.Empty<object>())); 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<float>(0f, 1f), Array.Empty<object>())); FreyjaStaffEitrReduction = config("Freyja Draught", "Staff Eitr Reduction", 25f, new ConfigDescription("Percentage of eitr cost reduction for staff attacks (0-100)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 100f), Array.Empty<object>())); 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<float>(0f, 100f), Array.Empty<object>())); 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."); item9.DropsFrom.Add("Dverger", 0.4f); item9.DropsFrom.Add("DvergerAshlands", 0.4f); 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."); item10.DropsFrom.Add("Dverger", 0.3f); item10.DropsFrom.Add("DvergerMageFire", 0.3f); item10.DropsFrom.Add("DvergerMageIce", 0.3f); item10.DropsFrom.Add("DvergerMageSupport", 0.3f); item10.DropsFrom.Add("DvergerAshlands", 0.3f); 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."); item11.DropsFrom.Add("DvergerMageFire", 0.4f); item11.DropsFrom.Add("DvergerMageIce", 0.4f); item11.DropsFrom.Add("DvergerMageSupport", 0.4f); item11.DropsFrom.Add("DvergerAshlands", 0.4f); 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", 1f, 2, 6); 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("RawMeat", 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"); item