using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using TMPro;
using TillValhalla.Configurations;
using TillValhalla.Configurations.Sections;
using TillValhalla.GameClasses;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("TillValhalla")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TillValhalla")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("0.0.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.1.0")]
internal static class GameObjectAssistant
{
private static Dictionary<int, Stopwatch> stopwatches = new Dictionary<int, Stopwatch>();
public static Stopwatch GetStopwatch(GameObject o)
{
int instanceID = ((Object)o).GetInstanceID();
if (!stopwatches.TryGetValue(instanceID, out var value))
{
value = new Stopwatch();
stopwatches[instanceID] = value;
}
return value;
}
public static T GetChildComponentByName<T>(string name, GameObject objected) where T : Component
{
T[] componentsInChildren = objected.GetComponentsInChildren<T>(true);
foreach (T val in componentsInChildren)
{
if (((Object)((Component)val).gameObject).name == name)
{
return val;
}
}
return default(T);
}
}
public class HotBarUtils
{
public static bool IgnoreKeyPresses(bool extra = false)
{
if (!extra)
{
if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog())
{
Chat instance = Chat.instance;
if (instance == null)
{
return false;
}
return instance.HasFocus();
}
return true;
}
if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog())
{
Chat instance2 = Chat.instance;
if ((instance2 == null || !instance2.HasFocus()) && !StoreGui.IsVisible() && !InventoryGui.IsVisible() && !Menu.IsVisible())
{
TextViewer instance3 = TextViewer.instance;
if (instance3 == null)
{
return false;
}
return instance3.IsVisible();
}
}
return true;
}
public static bool CheckKeyDown(string value)
{
try
{
return Input.GetKeyDown(value.ToLower());
}
catch
{
return false;
}
}
}
namespace TillValhalla
{
[BepInPlugin("kwilson.TillValhalla", "TillValhalla", "2.4.20")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class TillValhalla : BaseUnityPlugin
{
public static class WoodDefinitions
{
public static readonly string FineWoodName = "$item_finewood";
public static readonly string RoundLogName = "$item_roundlog";
}
[HarmonyPatch(typeof(Terminal), "InputText")]
private static class InputText_Patch
{
private static bool Prefix(Terminal __instance)
{
if (!Configuration.modisenabled.Value)
{
return true;
}
string text = ((TMP_InputField)__instance.m_input).text;
if (text.ToLower().Equals("hotbarswitch reset"))
{
((BaseUnityPlugin)context).Config.Reload();
((BaseUnityPlugin)context).Config.Save();
Traverse.Create((object)__instance).Method("AddString", new object[1] { text }).GetValue();
Traverse.Create((object)__instance).Method("AddString", new object[1] { "hotbar switch config reloaded" }).GetValue();
return false;
}
return true;
}
}
public const string PluginGUID = "kwilson.TillValhalla";
public const string PluginName = "TillValhalla";
public const string PluginVersion = "2.4.20";
public readonly Harmony _harmony = new Harmony("kwilson.TillValhalla");
private AssetBundle undestructablewallbundle;
private AssetBundle testspritebundle;
private static TillValhalla context;
private Texture2D Textureprefab;
private Sprite wings;
private Sprite varpaint1;
private CustomLocalization Localization;
public static List<string> whitelist = new List<string>();
public static Dictionary<string, AudioClip> SFX = new Dictionary<string, AudioClip>();
public static Dictionary<string, Dictionary<string, AudioClip>> SFXList = new Dictionary<string, Dictionary<string, AudioClip>>();
private void Awake()
{
context = this;
Configuration.Awake((BaseUnityPlugin)(object)this);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Game Configuration");
if (!Configuration.modisenabled.Value)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Error while loading configuration file.");
return;
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"Configuration file successfully loaded");
LoadConfigs();
_harmony.PatchAll();
AddLocalizations();
LoadSFX();
PrefabManager.OnVanillaPrefabsAvailable += ModifyVanillaItems;
PrefabManager.OnVanillaPrefabsAvailable += DropTableAdd.surtingcoredropadd;
PrefabManager.OnVanillaPrefabsAvailable += AddItemsandprefabs;
}
private void Update()
{
if (!Configuration.modisenabled.Value || HotBarUtils.IgnoreKeyPresses(extra: true) || !HotBarUtils.CheckKeyDown(inventoryconfiguration.hotKey.Value))
{
return;
}
int height = ((Humanoid)Player.m_localPlayer).GetInventory().GetHeight();
int num = Math.Max(1, Math.Min(height, inventoryconfiguration.rowsToSwitch.Value));
List<ItemData> value = Traverse.Create((object)((Humanoid)Player.m_localPlayer).GetInventory()).Field("m_inventory").GetValue<List<ItemData>>();
for (int i = 0; i < value.Count; i++)
{
if (value[i].m_gridPos.y < num)
{
value[i].m_gridPos.y--;
if (value[i].m_gridPos.y < 0)
{
value[i].m_gridPos.y = num - 1;
}
}
}
Traverse.Create((object)((Humanoid)Player.m_localPlayer).GetInventory()).Method("Changed", Array.Empty<object>()).GetValue();
}
private void LoadSFX()
{
string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Audio");
((BaseUnityPlugin)this).Logger.LogInfo((object)text);
if (Directory.Exists(text))
{
SFX.Clear();
SFXList.Clear();
if (Directory.Exists(Path.Combine(text, "SFX")))
{
CollectAudioFiles(Path.Combine(text, "SFX"), SFX, SFXList);
}
else
{
Directory.CreateDirectory(Path.Combine(text, "SFX"));
}
}
else
{
Directory.CreateDirectory(text);
Directory.CreateDirectory(Path.Combine(text, "SFX"));
}
}
private void CollectAudioFiles(string path, Dictionary<string, AudioClip> customDict, Dictionary<string, Dictionary<string, AudioClip>> customDictDict)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Checking folder " + Path.GetFileName(path)));
string[] files = Directory.GetFiles(path);
foreach (string path2 in files)
{
PreloadClipCoroutine(path2, (AudioType)0, customDict);
}
files = Directory.GetDirectories(path);
foreach (string path3 in files)
{
string fileName = Path.GetFileName(path3);
string[] files2 = Directory.GetFiles(path3);
customDictDict[fileName] = new Dictionary<string, AudioClip>();
string[] array = files2;
foreach (string path4 in array)
{
PreloadClipCoroutine(path4, (AudioType)0, customDictDict[fileName]);
}
if (files2.Length == 1 && files2[0].ToLower().EndsWith(".txt"))
{
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(files2[0]);
if (customDictDict.ContainsKey(fileNameWithoutExtension))
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("\tLinking music folder " + fileName + " to folder " + fileNameWithoutExtension));
customDictDict[fileName] = customDictDict[fileNameWithoutExtension];
}
}
}
}
private void PreloadClipCoroutine(string path, AudioType audioType, Dictionary<string, AudioClip> whichDict)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Invalid comparison between Unknown and I4
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Expected O, but got Unknown
if (path.EndsWith(".txt") || !Path.HasExtension(path))
{
return;
}
try
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Path: " + path));
UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(new Uri(path).AbsoluteUri, audioType);
try
{
UnityWebRequestAsyncOperation val = audioClip.SendWebRequest();
while (!((AsyncOperation)val).isDone)
{
}
if ((int)audioClip.result != 1)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Failed to load audio clip. Error: " + audioClip.error + ", URL: " + audioClip.url));
return;
}
DownloadHandlerAudioClip val2 = (DownloadHandlerAudioClip)audioClip.downloadHandler;
AudioClip val3 = ((val2 != null) ? val2.audioClip : null);
if ((Object)(object)val3 == (Object)null)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Audio clip is null. Response data: " + ((DownloadHandler)val2).text));
return;
}
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(path);
if (!whichDict.ContainsKey(fileNameWithoutExtension))
{
whichDict[fileNameWithoutExtension] = val3;
((BaseUnityPlugin)this).Logger.LogInfo((object)("Added audio clip '" + fileNameWithoutExtension + "' to dictionary."));
}
}
finally
{
((IDisposable)audioClip)?.Dispose();
}
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)("Exception occurred while loading audio clip: " + ex.Message));
}
}
private void AddLocalizations()
{
Localization = LocalizationManager.Instance.GetLocalization();
CustomLocalization localization = Localization;
string text = "English";
localization.AddTranslation(ref text, new Dictionary<string, string>
{
{ "fire_wood_chest_name", "Firewood Chest" },
{ "fire_wood_chest_description", "Chest for storing wood for the fires to pull from." }
});
}
private void AddItemsandprefabs()
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Expected O, but got Unknown
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Expected O, but got Unknown
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
PieceConfig val = new PieceConfig();
val.Name = "$fire_wood_chest_name";
val.Description = "$fire_wood_chest_description";
val.PieceTable = "Hammer";
val.Category = "Crafting";
PieceManager.Instance.AddPiece(new CustomPiece("firewood_chest", "piece_chest_wood", val));
PieceManager.Instance.GetPiece("firewood_chest").PiecePrefab.GetComponent<Container>().m_name = "$fire_wood_chest_name";
PieceManager.Instance.GetPiece("firewood_chest").PiecePrefab.GetComponent<Transform>().localScale = new Vector3(0.5f, 0.5f, 0.5f);
PrefabManager.OnVanillaPrefabsAvailable -= AddItemsandprefabs;
}
private void LoadConfigs()
{
try
{
GameConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Game Configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Game Configuration");
}
try
{
BeehiveConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load beehive configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Beehive Configuration");
}
try
{
ItemDropConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load ItemDrop configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded ItemDrop Configuration");
}
try
{
inventoryconfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Inventory Configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Inventory Configuration");
}
try
{
ShipConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Ship Configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Ship Configuration");
}
try
{
CraftingStationConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load CraftingStation configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded CraftingStation Configuration");
}
try
{
gatherconfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Gather configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Gather Configuration");
}
try
{
FireplaceConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Fireplace configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Fireplace Configuration");
}
try
{
PlayerConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Player configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Player Configuration");
}
try
{
PlantConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Plant configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Plant Configuration");
}
try
{
containerconfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Container configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Container Configuration");
}
try
{
SmelterConfiguration.Awake((BaseUnityPlugin)(object)this);
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Smelter configuration");
}
finally
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Smelter Configuration");
}
try
{
SapCollectorConfiguration.Awake((BaseUnityPlugin)(object)this);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded Sap Collection Configuration");
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load Sap collection configuration");
}
try
{
ZSFXConfiguration.Awake((BaseUnityPlugin)(object)this);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded ZSFX Configuration");
}
catch
{
((BaseUnityPlugin)this).Logger.LogError((object)"Failed to load ZSFX configuration");
}
SynchronizationManager.OnConfigurationSynchronized += delegate(object obj, ConfigurationSynchronizationEventArgs attr)
{
if (attr.InitialSynchronization)
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Initial Config sync event received");
}
else
{
((BaseUnityPlugin)this).Logger.LogInfo((object)"Config sync event received");
}
};
}
private void ModifyVanillaItems()
{
try
{
GameObject prefab = PrefabManager.Instance.GetPrefab("SwordCheat");
prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_damages.m_slash = 0f;
prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_damages.m_chop = 0f;
prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_damages.m_pickaxe = 0f;
}
catch (Exception arg)
{
((BaseUnityPlugin)this).Logger.LogError((object)$"Error while adding variant item: {arg}");
}
finally
{
PrefabManager.OnVanillaPrefabsAvailable -= ModifyVanillaItems;
}
}
}
internal static class helper
{
public static float applyModifierValue(float targetValue, float value)
{
if (value <= -100f)
{
value = -100f;
}
float num = targetValue;
if (value >= 0f)
{
return targetValue + targetValue / 100f * value;
}
return targetValue - targetValue / 100f * (value * -1f);
}
public static int Clamp(int value, int min, int max)
{
return Math.Min(max, Math.Max(min, value));
}
public static float Clamp(float value, float min, float max)
{
return Math.Min(max, Math.Max(min, value));
}
}
internal static class InventoryAssistant
{
public static List<Container> GetNearbyFireWoodChests(GameObject target, float range, bool checkWard = true)
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
string[] array = new string[1] { "piece" };
array = new string[3] { "piece", "item", "vehicle" };
IOrderedEnumerable<Collider> orderedEnumerable = from x in Physics.OverlapSphere(target.transform.position, range, LayerMask.GetMask(array))
orderby Vector3.Distance(((Component)x).gameObject.transform.position, target.transform.position)
select x;
List<Container> list = new List<Container>();
foreach (Collider item in orderedEnumerable)
{
try
{
Container componentInParent = ((Component)item).GetComponentInParent<Container>();
bool flag = componentInParent.CheckAccess(Player.m_localPlayer.GetPlayerID());
if (checkWard)
{
flag = flag && PrivateArea.CheckAccess(((Component)item).gameObject.transform.position, 0f, false, true);
}
Piece componentInParent2 = ((Component)componentInParent).GetComponentInParent<Piece>();
_ = (Object)(object)((Component)componentInParent).GetComponentInParent<Vagon>() != (Object)null;
_ = (Object)(object)((Component)componentInParent).GetComponentInParent<Ship>() != (Object)null;
if ((Object)(object)componentInParent2 != (Object)null && flag && componentInParent.GetInventory() != null && componentInParent2.IsPlacedByPlayer() && componentInParent.m_name == "$fire_wood_chest_name")
{
list.Add(componentInParent);
}
}
catch
{
}
}
return list;
}
public static List<Container> GetNearbyChests(GameObject target, float range, bool checkWard = true)
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
string[] array = new string[1] { "piece" };
if (CraftingStationConfiguration.craftFromCarts.Value || CraftingStationConfiguration.craftFromShips.Value)
{
array = new string[3] { "piece", "item", "vehicle" };
}
IOrderedEnumerable<Collider> orderedEnumerable = from x in Physics.OverlapSphere(target.transform.position, range, LayerMask.GetMask(array))
orderby Vector3.Distance(((Component)x).gameObject.transform.position, target.transform.position)
select x;
List<Container> list = new List<Container>();
foreach (Collider item in orderedEnumerable)
{
try
{
Container componentInParent = ((Component)item).GetComponentInParent<Container>();
bool flag = componentInParent.CheckAccess(Player.m_localPlayer.GetPlayerID());
if (checkWard)
{
flag = flag && PrivateArea.CheckAccess(((Component)item).gameObject.transform.position, 0f, false, true);
}
Piece componentInParent2 = ((Component)componentInParent).GetComponentInParent<Piece>();
bool flag2 = (Object)(object)((Component)componentInParent).GetComponentInParent<Vagon>() != (Object)null;
bool flag3 = (Object)(object)((Component)componentInParent).GetComponentInParent<Ship>() != (Object)null;
if ((Object)(object)componentInParent2 != (Object)null && flag && componentInParent.GetInventory() != null && (!flag2 || CraftingStationConfiguration.craftFromCarts.Value) && (!flag3 || CraftingStationConfiguration.craftFromShips.Value) && (componentInParent2.IsPlacedByPlayer() || (flag3 && CraftingStationConfiguration.craftFromShips.Value)) && componentInParent.m_name != "$fire_wood_chest_name")
{
list.Add(componentInParent);
}
}
catch
{
}
}
return list;
}
public static List<Container> GetNearbyChestsWithItem(GameObject target, float range, ItemData itemInfo, bool checkWard = true)
{
List<Container> nearbyChests = GetNearbyChests(target, range, checkWard);
List<Container> list = new List<Container>();
foreach (Container item in nearbyChests)
{
if (ChestContainsItem(item, itemInfo))
{
list.Add(item);
}
}
return list;
}
public static bool ChestContainsItem(Container chest, ItemData needle)
{
foreach (ItemData allItem in chest.GetInventory().GetAllItems())
{
if (allItem.m_shared.m_name == needle.m_shared.m_name)
{
return true;
}
}
return false;
}
public static bool ChestContainsItem(Container chest, string needle)
{
foreach (ItemData allItem in chest.GetInventory().GetAllItems())
{
if (allItem.m_shared.m_name == needle)
{
return true;
}
}
return false;
}
public static List<ItemData> GetNearbyChestItems(GameObject target, float range = 10f, bool checkWard = true)
{
List<ItemData> list = new List<ItemData>();
foreach (Container nearbyChest in GetNearbyChests(target, range, checkWard))
{
foreach (ItemData allItem in nearbyChest.GetInventory().GetAllItems())
{
list.Add(allItem);
}
}
return list;
}
public static List<ItemData> GetNearbyChestItemsByContainerList(List<Container> nearbyChests)
{
List<ItemData> list = new List<ItemData>();
foreach (Container nearbyChest in nearbyChests)
{
list.AddRange(nearbyChest.GetInventory().GetAllItems());
}
return list;
}
public static int GetItemAmountInItemList(List<ItemData> itemList, ItemData needle)
{
int num = 0;
foreach (ItemData item in itemList)
{
if (item.m_shared.m_name == needle.m_shared.m_name)
{
num += item.m_stack;
}
}
return num;
}
public static int GetItemAmountInItemList(List<ItemData> itemList, string needle)
{
int num = 0;
foreach (ItemData item in itemList)
{
if (item.m_shared.m_name == needle)
{
num += item.m_stack;
}
}
return num;
}
public static int RemoveItemInAmountFromAllNearbyChests(GameObject target, float range, ItemData needle, int amount, bool checkWard = true)
{
List<Container> nearbyChests = GetNearbyChests(target, range, checkWard);
GetItemAmountInItemList(GetNearbyChestItemsByContainerList(nearbyChests), needle);
if (amount == 0)
{
return 0;
}
int num = 0;
foreach (Container item in nearbyChests)
{
if (num != amount)
{
int num2 = RemoveItemFromChest(item, needle, amount);
num += num2;
amount -= num2;
}
}
return num;
}
public static int RemoveFireWoodItemInAmountFromAllNearbyChests(GameObject target, float range, ItemData needle, int amount, bool checkWard = true)
{
List<Container> nearbyFireWoodChests = GetNearbyFireWoodChests(target, range, checkWard);
GetItemAmountInItemList(GetNearbyChestItemsByContainerList(nearbyFireWoodChests), needle);
if (amount == 0)
{
return 0;
}
int num = 0;
foreach (Container item in nearbyFireWoodChests)
{
if (num != amount)
{
int num2 = RemoveItemFromChest(item, needle, amount);
num += num2;
amount -= num2;
}
}
return num;
}
public static int RemoveItemInAmountFromAllNearbyChests(GameObject target, float range, string needle, int amount, bool checkWard = true)
{
List<Container> nearbyChests = GetNearbyChests(target, range, checkWard);
GetItemAmountInItemList(GetNearbyChestItemsByContainerList(nearbyChests), needle);
if (amount == 0)
{
return 0;
}
int num = 0;
foreach (Container item in nearbyChests)
{
if (num != amount)
{
int num2 = RemoveItemFromChest(item, needle, amount);
num += num2;
amount -= num2;
}
}
return num;
}
public static int RemoveItemFromChest(Container chest, ItemData needle, int amount = 1)
{
if (!ChestContainsItem(chest, needle))
{
return 0;
}
int num = 0;
List<ItemData> allItems = chest.GetInventory().GetAllItems();
foreach (ItemData item in allItems)
{
if (item.m_shared.m_name == needle.m_shared.m_name)
{
int num2 = Mathf.Min(item.m_stack, amount);
item.m_stack -= num2;
amount -= num2;
num += num2;
if (amount <= 0)
{
break;
}
}
}
if (num == 0)
{
return 0;
}
allItems.RemoveAll((ItemData x) => x.m_stack <= 0);
chest.m_inventory.m_inventory = allItems;
ConveyContainerToNetwork(chest);
return num;
}
public static int RemoveItemFromChest(Container chest, string needle, int amount = 1)
{
if (!ChestContainsItem(chest, needle))
{
return 0;
}
int num = 0;
List<ItemData> allItems = chest.GetInventory().GetAllItems();
foreach (ItemData item in allItems)
{
if (item.m_shared.m_name == needle)
{
int num2 = Mathf.Min(item.m_stack, amount);
item.m_stack -= num2;
amount -= num2;
num += num2;
if (amount <= 0)
{
break;
}
}
}
if (num == 0)
{
return 0;
}
allItems.RemoveAll((ItemData x) => x.m_stack <= 0);
chest.m_inventory.m_inventory = allItems;
ConveyContainerToNetwork(chest);
return num;
}
public static void ConveyContainerToNetwork(Container c)
{
c.Save();
c.GetInventory().Changed();
}
}
}
namespace TillValhalla.GameClasses
{
[HarmonyPatch(typeof(CookingStation), "FindCookableItem")]
public static class CookingStation_FindCookableItem_Transpiler
{
private static List<Container> nearbyChests = null;
private static MethodInfo method_PullCookableItemFromNearbyChests = AccessTools.Method(typeof(CookingStation_FindCookableItem_Transpiler), "PullCookableItemFromNearbyChests", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_0080: Expected O, but got Unknown
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Expected O, but got Unknown
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Expected O, but got Unknown
if (!CraftingStationConfiguration.craftFromChests.Value || CraftingStationConfiguration.disableCookingStation.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
int num = -1;
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldnull)
{
list[i] = new CodeInstruction(OpCodes.Ldarg_0, (object)null)
{
labels = list[i].labels
};
list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)method_PullCookableItemFromNearbyChests));
list.Insert(++i, new CodeInstruction(OpCodes.Stloc_3, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Ldloc_3, (object)null));
num = i;
break;
}
}
if (num == -1)
{
ZLog.LogError((object)"Failed to apply CookingStation_FindCookableItem_Transpiler");
return instructions;
}
return list.AsEnumerable();
}
private static ItemData PullCookableItemFromNearbyChests(CookingStation station)
{
if (station.GetFreeSlot() == -1)
{
return null;
}
Stopwatch stopwatch = GameObjectAssistant.GetStopwatch(((Component)station).gameObject);
int num = helper.Clamp(3, 1, 10) * 1000;
if (!stopwatch.IsRunning || stopwatch.ElapsedMilliseconds > num)
{
nearbyChests = InventoryAssistant.GetNearbyChests(((Component)station).gameObject, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1, 50), !CraftingStationConfiguration.ignorePrivateAreaCheck.Value);
stopwatch.Restart();
}
foreach (ItemConversion item in station.m_conversion)
{
ItemData itemData = item.m_from.m_itemData;
foreach (Container nearbyChest in nearbyChests)
{
if (nearbyChest.GetInventory().HaveItem(itemData.m_shared.m_name, true))
{
InventoryAssistant.RemoveItemFromChest(nearbyChest, itemData);
GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(((Object)((Component)item.m_from).gameObject).name);
ZNetView.m_forceDisableInit = true;
GameObject obj = Object.Instantiate<GameObject>(itemPrefab);
ZNetView.m_forceDisableInit = false;
return obj.GetComponent<ItemDrop>().m_itemData;
}
}
}
return null;
}
}
[HarmonyPatch(typeof(Container), "Awake")]
public static class Container_Awake_Patch
{
private static void Postfix(Container __instance, ref Inventory ___m_inventory)
{
if (!containerconfiguration.enabled.Value && !Configuration.modisenabled.Value)
{
return;
}
if ((Object)(object)__instance == (Object)null || ___m_inventory == null || !Object.op_Implicit((Object)(object)((Component)__instance).transform.parent))
{
if (___m_inventory != null)
{
string name = ___m_inventory.m_name;
ref int width = ref ___m_inventory.m_width;
ref int height = ref ___m_inventory.m_height;
switch (name)
{
case "$piece_chestprivate":
height = helper.Clamp(containerconfiguration.privateChestCol.Value, 2, 20);
width = helper.Clamp(containerconfiguration.privateChestRows.Value, 3, 8);
break;
case "$piece_chestwood":
height = helper.Clamp(containerconfiguration.woodChestInventoryCol.Value, 2, 10);
width = helper.Clamp(containerconfiguration.woodChestInventoryRows.Value, 3, 8);
break;
case "$piece_chest":
height = helper.Clamp(containerconfiguration.ironChestCol.Value, 3, 20);
width = helper.Clamp(containerconfiguration.ironChestRows.Value, 3, 8);
break;
case "$piece_chestblackmetal":
height = helper.Clamp(containerconfiguration.blackMetalChestCol.Value, 3, 20);
width = helper.Clamp(containerconfiguration.blackMetalChestRows.Value, 3, 8);
break;
}
}
}
else
{
string name2 = ((Object)((Component)__instance).transform.parent).name;
_ = ___m_inventory.m_name;
ref int width2 = ref ___m_inventory.m_width;
ref int height2 = ref ___m_inventory.m_height;
if (name2.Contains("Karve"))
{
height2 = helper.Clamp(containerconfiguration.karveChestCol.Value, 2, 30);
width2 = helper.Clamp(containerconfiguration.karveChestRows.Value, 2, 8);
}
else if (name2.Contains("VikingShip"))
{
height2 = helper.Clamp(containerconfiguration.vikingshipChestCol.Value, 3, 30);
width2 = helper.Clamp(containerconfiguration.vikingshipChestRows.Value, 6, 8);
}
else if (name2.Contains("Cart"))
{
height2 = helper.Clamp(containerconfiguration.cartChestCol.Value, 3, 30);
width2 = helper.Clamp(containerconfiguration.cartChestRows.Value, 6, 8);
}
}
}
}
[HarmonyPatch(typeof(CraftingStation), "Start")]
public static class CraftingStation_Awake_Patch
{
public static void Postfix(CraftingStation __instance)
{
__instance.m_craftRequireRoof = CraftingStationConfiguration.craftingroofrequired.Value;
__instance.m_rangeBuild = CraftingStationConfiguration.workbenchcraftingRange.Value;
}
}
[HarmonyPatch(typeof(Piece), "Awake")]
public static class Piece_Awake_Patch
{
public static void Postfix(Piece __instance)
{
if (__instance.m_name.Contains("_ext") && !CraftingStationConfiguration.UpgradeSpaceRequirementEnabled.Value)
{
__instance.m_spaceRequirement = 0f;
}
}
}
[HarmonyPatch(typeof(DropTable), "GetDropList", new Type[] { typeof(int) })]
public static class DropTable_GetDropList_Patch
{
private static float originalDropChance;
private static void Prefix(ref DropTable __instance, ref List<GameObject> __result, int amount)
{
originalDropChance = __instance.m_dropChance;
if (gatherconfiguration.enabled.Value && gatherconfiguration.Dropchance.Value != 0f)
{
float num = helper.applyModifierValue(__instance.m_dropChance, gatherconfiguration.Dropchance.Value);
if (num >= 1f)
{
num = 1f;
}
if (num <= 0f)
{
num = 0f;
}
if (__instance.m_dropChance != 1f)
{
__instance.m_dropChance = num;
}
}
}
private static void Postfix(ref DropTable __instance, ref List<GameObject> __result, int amount)
{
__instance.m_dropChance = originalDropChance;
if (!gatherconfiguration.enabled.Value)
{
return;
}
int num = 0;
GameObject item = null;
int num2 = 0;
GameObject item2 = null;
int num3 = 0;
GameObject item3 = null;
int num4 = 0;
GameObject item4 = null;
int num5 = 0;
GameObject item5 = null;
int num6 = 0;
GameObject item6 = null;
int num7 = 0;
GameObject item7 = null;
int num8 = 0;
GameObject item8 = null;
int num9 = 0;
GameObject item9 = null;
int num10 = 0;
GameObject item10 = null;
int num11 = 0;
GameObject item11 = null;
int num12 = 0;
GameObject item12 = null;
int num13 = 0;
GameObject item13 = null;
List<GameObject> list = new List<GameObject>();
foreach (GameObject item14 in __result)
{
switch (((Object)item14).name)
{
case "Wood":
num++;
item = item14;
break;
case "RoundLog":
num2++;
item2 = item14;
break;
case "Stone":
num3++;
item3 = item14;
break;
case "IronScrap":
num4++;
item4 = item14;
break;
case "TinOre":
num5++;
item5 = item14;
break;
case "CopperOre":
num6++;
item6 = item14;
break;
case "SilverOre":
num7++;
item7 = item14;
break;
case "ElderBark":
num8++;
item8 = item14;
break;
case "FineWood":
num9++;
item9 = item14;
break;
case "YggdrasilWood":
num10++;
item10 = item14;
break;
case "SoftTissue":
num12++;
item12 = item14;
break;
case "BlackMarble":
num13++;
item13 = item14;
break;
default:
list.Add(item14);
break;
}
}
for (int i = 0; (float)i < helper.applyModifierValue(num, gatherconfiguration.wood.Value); i++)
{
list.Add(item);
}
for (int j = 0; (float)j < helper.applyModifierValue(num2, gatherconfiguration.coreWood.Value); j++)
{
list.Add(item2);
}
for (int k = 0; (float)k < helper.applyModifierValue(num3, gatherconfiguration.stone.Value); k++)
{
list.Add(item3);
}
for (int l = 0; (float)l < helper.applyModifierValue(num4, gatherconfiguration.ironScrap.Value); l++)
{
list.Add(item4);
}
for (int m = 0; (float)m < helper.applyModifierValue(num5, gatherconfiguration.tinOre.Value); m++)
{
list.Add(item5);
}
for (int n = 0; (float)n < helper.applyModifierValue(num6, gatherconfiguration.copperOre.Value); n++)
{
list.Add(item6);
}
for (int num14 = 0; (float)num14 < helper.applyModifierValue(num7, gatherconfiguration.silverOre.Value); num14++)
{
list.Add(item7);
}
for (int num15 = 0; (float)num15 < helper.applyModifierValue(num8, gatherconfiguration.elderBark.Value); num15++)
{
list.Add(item8);
}
for (int num16 = 0; (float)num16 < helper.applyModifierValue(num9, gatherconfiguration.fineWood.Value); num16++)
{
list.Add(item9);
}
for (int num17 = 0; (float)num17 < helper.applyModifierValue(num11, gatherconfiguration.chitin.Value); num17++)
{
list.Add(item11);
}
for (int num18 = 0; (float)num18 < helper.applyModifierValue(num10, gatherconfiguration.YggdrasilWood.Value); num18++)
{
list.Add(item10);
}
for (int num19 = 0; (float)num19 < helper.applyModifierValue(num12, gatherconfiguration.SoftTissue.Value); num19++)
{
list.Add(item12);
}
for (int num20 = 0; (float)num20 < helper.applyModifierValue(num13, gatherconfiguration.BlackMarble.Value); num20++)
{
list.Add(item13);
}
__result = list;
}
}
public class DropTableAdd
{
public static void surtingcoredropadd()
{
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Expected O, but got Unknown
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Expected O, but got Unknown
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Expected O, but got Unknown
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: Expected O, but got Unknown
try
{
GameObject prefab = PrefabManager.Instance.GetPrefab("SurtlingCore");
GameObject prefab2 = PrefabManager.Instance.GetPrefab("GreydwarfEye");
CharacterDrop component = PrefabManager.Instance.GetPrefab("Greydwarf").GetComponent<CharacterDrop>();
CharacterDrop component2 = PrefabManager.Instance.GetPrefab("Greydwarf_Elite").GetComponent<CharacterDrop>();
CharacterDrop component3 = PrefabManager.Instance.GetPrefab("Greydwarf_Shaman").GetComponent<CharacterDrop>();
PrefabManager.Instance.GetPrefab("Greyling").GetComponent<CharacterDrop>().m_drops.Add(new Drop
{
m_amountMax = 3,
m_amountMin = 1,
m_chance = 40f,
m_levelMultiplier = true,
m_onePerPlayer = false,
m_prefab = prefab2
});
component.m_drops.Add(new Drop
{
m_amountMax = 2,
m_amountMin = 0,
m_chance = 20f,
m_levelMultiplier = true,
m_onePerPlayer = false,
m_prefab = prefab
});
component2.m_drops.Add(new Drop
{
m_amountMax = 2,
m_amountMin = 1,
m_chance = 25f,
m_levelMultiplier = true,
m_onePerPlayer = false,
m_prefab = prefab
});
component3.m_drops.Add(new Drop
{
m_amountMax = 2,
m_amountMin = 1,
m_chance = 20f,
m_levelMultiplier = true,
m_onePerPlayer = false,
m_prefab = prefab
});
}
catch
{
Logger.LogError((object)"Failed to load surtling drop tables");
}
finally
{
PrefabManager.OnVanillaPrefabsAvailable -= surtingcoredropadd;
}
}
}
[HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")]
public static class Character_Drop_Add
{
[HarmonyPrefix]
private static bool MultiplyLoot(CharacterDrop __instance, ref List<KeyValuePair<GameObject, int>> __result)
{
List<KeyValuePair<GameObject, int>> list = new List<KeyValuePair<GameObject, int>>();
int num = ((!Object.op_Implicit((Object)(object)__instance.m_character)) ? 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;
}
float num2 = drop.m_chance;
if (drop.m_levelMultiplier)
{
num2 *= (float)num;
}
if (!(Random.value <= num2))
{
continue;
}
int num3 = Random.Range(drop.m_amountMin, drop.m_amountMax);
if (drop.m_levelMultiplier)
{
num3 *= num;
}
if (drop.m_onePerPlayer)
{
num3 = ZNet.instance.GetNrOfPlayers();
}
if (num3 <= 0 || !((Object)(object)drop.m_prefab != (Object)null))
{
continue;
}
switch (((Object)drop.m_prefab).name)
{
case "BlackMetalScrap":
{
float num9 = helper.applyModifierValue(num3, gatherconfiguration.BlackMetalScrap.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num9)));
break;
}
case "GreydwarfEye":
{
if (num3 == 0)
{
num3 = 1;
}
float num19 = helper.applyModifierValue(num3, gatherconfiguration.GreydwarfEye.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num19)));
break;
}
case "RawMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num10 = helper.applyModifierValue(num3, gatherconfiguration.RawMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num10)));
break;
}
case "DeerMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num5 = helper.applyModifierValue(num3, gatherconfiguration.DeerMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num5)));
break;
}
case "HareMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num17 = helper.applyModifierValue(num3, gatherconfiguration.HareMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num17)));
break;
}
case "LoxMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num6 = helper.applyModifierValue(num3, gatherconfiguration.LoxMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num6)));
break;
}
case "NeckTail":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num7 = helper.applyModifierValue(num3, gatherconfiguration.NeckTail.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num7)));
break;
}
case "BugMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num14 = helper.applyModifierValue(num3, gatherconfiguration.BugMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num14)));
break;
}
case "SerpentMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num15 = helper.applyModifierValue(num3, gatherconfiguration.SerpentMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num15)));
break;
}
case "WolfMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num18 = helper.applyModifierValue(num3, gatherconfiguration.WolfMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num18)));
break;
}
case "ChickenMeat":
{
if (num3 == 0 && gatherconfiguration.FoodDropMinimumEnabled.Value)
{
num3 = 1;
}
float num13 = helper.applyModifierValue(num3, gatherconfiguration.ChickenMeat.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num13)));
break;
}
case "DeerHide":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num11 = helper.applyModifierValue(num3, ItemDropConfiguration.DeerHide.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num11)));
break;
}
case "ScaleHide":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num20 = helper.applyModifierValue(num3, ItemDropConfiguration.ScaleHide.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num20)));
break;
}
case "LoxPelt":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num16 = helper.applyModifierValue(num3, ItemDropConfiguration.LoxPelt.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num16)));
break;
}
case "WolfPelt":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num12 = helper.applyModifierValue(num3, ItemDropConfiguration.WolfPelt.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num12)));
break;
}
case "LeatherScraps":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num8 = helper.applyModifierValue(num3, ItemDropConfiguration.LeatherScraps.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num8)));
break;
}
case "Bloodbag":
{
if (num3 == 0 && ItemDropConfiguration.HideAlwaysDropOneEnabled.Value)
{
num3 = 1;
}
float num4 = helper.applyModifierValue(num3, ItemDropConfiguration.Bloodbag.Value);
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, (int)Math.Round(num4)));
break;
}
default:
list.Add(new KeyValuePair<GameObject, int>(drop.m_prefab, num3));
break;
}
}
__result = list;
return false;
}
}
public static class FirePlaceDefinitions
{
public static readonly string FirePitName = "$piece_fire";
public static readonly string BonfireName = "$piece_bonfire";
public static readonly string HearthName = "$piece_hearth";
}
[HarmonyPatch(typeof(Fireplace), "Awake")]
public static class Fireplace_Awake_Patch
{
private static void Postfix(Fireplace __instance)
{
if (__instance.m_name.Contains("torch"))
{
__instance.m_infiniteFuel = FireplaceConfiguration.TorchInfiniteFuel.Value;
}
else if (__instance.m_name.Contains("sconce"))
{
__instance.m_infiniteFuel = FireplaceConfiguration.TorchInfiniteFuel.Value;
}
else if (__instance.m_name.Contains("Brazier"))
{
__instance.m_infiniteFuel = FireplaceConfiguration.BrazierInfiniteFuel.Value;
}
else if (__instance.m_name.Equals(FirePlaceDefinitions.FirePitName))
{
__instance.m_infiniteFuel = FireplaceConfiguration.FireplaceInfiniteFuel.Value;
}
else if (__instance.m_name.Equals(FirePlaceDefinitions.HearthName))
{
__instance.m_infiniteFuel = FireplaceConfiguration.FireplaceInfiniteFuel.Value;
}
else if (__instance.m_name.Equals(FirePlaceDefinitions.BonfireName))
{
__instance.m_infiniteFuel = FireplaceConfiguration.FireplaceInfiniteFuel.Value;
}
}
}
[HarmonyPatch(typeof(Fireplace), "UpdateFireplace")]
public static class Fireplace_UpdateSmelter_Patch
{
private static void Prefix(Fireplace __instance)
{
if ((Object)(object)__instance == (Object)null || !Object.op_Implicit((Object)(object)Player.m_localPlayer) || (Object)(object)__instance.m_nview == (Object)null || !__instance.m_nview.IsOwner())
{
return;
}
Stopwatch stopwatch = GameObjectAssistant.GetStopwatch(((Component)__instance).gameObject);
if (stopwatch.IsRunning && stopwatch.ElapsedMilliseconds < 1000)
{
return;
}
stopwatch.Restart();
float value = 0f;
bool flag = false;
if (__instance.m_name.Equals(FirePlaceDefinitions.FirePitName))
{
if (!FireplaceConfiguration.FireplaceIsEnabled.Value || !FireplaceConfiguration.FireplaceAutoFuel.Value)
{
return;
}
value = FireplaceConfiguration.FireplaceAutoRange.Value;
flag = false;
}
else if (__instance.m_name.Equals(FirePlaceDefinitions.HearthName))
{
if (!FireplaceConfiguration.FireplaceIsEnabled.Value || !FireplaceConfiguration.FireplaceAutoFuel.Value)
{
return;
}
value = FireplaceConfiguration.FireplaceAutoRange.Value;
flag = false;
}
else if (__instance.m_name.Equals(FirePlaceDefinitions.BonfireName))
{
if (!FireplaceConfiguration.FireplaceIsEnabled.Value || !FireplaceConfiguration.FireplaceAutoFuel.Value)
{
return;
}
value = FireplaceConfiguration.FireplaceAutoRange.Value;
flag = false;
}
else if (__instance.m_name.Contains("torch"))
{
if (!FireplaceConfiguration.FireplaceIsEnabled.Value || !FireplaceConfiguration.TorchAutoFuel.Value)
{
return;
}
value = FireplaceConfiguration.TorchAutoRange.Value;
flag = false;
}
else if (__instance.m_name.Contains("brazier"))
{
if (!FireplaceConfiguration.FireplaceIsEnabled.Value || !FireplaceConfiguration.BrazierAutoFuel.Value)
{
return;
}
value = FireplaceConfiguration.BrazierAutoRange.Value;
flag = false;
}
value = helper.Clamp(value, 1f, 50f);
int num = (int)__instance.m_maxFuel - (int)Math.Ceiling(__instance.m_nview.GetZDO().GetFloat(ZDOVars.s_fuel, 0f));
if (Object.op_Implicit((Object)(object)__instance.m_fuelItem) && num > 0)
{
ItemData itemData = __instance.m_fuelItem.m_itemData;
int num2 = InventoryAssistant.RemoveFireWoodItemInAmountFromAllNearbyChests(((Component)__instance).gameObject, value, itemData, num, !flag);
for (int i = 0; i < num2; i++)
{
__instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>());
}
if (num2 > 0 && Configuration.enableDebugLogging != null && Configuration.enableDebugLogging.Value)
{
ZLog.Log((object)("Added " + num2 + " fuel(" + itemData.m_shared.m_name + ") in " + __instance.m_name));
}
}
}
}
[HarmonyPatch(typeof(Game), "UpdateRespawn")]
public static class Player_UpdateRespawn_Transpiler
{
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
string operand = GameConfiguration.firstspawnmessage.Value.ToString();
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldstr)
{
list[i].operand = operand;
return list.AsEnumerable();
}
}
return instructions;
}
}
[HarmonyPatch(typeof(Location), "IsInsideNoBuildLocation")]
public static class Location_IsInsideNoBuildLocation_Patch
{
public static bool Prefix(ref bool __result)
{
if (GameConfiguration.DisableBuildRestrictions.Value && GameConfiguration.enabled.Value)
{
__result = false;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(Inventory), "TopFirst")]
public static class Inventory_TopFirst_Patch
{
public static bool Prefix(ref bool __result)
{
if (inventoryconfiguration.enabled.Value && inventoryconfiguration.toptobottomfill.Value)
{
__result = true;
return false;
}
return true;
}
}
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
public static class Inventory_Constructor_Patch
{
private const int playerInventoryMaxRows = 20;
private const int playerInventoryMinRows = 4;
public static void Prefix(string name, ref int w, ref int h)
{
if (!inventoryconfiguration.enabled.Value)
{
return;
}
if (name == "Inventory")
{
h = helper.Clamp(inventoryconfiguration.playerinventoryrows.Value, 4, 20);
}
else if (name == "Grave")
{
if (PlayerInventorySize.LastPlayerInventoryHeight > 0)
{
h = PlayerInventorySize.LastPlayerInventoryHeight;
}
else
{
h = helper.Clamp(inventoryconfiguration.playerinventoryrows.Value, 4, 20);
}
}
}
}
[HarmonyPatch(typeof(TombStone), "Awake")]
public static class TombStone_Awake_Patch
{
private const int playerInventoryMaxRows = 20;
private const int playerInventoryMinRows = 4;
public static void Postfix(TombStone __instance)
{
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Expected O, but got Unknown
if (!inventoryconfiguration.enabled.Value || (Object)(object)__instance == (Object)null)
{
return;
}
Container component = ((Component)__instance).GetComponent<Container>();
if ((Object)(object)component == (Object)null)
{
return;
}
int num = ((PlayerInventorySize.LastPlayerInventoryHeight > 0) ? PlayerInventorySize.LastPlayerInventoryHeight : helper.Clamp(inventoryconfiguration.playerinventoryrows.Value, 4, 20));
component.m_width = 8;
component.m_height = num;
if (component.m_inventory != null && component.m_inventory.GetHeight() < num)
{
List<ItemData> list = new List<ItemData>(component.m_inventory.GetAllItems());
Inventory val = new Inventory("Grave", component.m_inventory.m_bkg, component.m_width, component.m_height);
foreach (ItemData item in list)
{
val.AddItem(item);
}
component.m_inventory = val;
ZNetView component2 = ((Component)component).GetComponent<ZNetView>();
if ((Object)(object)component2 != (Object)null && component2.IsValid())
{
component.Save();
}
}
PlayerInventorySize.LastPlayerInventoryHeight = 0;
}
}
[HarmonyPatch(typeof(Container), "Awake")]
public static class Container_Awake_Grave_Patch
{
private const int playerInventoryMaxRows = 20;
private const int playerInventoryMinRows = 4;
public static void Postfix(Container __instance)
{
if (inventoryconfiguration.enabled.Value && !((Object)(object)__instance == (Object)null) && (Object)(object)((Component)__instance).GetComponent<TombStone>() != (Object)null)
{
int height = ((PlayerInventorySize.LastPlayerInventoryHeight > 0) ? PlayerInventorySize.LastPlayerInventoryHeight : helper.Clamp(inventoryconfiguration.playerinventoryrows.Value, 4, 20));
__instance.m_width = 8;
__instance.m_height = height;
}
}
}
[HarmonyPatch(typeof(Inventory), "MoveAll")]
public static class Inventory_MoveAll_Patch
{
private static void Prefix(ref Inventory __instance, ref Inventory fromInventory)
{
foreach (ItemData item in new List<ItemData>(fromInventory.GetAllItems()))
{
if (item.m_shared.m_maxStackSize <= 1)
{
continue;
}
foreach (ItemData item2 in __instance.m_inventory)
{
if (item2.m_shared.m_name == item.m_shared.m_name && item2.m_quality == item.m_quality)
{
int num = Math.Min(item2.m_shared.m_maxStackSize - item2.m_stack, item.m_stack);
item2.m_stack += num;
if (item.m_stack == num)
{
fromInventory.RemoveItem(item);
break;
}
item.m_stack -= num;
}
}
}
}
}
public static class Inventory_NearbyChests_Cache
{
public static List<Container> chests = new List<Container>();
public static readonly Stopwatch delta = new Stopwatch();
}
public static class PlayerInventorySize
{
public static int LastPlayerInventoryHeight;
}
[HarmonyPatch(typeof(InventoryGui), "Show")]
public class InventoryGui_Show_Patch
{
private const float oneRowSize = 70.5f;
private const float containerOriginalY = -90f;
private const float containerHeight = -340f;
private static float lastValue;
public static void Postfix(ref InventoryGui __instance)
{
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Unknown result type (might be due to invalid IL or missing references)
if (inventoryconfiguration.enabled.Value)
{
RectTransform container = __instance.m_container;
RectTransform player = __instance.m_player;
GameObject gameObject = ((Component)InventoryGui.instance.m_playerGrid).gameObject;
int num = Math.Min(6, Math.Max(4, inventoryconfiguration.playerinventoryrows.Value));
float num2 = -90f - 70.5f * (float)num;
player.SetSizeWithCurrentAnchors((Axis)1, (float)num * 70.5f);
container.offsetMax = new Vector2(610f, num2);
container.offsetMin = new Vector2(40f, num2 + -340f);
if (!Object.op_Implicit((Object)(object)gameObject.GetComponent<InventoryGrid>().m_scrollbar))
{
GameObject val = Object.Instantiate<GameObject>(((Component)InventoryGui.instance.m_containerGrid.m_scrollbar).gameObject, gameObject.transform.parent);
((Object)val).name = "PlayerScroll";
((Behaviour)gameObject.GetComponent<RectMask2D>()).enabled = true;
ScrollRect obj = gameObject.AddComponent<ScrollRect>();
gameObject.GetComponent<RectTransform>().offsetMax = new Vector2(800f, gameObject.GetComponent<RectTransform>().offsetMax.y);
gameObject.GetComponent<RectTransform>().anchoredPosition = new Vector2(0f, 1f);
obj.content = gameObject.GetComponent<InventoryGrid>().m_gridRoot;
obj.viewport = ((Component)__instance.m_player).GetComponentInChildren<RectTransform>();
obj.verticalScrollbar = val.GetComponent<Scrollbar>();
gameObject.GetComponent<InventoryGrid>().m_scrollbar = val.GetComponent<Scrollbar>();
obj.horizontal = false;
obj.movementType = (MovementType)2;
obj.scrollSensitivity = 70.5f;
obj.inertia = false;
obj.verticalScrollbarVisibility = (ScrollbarVisibility)1;
lastValue = val.GetComponent<Scrollbar>().value;
}
}
}
}
[HarmonyPatch(typeof(InventoryGui), "RepairOneItem")]
public static class InventoryGui_RepairOneItem_Transpiler
{
private static MethodInfo method_EffectList_Create = AccessTools.Method(typeof(EffectList), "Create", (Type[])null, (Type[])null);
private static MethodInfo method_CreateNoop = AccessTools.Method(typeof(InventoryGui_RepairOneItem_Transpiler), "CreateNoop", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions)
{
if (!PlayerConfiguration.enabled.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
if (PlayerConfiguration.autorepair.Value)
{
for (int i = 0; i < list.Count; i++)
{
if (CodeInstructionExtensions.Calls(list[i], method_EffectList_Create))
{
list[i].opcode = OpCodes.Call;
list[i].operand = method_CreateNoop;
}
}
}
return list.AsEnumerable();
}
private static GameObject[] CreateNoop(Vector3 _0, Quaternion _1, Transform _2, float _3, int _4)
{
return null;
}
}
[HarmonyPatch(typeof(InventoryGui), "DoCrafting")]
public static class InventoryGui_DoCrafting_Transpiler
{
private static MethodInfo method_Player_Inventory_RemoveItem = AccessTools.Method(typeof(Inventory), "RemoveItem", new Type[4]
{
typeof(string),
typeof(int),
typeof(int),
typeof(bool)
}, (Type[])null);
private static MethodInfo method_UseItemFromInventoryOrChest = AccessTools.Method(typeof(InventoryGui_DoCrafting_Transpiler), "UseItemFromInventoryOrChest", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
if (!CraftingStationConfiguration.craftFromChests.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (CodeInstructionExtensions.Calls(list[i], method_Player_Inventory_RemoveItem))
{
list[i] = new CodeInstruction(OpCodes.Call, (object)method_UseItemFromInventoryOrChest);
list.RemoveAt(i - 8);
return list.AsEnumerable();
}
}
return instructions;
}
private static void UseItemFromInventoryOrChest(Player player, string itemName, int quantity, int quality, bool worldLevelBased)
{
Inventory inventory = ((Humanoid)player).GetInventory();
if (inventory.CountItems(itemName, quality, true) >= quantity)
{
inventory.RemoveItem(itemName, quantity, quality, worldLevelBased);
return;
}
CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
GameObject val = ((currentCraftingStation != null) ? ((Component)currentCraftingStation).gameObject : null);
if (!Object.op_Implicit((Object)(object)val) || !CraftingStationConfiguration.craftFromWorkbench.Value)
{
val = ((Component)player).gameObject;
}
List<Container> nearbyChests = InventoryAssistant.GetNearbyChests(val, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1, 50), !CraftingStationConfiguration.ignorePrivateAreaCheck.Value);
int num = quantity;
foreach (Container item in nearbyChests)
{
if (item.GetInventory().CountItems(itemName, quality, true) > 0)
{
num -= InventoryAssistant.RemoveItemFromChest(item, itemName, num);
if (num == 0)
{
break;
}
}
}
}
}
[HarmonyPatch(typeof(InventoryGui), "SetupRequirement")]
public static class InventoryGui_SetupRequirement_Patch
{
private static bool Prefix(Transform elementRoot, Requirement req, Player player, bool craft, int quality, ref bool __result)
{
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_024b: Unknown result type (might be due to invalid IL or missing references)
//IL_023e: Unknown result type (might be due to invalid IL or missing references)
//IL_0237: Unknown result type (might be due to invalid IL or missing references)
if (!CraftingStationConfiguration.craftFromChests.Value)
{
return true;
}
Image component = ((Component)((Component)elementRoot).transform.Find("res_icon")).GetComponent<Image>();
TMP_Text component2 = ((Component)((Component)elementRoot).transform.Find("res_name")).GetComponent<TMP_Text>();
TMP_Text component3 = ((Component)((Component)elementRoot).transform.Find("res_amount")).GetComponent<TMP_Text>();
UITooltip component4 = ((Component)elementRoot).GetComponent<UITooltip>();
if ((Object)(object)req.m_resItem != (Object)null)
{
((Component)component).gameObject.SetActive(true);
((Component)component2).gameObject.SetActive(true);
((Component)component3).gameObject.SetActive(true);
component.sprite = req.m_resItem.m_itemData.GetIcon();
((Graphic)component).color = Color.white;
component4.m_text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
component2.text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
int num = ((Humanoid)player).GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name, -1, true);
int amount = req.GetAmount(quality);
if (amount <= 0)
{
InventoryGui.HideRequirement(elementRoot);
__result = false;
return false;
}
if (CraftingStationConfiguration.craftFromChests.Value)
{
CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
GameObject val = ((currentCraftingStation != null) ? ((Component)currentCraftingStation).gameObject : null);
Stopwatch stopwatch;
if (!Object.op_Implicit((Object)(object)val) || !CraftingStationConfiguration.craftFromWorkbench.Value)
{
val = ((Component)player).gameObject;
stopwatch = Inventory_NearbyChests_Cache.delta;
}
else
{
stopwatch = GameObjectAssistant.GetStopwatch(val);
}
int num2 = helper.Clamp(3, 1, 10) * 1000;
if (!stopwatch.IsRunning || stopwatch.ElapsedMilliseconds > num2)
{
Inventory_NearbyChests_Cache.chests = InventoryAssistant.GetNearbyChests(val, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1f, 50f));
stopwatch.Restart();
}
num += InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(Inventory_NearbyChests_Cache.chests), req.m_resItem.m_itemData);
}
component3.text = num + "/" + amount;
if (num < amount)
{
((Graphic)component3).color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
}
else
{
((Graphic)component3).color = Color.white;
}
component3.fontSize = 14f;
if (component3.text.Length > 5)
{
component3.fontSize -= (float)(component3.text.Length - 5);
}
}
__result = true;
return false;
}
}
[HarmonyPatch(typeof(InventoryGui), "UpdateRepair")]
public static class InventoryGui_UpdateRepair_Patch
{
[HarmonyPrefix]
public static void Prefix(InventoryGui __instance)
{
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
if (!PlayerConfiguration.enabled.Value || !PlayerConfiguration.autorepair.Value)
{
return;
}
CraftingStation currentCraftingStation = Player.m_localPlayer.GetCurrentCraftingStation();
if ((Object)(object)currentCraftingStation != (Object)null)
{
int num = 0;
while (__instance.HaveRepairableItems())
{
__instance.RepairOneItem();
num++;
}
if (num > 0)
{
currentCraftingStation.m_repairItemDoneEffects.Create(((Component)currentCraftingStation).transform.position, Quaternion.identity, (Transform)null, 1f, -1);
}
}
}
}
[HarmonyPatch(typeof(Plant), "HaveGrowSpace")]
public class Plant_HaveGrowSpace_Patch
{
public static bool Postfix(bool __result)
{
__result = !PlantConfiguration.needgrowspace.Value;
return __result;
}
}
[HarmonyPatch(typeof(Plant), "Awake")]
public static class Plant_Awake_Patch
{
public static void Postfix(Plant __instance)
{
__instance.m_needCultivatedGround = PlantConfiguration.needcultivatedground.Value;
Component componentInParent = ((Component)__instance).GetComponentInParent(typeof(Piece));
((Piece)((componentInParent is Piece) ? componentInParent : null)).m_cultivatedGroundOnly = PlantConfiguration.needcultivatedground.Value;
}
}
[HarmonyPatch(typeof(ItemDrop), "Awake")]
public static class ItemDrop_Awake_Patch
{
public static void Postfix(ItemDrop __instance)
{
if (ItemDropConfiguration.noteleportprevention.Value && Configuration.modisenabled.Value)
{
__instance.m_itemData.m_shared.m_teleportable = true;
}
if (!Configuration.modisenabled.Value)
{
return;
}
string text = ((object)(ItemType)(ref __instance.m_itemData.m_shared.m_itemType)).ToString();
float num = helper.applyModifierValue(__instance.m_itemData.m_shared.m_maxStackSize, inventoryconfiguration.maxstacksizemultiplier.Value);
switch (((object)(ItemType)(ref __instance.m_itemData.m_shared.m_itemType)).ToString())
{
case "Consumable":
case "Material":
case "Ammo":
__instance.m_itemData.m_shared.m_maxStackSize = (int)Math.Round(num);
break;
}
if (__instance.m_itemData.m_shared.m_movementModifier != 0f)
{
if (ItemDropConfiguration.disableMovementModifier.Value)
{
__instance.m_itemData.m_shared.m_movementModifier = 0f;
}
else if (ItemDropConfiguration.movementmodifier.Value != 0f)
{
float movementModifier = helper.applyModifierValue(__instance.m_itemData.m_shared.m_movementModifier, ItemDropConfiguration.movementmodifier.Value);
__instance.m_itemData.m_shared.m_movementModifier = movementModifier;
}
}
}
}
[HarmonyPatch(typeof(Beehive), "Awake")]
public static class Beehive_Awake_Patch
{
private static void Postfix(Beehive __instance)
{
if (BeehiveConfiguration.enabled.Value && Configuration.modisenabled.Value)
{
__instance.m_maxHoney = BeehiveConfiguration.beehivemaxhoney.Value;
__instance.m_secPerUnit = BeehiveConfiguration.beehiveHoneyProductionSpeed.Value;
}
}
}
[HarmonyPatch(typeof(ResourceRoot), "Awake")]
public class ResourceRoot_Awake_Patch
{
public static void Postfix(ResourceRoot __instance)
{
if (SapCollectorConfiguration.enabled.Value || Configuration.modisenabled.Value)
{
__instance.m_maxLevel = SapCollectorConfiguration.rootmaxcapacity.Value;
__instance.m_regenPerSec = SapCollectorConfiguration.rootregenpersec.Value;
}
}
}
[HarmonyPatch(typeof(SapCollector), "Awake")]
public class SapCollector_Awake_Patch
{
public static void Postfix(SapCollector __instance)
{
if (SapCollectorConfiguration.enabled.Value || Configuration.modisenabled.Value)
{
__instance.m_secPerUnit = SapCollectorConfiguration.collectorsecperunit.Value;
__instance.m_maxLevel = SapCollectorConfiguration.collectormaxcapacity.Value;
}
}
}
public static class SmelterDefinitions
{
public static readonly string KilnName = "$piece_charcoalkiln";
public static readonly string SmelterName = "$piece_smelter";
public static readonly string FurnaceName = "$piece_blastfurnace";
public static readonly string WindmillName = "$piece_windmill";
public static readonly string SpinningWheelName = "$piece_spinningwheel";
public static readonly string EitrRefineryName = "$piece_eitrrefinery";
}
[HarmonyPatch(typeof(Smelter), "Awake")]
public static class Smelter_Awake_Patch
{
public enum SmelterType
{
Unknown,
Kiln,
Smelter,
Furnace,
Windmill,
SpinningWheel,
EitrRefinery
}
private static Dictionary<int, SmelterType> smelterTypeCache = new Dictionary<int, SmelterType>();
private static void Prefix(ref Smelter __instance)
{
SmelterType smelterType = DetermineSmelterType(__instance);
int instanceID = ((Object)__instance).GetInstanceID();
smelterTypeCache[instanceID] = smelterType;
switch (smelterType)
{
case SmelterType.Kiln:
if (SmelterConfiguration.kilnIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.kilnMaxWood.Value;
__instance.m_secPerProduct = SmelterConfiguration.kilnSpeed.Value;
}
break;
case SmelterType.Smelter:
if (SmelterConfiguration.smelterIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.smelterMaxOre.Value;
__instance.m_maxFuel = SmelterConfiguration.smelterMaxCoal.Value;
__instance.m_secPerProduct = SmelterConfiguration.smelterSpeed.Value;
__instance.m_fuelPerProduct = SmelterConfiguration.smelterCoalUsedPerProduct.Value;
}
break;
case SmelterType.Furnace:
if (SmelterConfiguration.furnaceIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.furnaceMaxOre.Value;
__instance.m_maxFuel = SmelterConfiguration.furnaceMaxCoal.Value;
__instance.m_secPerProduct = SmelterConfiguration.furnaceSpeed.Value;
__instance.m_fuelPerProduct = SmelterConfiguration.furnaceCoalUsedPerProduct.Value;
}
break;
case SmelterType.Windmill:
if (SmelterConfiguration.windmillIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.windmillMaxBarley.Value;
__instance.m_secPerProduct = SmelterConfiguration.windmillProductionSpeed.Value;
}
break;
case SmelterType.SpinningWheel:
if (SmelterConfiguration.spinningWheelIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.spinningWheelMaxFlax.Value;
__instance.m_secPerProduct = SmelterConfiguration.spinningWheelProductionSpeed.Value;
}
break;
case SmelterType.EitrRefinery:
if (SmelterConfiguration.eitrRefineryIsEnabled.Value)
{
__instance.m_maxOre = SmelterConfiguration.eitrRefineryMaxOre.Value;
__instance.m_maxFuel = SmelterConfiguration.eitrRefineryMaxCoal.Value;
__instance.m_secPerProduct = SmelterConfiguration.eitrRefinerySpeed.Value;
__instance.m_fuelPerProduct = SmelterConfiguration.eitrRefineryCoalUsedPerProduct.Value;
}
break;
}
}
private static SmelterType DetermineSmelterType(Smelter smelter)
{
string name = smelter.m_name;
if (name == SmelterDefinitions.KilnName)
{
return SmelterType.Kiln;
}
if (name == SmelterDefinitions.SmelterName)
{
return SmelterType.Smelter;
}
if (name == SmelterDefinitions.FurnaceName)
{
return SmelterType.Furnace;
}
if (name == SmelterDefinitions.WindmillName)
{
return SmelterType.Windmill;
}
if (name == SmelterDefinitions.SpinningWheelName)
{
return SmelterType.SpinningWheel;
}
if (name == SmelterDefinitions.EitrRefineryName)
{
return SmelterType.EitrRefinery;
}
return SmelterType.Unknown;
}
public static SmelterType GetCachedSmelterType(Smelter smelter)
{
int instanceID = ((Object)smelter).GetInstanceID();
if (smelterTypeCache.TryGetValue(instanceID, out var value))
{
return value;
}
return SmelterType.Unknown;
}
}
[HarmonyPatch(typeof(Smelter), "FindCookableItem")]
public static class Smelter_FindCookableItem_Transpiler
{
private static MethodInfo method_PreventUsingSpecificWood = AccessTools.Method(typeof(Smelter_FindCookableItem_Transpiler), "PreventUsingSpecificWood", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Expected O, but got Unknown
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Expected O, but got Unknown
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Expected O, but got Unknown
if (!SmelterConfiguration.kilnIsEnabled.Value)
{
return instructions;
}
int num = -1;
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Stloc_1)
{
list.Insert(++i, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Ldloc_1, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)method_PreventUsingSpecificWood));
num = i;
}
else if (num != -1 && list[i].opcode == OpCodes.Brfalse)
{
list.Insert(++num, new CodeInstruction(OpCodes.Brtrue, list[i].operand));
return list.AsEnumerable();
}
}
ZLog.LogError((object)"Failed to apply Smelter_FindCookableItem_Transpiler");
return instructions;
}
private static bool PreventUsingSpecificWood(Smelter smelter, ItemConversion itemConversion)
{
if (smelter.m_name.Equals(SmelterDefinitions.KilnName) && ((SmelterConfiguration.dontProcessFineWood.Value && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(TillValhalla.WoodDefinitions.FineWoodName)) || (SmelterConfiguration.dontProcessRoundLog.Value && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(TillValhalla.WoodDefinitions.RoundLogName))))
{
return true;
}
return false;
}
}
[HarmonyPatch(typeof(Smelter), "Spawn")]
public static class Smelter_Spawn_Patch
{
private static bool Prefix(string ore, int stack, ref Smelter __instance)
{
Smelter smelter = __instance;
if (!smelter.m_nview.IsOwner())
{
return true;
}
if (__instance.m_name.Equals(SmelterDefinitions.KilnName) && SmelterConfiguration.kilnIsEnabled.Value && SmelterConfiguration.kilnAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.kilnAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
if (__instance.m_name.Equals(SmelterDefinitions.SmelterName) && SmelterConfiguration.smelterIsEnabled.Value && SmelterConfiguration.smelterAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.smelterAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
if (__instance.m_name.Equals(SmelterDefinitions.FurnaceName) && SmelterConfiguration.furnaceIsEnabled.Value && SmelterConfiguration.furnaceAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.furnaceAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
if (__instance.m_name.Equals(SmelterDefinitions.WindmillName) && SmelterConfiguration.windmillIsEnabled.Value && SmelterConfiguration.windmillAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.windmillAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
if (__instance.m_name.Equals(SmelterDefinitions.SpinningWheelName) && SmelterConfiguration.spinningWheelIsEnabled.Value && SmelterConfiguration.spinningWheelAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.spinningWheelAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
if (__instance.m_name.Equals(SmelterDefinitions.EitrRefineryName) && SmelterConfiguration.eitrRefineryIsEnabled.Value && SmelterConfiguration.eitrRefineryAutoDeposit.Value)
{
return spawn(helper.Clamp(SmelterConfiguration.eitrRefineryAutoRange.Value, 1f, 50f), ignorePrivateAreaCheck: false);
}
return true;
bool spawn(float autoDepositRange, bool ignorePrivateAreaCheck)
{
List<Container> nearbyChests = InventoryAssistant.GetNearbyChests(((Component)smelter).gameObject, autoDepositRange, !ignorePrivateAreaCheck);
ItemDrop comp;
if (nearbyChests.Count != 0)
{
if (autoDepositRange > 50f)
{
autoDepositRange = 50f;
}
else if (autoDepositRange < 1f)
{
autoDepositRange = 1f;
}
GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(((Object)((Component)smelter.GetItemConversion(ore).m_to).gameObject).name);
ZNetView.m_forceDisableInit = true;
GameObject val = Object.Instantiate<GameObject>(itemPrefab);
ZNetView.m_forceDisableInit = false;
comp = val.GetComponent<ItemDrop>();
comp.m_itemData.m_stack = stack;
bool result = spawnNearbyChest(mustHaveItem: true);
Object.Destroy((Object)(object)val);
return result;
}
return true;
bool spawnNearbyChest(bool mustHaveItem)
{
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
foreach (Container item in nearbyChests)
{
Inventory inventory = item.GetInventory();
if ((!mustHaveItem || inventory.HaveItem(comp.m_itemData.m_shared.m_name, true)) && inventory.AddItem(comp.m_itemData))
{
smelter.m_produceEffects.Create(((Component)smelter).transform.position, ((Component)smelter).transform.rotation, (Transform)null, 1f, -1);
InventoryAssistant.ConveyContainerToNetwork(item);
return false;
}
}
if (mustHaveItem)
{
return spawnNearbyChest(mustHaveItem: false);
}
return true;
}
}
}
}
[HarmonyPatch(typeof(Smelter), "UpdateSmelter")]
public static class Smelter_UpdateSmelter_Patch
{
private static void Prefix(Smelter __instance)
{
if ((Object)(object)__instance == (Object)null || !Object.op_Implicit((Object)(object)Player.m_localPlayer) || (Object)(object)__instance.m_nview == (Object)null || !__instance.m_nview.IsOwner())
{
return;
}
Stopwatch stopwatch = GameObjectAssistant.GetStopwatch(((Component)__instance).gameObject);
if (stopwatch.IsRunning && stopwatch.ElapsedMilliseconds < 1000)
{
return;
}
stopwatch.Restart();
Smelter_Awake_Patch.SmelterType cachedSmelterType = Smelter_Awake_Patch.GetCachedSmelterType(__instance);
float num = 0f;
bool flag = false;
bool flag2 = false;
switch (cachedSmelterType)
{
default:
return;
case Smelter_Awake_Patch.SmelterType.Kiln:
if (!SmelterConfiguration.kilnIsEnabled.Value || !SmelterConfiguration.kilnAutoFuel.Value)
{
return;
}
flag2 = true;
num = SmelterConfiguration.kilnAutoRange.Value;
break;
case Smelter_Awake_Patch.SmelterType.Smelter:
if (!SmelterConfiguration.smelterIsEnabled.Value || !SmelterConfiguration.smelterAutoFuel.Value)
{
return;
}
num = SmelterConfiguration.smelterAutoRange.Value;
break;
case Smelter_Awake_Patch.SmelterType.Furnace:
if (!SmelterConfiguration.furnaceIsEnabled.Value || !SmelterConfiguration.furnaceAutoFuel.Value)
{
return;
}
num = SmelterConfiguration.furnaceAutoRange.Value;
break;
case Smelter_Awake_Patch.SmelterType.Windmill:
if (!SmelterConfiguration.windmillIsEnabled.Value || !SmelterConfiguration.windmillAutoFuel.Value)
{
return;
}
num = SmelterConfiguration.windmillAutoRange.Value;
break;
case Smelter_Awake_Patch.SmelterType.SpinningWheel:
if (!SmelterConfiguration.spinningWheelIsEnabled.Value || !SmelterConfiguration.spinningWheelAutoFuel.Value)
{
return;
}
num = SmelterConfiguration.eitrRefineryAutoRange.Value;
break;
case Smelter_Awake_Patch.SmelterType.EitrRefinery:
if (!SmelterConfiguration.eitrRefineryIsEnabled.Value || !SmelterConfiguration.eitrRefineryAutoFuel.Value)
{
return;
}
num = SmelterConfiguration.eitrRefineryAutoRange.Value;
break;
}
float range = helper.Clamp(num, 1f, 50f);
int num2 = __instance.m_maxOre - __instance.GetQueueSize();
int num3 = __instance.m_maxFuel - (int)Math.Ceiling(__instance.GetFuel());
if (Object.op_Implicit((Object)(object)__instance.m_fuelItem) && num3 > 0)
{
ItemData itemData = __instance.m_fuelItem.m_itemData;
int num4 = InventoryAssistant.RemoveItemInAmountFromAllNearbyChests(((Component)__instance).gameObject, range, itemData, num3, !flag);
for (int i = 0; i < num4; i++)
{
__instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>());
}
if (num4 > 0 && Configuration.enableDebugLogging != null && Configuration.enableDebugLogging.Value)
{
ZLog.Log((object)("Added " + num4 + " fuel(" + itemData.m_shared.m_name + ") in " + __instance.m_name));
}
}
if (num2 <= 0)
{
return;
}
List<Container> nearbyChests = InventoryAssistant.GetNearbyChests(((Component)__instance).gameObject, range);
foreach (Container item in nearbyChests)
{
foreach (ItemConversion item2 in __instance.m_conversion)
{
if (flag2)
{
if ((SmelterConfiguration.dontProcessFineWood.Value && item2.m_from.m_itemData.m_shared.m_name.Equals(TillValhalla.WoodDefinitions.FineWoodName)) || (SmelterConfiguration.dontProcessRoundLog.Value && item2.m_from.m_itemData.m_shared.m_name.Equals(TillValhalla.WoodDefinitions.RoundLogName)))
{
continue;
}
int num5 = ((SmelterConfiguration.kilnStopAutoFuelThreshold.Value >= 0) ? SmelterConfiguration.kilnStopAutoFuelThreshold.Value : 0);
if (num5 > 0 && InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(nearbyChests), item2.m_to.m_itemData) >= num5)
{
return;
}
}
ItemData itemData2 = item2.m_from.m_itemData;
int num6 = InventoryAssistant.RemoveItemFromChest(item, itemData2, num2);
if (num6 > 0)
{
GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(((Object)((Component)item2.m_from).gameObject).name);
for (int j = 0; j < num6; j++)
{
__instance.m_nview.InvokeRPC("RPC_AddOre", new object[1] { ((Object)itemPrefab).name });
}
num2 -= num6;
if (num6 > 0 && Configuration.enableDebugLogging != null && Configuration.enableDebugLogging.Value)
{
ZLog.Log((object)("Added " + num6 + " ores(" + itemData2.m_shared.m_name + ") in " + __instance.m_name));
}
if (num2 == 0)
{
return;
}
}
}
}
}
}
[HarmonyPatch(typeof(ZSFX), "Awake")]
public static class ZSFX_Awake_Patch
{
public static void Postfix(ZSFX __instance)
{
if (!Configuration.modisenabled.Value && !ZSFXConfiguration.enabled.Value)
{
return;
}
string zSFXName = GetZSFXName(__instance);
if (ZSFXConfiguration.debugMode.Value)
{
Logger.LogInfo((object)("Check SFX:" + zSFXName));
}
Dictionary<string, Dictionary<string, AudioClip>> sFXList = TillValhalla.SFXList;
if (sFXList != null && sFXList.TryGetValue(zSFXName, out var value))
{
if (ZSFXConfiguration.debugMode.Value)
{
Logger.LogInfo((object)("replacing SFX list by name: " + zSFXName));
}
__instance.m_audioClips = value.Values.ToArray();
}
else
{
if (TillValhalla.SFX == null || __instance.m_audioClips == null)
{
return;
}
for (int i = 0; i < __instance.m_audioClips.Length; i++)
{
if ((Object)(object)__instance.m_audioClips[i] == (Object)null)
{
continue;
}
if (ZSFXConfiguration.debugMode.Value)
{
Logger.LogInfo((object)("checking SFX: " + zSFXName + ", clip: " + ((Object)__instance.m_audioClips[i]).name));
}
if (TillValhalla.SFX.TryGetValue(((Object)__instance.m_audioClips[i]).name, out var value2))
{
if (ZSFXConfiguration.debugMode.Value)
{
Logger.LogInfo((object)("replacing SFX: " + zSFXName + ", clip: " + ((Object)__instance.m_audioClips[i]).name));
}
__instance.m_audioClips[i] = value2;
}
}
}
}
public static string GetZSFXName(ZSFX zfx)
{
string name = ((Object)zfx).name;
char[] anyOf = new char[2] { '(', ' ' };
int num = name.IndexOfAny(anyOf);
if (num != -1)
{
return name.Remove(num);
}
return name;
}
}
public static class Waterproof
{
[HarmonyPatch(typeof(EnvMan), "IsWet")]
public class EnvMan_Patch
{
public static bool Postfix(bool __result)
{
if (!PlayerConfiguration.WetFromRain.Value)
{
__result = iswet;
}
return __result;
}
}
[HarmonyPatch(typeof(Player), "UpdateEnvStatusEffects")]
public static class Player_UpdateEnvStats_Patch
{
public static bool Prefix()
{
AddingStatFromEnv++;
return true;
}
public static void Postfix(Player __instance)
{
AddingStatFromEnv--;
}
}
[HarmonyPatch(typeof(SEMan), "AddStatusEffect", new Type[]
{
typeof(int),
typeof(bool),
typeof(int),
typeof(float)
})]
public static class SEMan_RemoveWetFromRain_Patch
{
public static bool Prefix(SEMan __instance, int nameHash)
{
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
if (!PlayerConfiguration.WetFromRain.Value && AddingStatFromEnv > 0 && __instance.m_character.IsPlayer() && nameHash == -1273337594 && iswet)
{
_ = (Player)__instance.m_character;
return false;
}
return true;
}
}
public static int AddingStatFromEnv;
public static bool iswet;
}
[HarmonyPatch(typeof(Player), "Awake")]
public static class Player_Awake_Patch
{
private static void Postfix(Player __instance)
{
if (PlayerConfiguration.enabled.Value)
{
__instance.m_maxCarryWeight = PlayerConfiguration.basemaximumweight.Value;
__instance.m_baseHP = PlayerConfiguration.basehp.Value;
__instance.m_baseStamina = PlayerConfiguration.basestamina.Value;
}
}
}
[HarmonyPatch(typeof(Player), "OnSpawned")]
public static class SE_Spawned_Patch
{
private static void Postfix(Player __instance)
{
if (!PlayerConfiguration.restedOnStart.Value)
{
return;
}
SEMan sEMan = ((Character)__instance).GetSEMan();
if (sEMan != null)
{
StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(StringExtensionMethods.GetStableHashCode("Rested"));
if ((Object)(object)statusEffect != (Object)null)
{
statusEffect.m_ttl = PlayerConfiguration.restedDurationOnStart.Value;
sEMan.AddStatusEffect(statusEffect, true, 0, 0f);
}
else
{
Logger.LogError((object)"Rested status effect not found!");
}
}
}
}
[HarmonyPatch(typeof(SE_Rested), "GetNearbyComfortPieces")]
public static class SE_Rested_GetNearbyComfortPieces_Transpiler
{
private static readonly MethodInfo RangeValueGetter = AccessTools.DeclaredMethod(typeof(SE_Rested_GetNearbyComfortPieces_Transpiler), "getRangeValue", (Type[])null, (Type[])null);
public static float getRangeValue()
{
return 10f;
}
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>(instructions);
List<CodeInstruction> list2 = new List<CodeInstruction>();
for (int i = 0; i < list.Count(); i++)
{
CodeInstruction val = list[i];
if (val.opcode == OpCodes.Ldc_R4 && CodeInstructionExtensions.OperandIs(val, (object)10))
{
val = new CodeInstruction(OpCodes.Callvirt, (object)RangeValueGetter);
}
list2.Add(val);
}
return list2;
}
}
[HarmonyPatch(typeof(SE_Stats), "Setup")]
public static class SE_Stats_Setup_Patch
{
private static void Postfix(ref SE_Stats __instance)
{
if (PlayerConfiguration.enabled.Value)
{
_ = __instance.m_addMaxCarryWeight;
if (__instance.m_addMaxCarryWeight > 0f)
{
__instance.m_addMaxCarryWeight = __instance.m_addMaxCarryWeight - 150f + PlayerConfiguration.baseMegingjordBuff.Value;
}
}
}
}
[HarmonyPatch(typeof(Player), "HaveRequirementItems", new Type[]
{
typeof(Recipe),
typeof(bool),
typeof(int),
typeof(int)
})]
public static class Player_HaveRequirementItems_Transpiler
{
private static MethodInfo method_Inventory_CountItems = AccessTools.Method(typeof(Inventory), "CountItems", (Type[])null, (Type[])null);
private static MethodInfo method_ComputeItemQuantity = AccessTools.Method(typeof(Player_HaveRequirementItems_Transpiler), "ComputeItemQuantity", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Expected O, but got Unknown
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
if (!CraftingStationConfiguration.craftFromChests.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (CodeInstructionExtensions.Calls(list[i], method_Inventory_CountItems))
{
list.Insert(++i, new CodeInstruction(OpCodes.Ldloc_2, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)method_ComputeItemQuantity));
}
}
return list.AsEnumerable();
}
private static int ComputeItemQuantity(int fromInventory, Requirement item, Player player)
{
CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
GameObject val = ((currentCraftingStation != null) ? ((Component)currentCraftingStation).gameObject : null);
Stopwatch stopwatch;
if (!Object.op_Implicit((Object)(object)val) || !CraftingStationConfiguration.craftFromWorkbench.Value)
{
val = ((Component)player).gameObject;
stopwatch = Inventory_NearbyChests_Cache.delta;
}
else
{
stopwatch = GameObjectAssistant.GetStopwatch(val);
}
int num = helper.Clamp(3, 1, 10) * 1000;
if (!stopwatch.IsRunning || stopwatch.ElapsedMilliseconds > num)
{
Inventory_NearbyChests_Cache.chests = InventoryAssistant.GetNearbyChests(val, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1, 50), !CraftingStationConfiguration.ignorePrivateAreaCheck.Value);
stopwatch.Restart();
}
return fromInventory + InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(Inventory_NearbyChests_Cache.chests), item.m_resItem.m_itemData);
}
}
[HarmonyPatch(typeof(Player), "HaveRequirements", new Type[]
{
typeof(Piece),
typeof(RequirementMode)
})]
public static class Player_HaveRequirements_Transpiler
{
private static MethodInfo method_Inventory_CountItems = AccessTools.Method(typeof(Inventory), "CountItems", (Type[])null, (Type[])null);
private static MethodInfo method_ComputeItemQuantity = AccessTools.Method(typeof(Player_HaveRequirements_Transpiler), "ComputeItemQuantity", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Expected O, but got Unknown
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Expected O, but got Unknown
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
if (!CraftingStationConfiguration.craftFromChests.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (CodeInstructionExtensions.Calls(list[i], method_Inventory_CountItems))
{
list.Insert(++i, new CodeInstruction(OpCodes.Ldloc_2, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Ldarg_0, (object)null));
list.Insert(++i, new CodeInstruction(OpCodes.Call, (object)method_ComputeItemQuantity));
}
}
return list.AsEnumerable();
}
private static int ComputeItemQuantity(int fromInventory, Requirement item, Player player)
{
CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
GameObject val = ((currentCraftingStation != null) ? ((Component)currentCraftingStation).gameObject : null);
Stopwatch stopwatch;
if (!Object.op_Implicit((Object)(object)val) || !CraftingStationConfiguration.craftFromWorkbench.Value)
{
val = ((Component)player).gameObject;
stopwatch = Inventory_NearbyChests_Cache.delta;
}
else
{
stopwatch = GameObjectAssistant.GetStopwatch(val);
}
int num = helper.Clamp(3, 1, 10) * 1000;
if (!stopwatch.IsRunning || stopwatch.ElapsedMilliseconds > num)
{
Inventory_NearbyChests_Cache.chests = InventoryAssistant.GetNearbyChests(val, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1, 50), !CraftingStationConfiguration.ignorePrivateAreaCheck.Value);
stopwatch.Restart();
}
return fromInventory + InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(Inventory_NearbyChests_Cache.chests), item.m_resItem.m_itemData);
}
}
[HarmonyPatch(typeof(Player), "ConsumeResources", new Type[]
{
typeof(Requirement[]),
typeof(int),
typeof(int),
typeof(int)
})]
public static class Player_ConsumeResources_Transpiler
{
private static MethodInfo method_Inventory_RemoveItem = AccessTools.Method(typeof(Inventory), "RemoveItem", new Type[4]
{
typeof(string),
typeof(int),
typeof(int),
typeof(bool)
}, (Type[])null);
private static MethodInfo method_RemoveItemsFromInventoryAndNearbyChests = AccessTools.Method(typeof(Player_ConsumeResources_Transpiler), "RemoveItemsFromInventoryAndNearbyChests", (Type[])null, (Type[])null);
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0093: Expected O, but got Unknown
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Expected O, but got Unknown
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Expected O, but got Unknown
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d9: Expected O, but got Unknown
if (!CraftingStationConfiguration.craftFromChests.Value)
{
return instructions;
}
List<CodeInstruction> list = instructions.ToList();
int num = -1;
int num2 = -1;
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldarg_0)
{
num = i;
}
else if (CodeInstructionExtensions.Calls(list[i], method_Inventory_RemoveItem))
{
num2 = i;
break;
}
}
if (num == -1 || num2 == -1)
{
ZLog.LogError((object)"Failed to apply Player_ConsumeResources_Transpiler");
return instructions;
}
list.RemoveRange(num + 1, num2 - num);
list.Insert(++num, new CodeInstruction(OpCodes.Ldloc_2, (object)null));
list.Insert(++num, new CodeInstruction(OpCodes.Ldloc_3, (object)null));
list.Insert(++num, new CodeInstruction(OpCodes.Ldarg_3, (object)null));
list.Insert(++num, new CodeInstruction(OpCodes.Call, (object)method_RemoveItemsFromInventoryAndNearbyChests));
return list.AsEnumerable();
}
private static void RemoveItemsFromInventoryAndNearbyChests(Player player, Requirement item, int amount, int itemQuality)
{
CraftingStation currentCraftingStation = player.GetCurrentCraftingStation();
GameObject val = ((currentCraftingStation != null) ? ((Component)currentCraftingStation).gameObject : null);
if (!Object.op_Implicit((Object)(object)val) || !CraftingStationConfiguration.craftFromWorkbench.Value)
{
val = ((Component)player).gameObject;
}
int num = ((Humanoid)player).m_inventory.CountItems(item.m_resItem.m_itemData.m_shared.m_name, -1, true);
((Humanoid)player).m_inventory.RemoveItem(item.m_resItem.m_itemData.m_shared.m_name, amount, itemQuality, true);
amount -= num;
if (amount > 0)
{
InventoryAssistant.RemoveItemInAmountFromAllNearbyChests(val, helper.Clamp(CraftingStationConfiguration.craftFromChestRange.Value, 1, 50), item.m_resItem.m_itemData, amount, !CraftingStationConfiguration.ignorePrivateAreaCheck.Value);
}
}
}
[HarmonyPatch(typeof(Player), "GetFirstRequiredItem")]
public static class Player_GetFirstRequiredItem_Transpiler
{
[HarmonyTranspiler]
public static IEnumerable<CodeInstruction> Transpile(IEnumerable<CodeInstruction> instructions)
{
List<CodeInstruction> list = instructions.ToList();
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldarg_0)
{
list[i].opcode = OpCodes.Ldarg_1;
list.RemoveAt(i + 1);
return list.AsEnumerable();
}
}
return instructions;
}
}
[HarmonyPatch(typeof(Player), "OnDeath")]
public static class Player_OnDeath_Patch
{
public static void Prefix(Player __instance)
{
if (!inventoryconfiguration.enabled.Value || (Object)(object)__instance == (Object)null)
{
return;
}
Inventory inventory = ((Humanoid)__instance).GetInventory();
if (inventory != null)
{
PlayerInventorySize.LastPlayerInventoryHeight = inventory.GetHeight();
if (Configuration.enableDebugLogging != null && Configuration.enableDebugLogging.Value)
{
ZLog.Log((object)$"Player {__instance.GetPlayerName()} died with inventory height: {PlayerInventorySize.LastPlayerInventoryHeight}");
}
}
}
}
[HarmonyPat