Decompiled source of JardsAdditions v1.5.1

plugins/JardsAdditions.dll

Decompiled a week ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using JardsAdditions.Patches.VanillaModifiers;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Extensions;
using Jotunn.Managers;
using Jotunn.Utils;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("JardsAdditions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("JardsAdditions")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")]
[assembly: AssemblyFileVersion("0.0.1.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.1.0")]
namespace JardsAdditions
{
	internal class Configuration
	{
		public ConfigEntry<bool> AddCustomPieces;

		public ConfigEntry<Protected> PreventSkillLoss;

		public ConfigEntry<Protected> ProtectPlayerGraves;

		public ConfigEntry<float> PavedRoadSpeedMultiplier;

		public ConfigEntry<float> PavedRoadStaminaMultiplier;

		public ConfigEntry<bool> ApplyRunBuffsToStoneFloors;

		public ConfigEntry<float> HomeActionMultiplier;

		public ConfigEntry<bool> HarpoonIsHomeAction;

		public ConfigEntry<float> KnockbackMultiplier;

		public ConfigEntry<bool> AddUnusedPieces;

		public ConfigEntry<BloodstoneEffect> BloodstoneEffect;

		public ConfigEntry<float> BloodstoneDamagePercent;

		public ConfigEntry<float> BloodstoneVampirismPercent;

		public ConfigEntry<bool> WindRunWithModer;
	}
	[HarmonyPatch(typeof(Character))]
	internal class KnockbackModifiers
	{
		[HarmonyPatch("Damage")]
		[HarmonyPrefix]
		private static void MultiplyKnockback(ref HitData hit)
		{
			if (hit != null)
			{
				HitData obj = hit;
				obj.m_pushForce *= JardsAdditions.PluginConfig.KnockbackMultiplier.Value;
			}
		}
	}
	[HarmonyPatch(typeof(Player))]
	internal class BaseStaminaMultiplier
	{
		[HarmonyPatch("UseStamina")]
		[HarmonyPrefix]
		private static void MultiplyStamina(ref float v, bool isHomeUsage)
		{
			if (isHomeUsage)
			{
				v *= JardsAdditions.PluginConfig.HomeActionMultiplier.Value;
			}
		}
	}
	[HarmonyPatch(typeof(SE_Harpooned))]
	internal class HarpoonChange
	{
		[HarmonyPatch("UpdateStatusEffect")]
		[HarmonyPrefix]
		private static bool ChangeHarpoonToHomeAction(ref SE_Harpooned __instance, float dt)
		{
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			if (JardsAdditions.PluginConfig.HarpoonIsHomeAction.Value)
			{
				SE_Harpooned obj = __instance;
				((StatusEffect)obj).m_time = ((StatusEffect)obj).m_time + dt;
				if (((StatusEffect)__instance).m_repeatInterval > 0f && !string.IsNullOrEmpty(((StatusEffect)__instance).m_repeatMessage))
				{
					SE_Harpooned obj2 = __instance;
					((StatusEffect)obj2).m_msgTimer = ((StatusEffect)obj2).m_msgTimer + dt;
					if (((StatusEffect)__instance).m_msgTimer > ((StatusEffect)__instance).m_repeatInterval)
					{
						((StatusEffect)__instance).m_msgTimer = 0f;
						((StatusEffect)__instance).m_character.Message(((StatusEffect)__instance).m_repeatMessageType, ((StatusEffect)__instance).m_repeatMessage, 0, (Sprite)null);
					}
				}
				if (!Object.op_Implicit((Object)(object)__instance.m_attacker))
				{
					return false;
				}
				Rigidbody component = ((Component)((StatusEffect)__instance).m_character).GetComponent<Rigidbody>();
				if (!Object.op_Implicit((Object)(object)component))
				{
					return false;
				}
				float num = Vector3.Distance(((Component)__instance.m_attacker).transform.position, ((Component)((StatusEffect)__instance).m_character).transform.position);
				if ((Object)(object)((StatusEffect)__instance).m_character.GetStandingOnShip() == (Object)null && !((StatusEffect)__instance).m_character.IsAttached())
				{
					float num2 = Utils.Pull(component, ((Component)__instance.m_attacker).transform.position, __instance.m_baseDistance, __instance.m_pullSpeed, __instance.m_pullForce, __instance.m_smoothDistance, true, true, __instance.m_forcePower);
					SE_Harpooned obj3 = __instance;
					obj3.m_drainStaminaTimer += dt;
					if (__instance.m_drainStaminaTimer > __instance.m_staminaDrainInterval && num2 > 0f)
					{
						__instance.m_drainStaminaTimer = 0f;
						float num3 = __instance.m_staminaDrain * num2 * ((StatusEffect)__instance).m_character.GetMass();
						__instance.m_attacker.UseStamina(num3, true);
					}
				}
				if (Object.op_Implicit((Object)(object)__instance.m_line))
				{
					__instance.m_line.SetSlack((1f - Utils.LerpStep(__instance.m_baseDistance / 2f, __instance.m_baseDistance, num)) * __instance.m_maxLineSlack);
				}
				if (num - __instance.m_baseDistance > __instance.m_breakDistance)
				{
					__instance.m_broken = true;
					__instance.m_attacker.Message((MessageType)2, "$msg_harpoon_linebroke", 0, (Sprite)null);
				}
				if (!__instance.m_attacker.HaveStamina(0f))
				{
					__instance.m_broken = true;
					__instance.m_attacker.Message((MessageType)2, ((StatusEffect)__instance).m_character.m_name + " $msg_harpoon_released", 0, (Sprite)null);
				}
				return false;
			}
			return true;
		}
	}
	internal class PavedRoadHelpers
	{
		public static bool IsPaved(Heightmap h, Vector3 worldPos)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			int num = default(int);
			int num2 = default(int);
			h.WorldToVertexMask(worldPos, ref num, ref num2);
			return h.m_paintMask.GetPixel(num, num2).b > 0.5f;
		}

		private static WearNTear GetSuitableWearNTear(GameObject gameObject, int levels = 1)
		{
			if ((Object)(object)gameObject == (Object)null)
			{
				return null;
			}
			WearNTear component = gameObject.GetComponent<WearNTear>();
			if ((Object)(object)component != (Object)null)
			{
				return component;
			}
			if (levels > 0)
			{
				return GetSuitableWearNTear(((Component)gameObject.transform.parent).gameObject, levels - 1);
			}
			return null;
		}

		public static bool TestCreatureIsOnPavedRoad(Character character)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Invalid comparison between Unknown and I4
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Invalid comparison between Unknown and I4
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Invalid comparison between Unknown and I4
			if (character.IsOnGround() && (Object)(object)character.m_lastGroundCollider != (Object)null)
			{
				Heightmap component = ((Component)character.m_lastGroundCollider).GetComponent<Heightmap>();
				if ((Object)(object)component != (Object)null)
				{
					return IsPaved(component, ((Component)character).transform.position);
				}
				if (JardsAdditions.PluginConfig.ApplyRunBuffsToStoneFloors.Value)
				{
					WearNTear suitableWearNTear = GetSuitableWearNTear(((Component)character.m_lastGroundCollider).gameObject);
					if ((Object)(object)suitableWearNTear != (Object)null)
					{
						if ((int)suitableWearNTear.m_materialType != 1 && (int)suitableWearNTear.m_materialType != 4)
						{
							return (int)suitableWearNTear.m_materialType == 5;
						}
						return true;
					}
					return false;
				}
			}
			return false;
		}

		public static void ScaleCreatureRunSpeed(Character character, ref float result)
		{
			if (TestCreatureIsOnPavedRoad(character))
			{
				result *= JardsAdditions.PluginConfig.PavedRoadSpeedMultiplier.Value;
			}
		}

		public static void ScaleCreatureRunStamina(Character character, ref float result)
		{
			if (TestCreatureIsOnPavedRoad(character))
			{
				result *= JardsAdditions.PluginConfig.PavedRoadStaminaMultiplier.Value;
			}
		}
	}
	[HarmonyPatch(typeof(Character))]
	internal class PavedRoadModifiers_CharacterSpeed
	{
		[HarmonyPatch("GetRunSpeedFactor")]
		[HarmonyPostfix]
		private static void ScaleCharacterRunSpeed(ref Character __instance, ref float __result)
		{
			PavedRoadHelpers.ScaleCreatureRunSpeed(__instance, ref __result);
		}
	}
	[HarmonyPatch(typeof(Player))]
	internal class PavedRoadModifiers_PlayerSpeed
	{
		[HarmonyPatch("GetRunSpeedFactor")]
		[HarmonyPostfix]
		private static void ScalePlayerRunSpeed(ref Player __instance, ref float __result)
		{
			PavedRoadHelpers.ScaleCreatureRunSpeed((Character)(object)__instance, ref __result);
		}
	}
	[HarmonyPatch(typeof(SEMan))]
	internal class PavedRoadModifiers_PlayerStamina
	{
		[HarmonyPatch("ModifyRunStaminaDrain")]
		[HarmonyPostfix]
		private static void ScalePlayerRunStamina(ref SEMan __instance, float baseDrain, ref float drain, bool minZero = true)
		{
			PavedRoadHelpers.ScaleCreatureRunStamina(__instance.m_character, ref drain);
		}
	}
	[BepInPlugin("hu.jard.JardsAdditions", "Jard's Additions", "1.5.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
	[BepInIncompatibility("Basil_NoStamCosts")]
	internal class JardsAdditions : BaseUnityPlugin
	{
		public const string PluginGUID = "hu.jard.JardsAdditions";

		public const string PluginName = "Jard's Additions";

		public const string PluginVersion = "1.5.1";

		private AssetBundle LocalizationBundle;

		private AssetBundle VanityBundle;

		private AssetBundle CustomPieceBundle;

		internal static CustomItem gauntlets;

		public static CustomLocalization Localization = LocalizationManager.Instance.GetLocalization();

		public static Configuration PluginConfig = new Configuration();

		private void Awake()
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			LoadConfig(ref PluginConfig);
			LoadAssets();
			LoadLocalization();
			PrefabManager.OnVanillaPrefabsAvailable += AddItems;
			AddCustomPieces();
			PieceManager.OnPiecesRegistered += AddVanillaPieces;
			new Harmony("hu.jard.JardsAdditions").PatchAll();
			new Harmony("Basil_NoStamCosts").UnpatchSelf();
		}

		private void LoadConfig(ref Configuration config)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Expected O, but got Unknown
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Expected O, but got Unknown
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Expected O, but got Unknown
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Expected O, but got Unknown
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Expected O, but got Unknown
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Expected O, but got Unknown
			//IL_0203: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: Expected O, but got Unknown
			//IL_0230: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Expected O, but got Unknown
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Expected O, but got Unknown
			//IL_02a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Expected O, but got Unknown
			//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f4: Expected O, but got Unknown
			//IL_031c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0326: Expected O, but got Unknown
			ConfigurationManagerAttributes val = new ConfigurationManagerAttributes
			{
				IsAdminOnly = true
			};
			config.AddCustomPieces = ((BaseUnityPlugin)this).Config.Bind<bool>("Custom additions", "AddCustomPieces", true, new ConfigDescription("Enables all custom build pieces (hybrid crafting stations) (requires full game restart)", (AcceptableValueBase)null, new object[1] { val }));
			config.PreventSkillLoss = ((BaseUnityPlugin)this).Config.Bind<Protected>("PvP Protection", "PreventPvPSkillLoss", Protected.OnlyInWard, new ConfigDescription("Whether to prevent skill loss when killed by another player (enforced by server)", (AcceptableValueBase)null, new object[1] { val }));
			config.ProtectPlayerGraves = ((BaseUnityPlugin)this).Config.Bind<Protected>("PvP Protection", "ProtectPlayerGraves", Protected.OnlyInWard, new ConfigDescription("Whether to prevent grave access by other players (enforced by server)", (AcceptableValueBase)null, new object[1] { val }));
			config.PavedRoadStaminaMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "PavedRoadStaminaMultiplier", 0.4f, new ConfigDescription("Stamina multiplier when running on a paved road (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[1] { val }));
			config.PavedRoadSpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "PavedRoadSpeedMultiplier", 1.15f, new ConfigDescription("Speed multiplier when running on a paved road (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), new object[1] { val }));
			config.ApplyRunBuffsToStoneFloors = ((BaseUnityPlugin)this).Config.Bind<bool>("Vanilla tweaks", "ApplyRunBuffsToStoneFloors", true, new ConfigDescription("Whether to apply speed and stamina multipliers when the player is running on a stone piece (stone floor, grausten floor, etc) (enforced by server)", (AcceptableValueBase)null, Array.Empty<object>()));
			config.HomeActionMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "HomeActionMultiplier", 1f, new ConfigDescription("Stamina multiplier of home/build actions (placing, destruction, repairing) (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[1] { val }));
			config.HarpoonIsHomeAction = ((BaseUnityPlugin)this).Config.Bind<bool>("Vanilla tweaks", "HarpoonIsHomeAction", false, new ConfigDescription("Whether harpooning creatures is a 'home action' and should receive all home building stamina discounts (enforced by server)", (AcceptableValueBase)null, new object[1] { val }));
			config.KnockbackMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "KnockbackMultiplier", 1f, new ConfigDescription("Knockback multiplier (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, float.MaxValue), new object[1] { val }));
			config.AddUnusedPieces = ((BaseUnityPlugin)this).Config.Bind<bool>("Client-side tweaks", "AddUnusedPieces", true, new ConfigDescription("Whether to add unused build pieces (turf roof, stone 4x4, cracked pots, etc...) to the build hammer tables.\nDisable this if you already have a mod that adds these in.", (AcceptableValueBase)null, Array.Empty<object>()));
			config.BloodstoneEffect = ((BaseUnityPlugin)this).Config.Bind<BloodstoneEffect>("Vanilla tweaks", "BloodstoneEffect", BloodstoneEffect.Damage, new ConfigDescription("Modify the effect of the bloodstone enchantment (enforced by server)", (AcceptableValueBase)null, new object[1] { val }));
			config.BloodstoneDamagePercent = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "BloodstoneDamagePercent", 0.004f, new ConfigDescription("Percentage increase of damage per missing health point for bloodstone damage effect (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.002f, 0.01f), new object[1] { val }));
			config.BloodstoneVampirismPercent = ((BaseUnityPlugin)this).Config.Bind<float>("Vanilla tweaks", "BloodstoneVampirismPercent", 0.045f, new ConfigDescription("Percentage of health returned per missing health point for bloodstone vampirism effect (enforced by server)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), new object[1] { val }));
			config.WindRunWithModer = ((BaseUnityPlugin)this).Config.Bind<bool>("Vanilla tweaks", "WindRunWithModer", true, new ConfigDescription("Whether Moder's power synergizes with the asksvin cape by controlling wind direction while wearing the cape (enforced by server)", (AcceptableValueBase)null, new object[1] { val }));
		}

		private void LoadAssets()
		{
			LocalizationBundle = AssetUtils.LoadAssetBundleFromResources("localization", Assembly.GetExecutingAssembly());
			VanityBundle = AssetUtils.LoadAssetBundleFromResources("vanity", Assembly.GetExecutingAssembly());
			CustomPieceBundle = AssetUtils.LoadAssetBundleFromResources("custompieces", Assembly.GetExecutingAssembly());
		}

		private void LoadLocalization()
		{
			TextAsset[] array = LocalizationBundle.LoadAllAssets<TextAsset>();
			foreach (TextAsset val in array)
			{
				Localization.AddJsonFile(((Object)val).name.Replace(".json", null), ((object)val).ToString());
			}
		}

		private void AddItemFrom(AssetBundle parentBundle, string prefabName)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			GameObject val = parentBundle.LoadAsset<GameObject>(prefabName);
			if ((Object)(object)val == (Object)null)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Wasn't able to load prefab '" + prefabName + "' from asset bundle '" + ((Object)parentBundle).name + "'. Export probably messed up."));
			}
			CustomItem val2 = new CustomItem(val, true);
			if (prefabName.Equals("ShieldJardGauntlets"))
			{
				gauntlets = val2;
			}
			ItemManager.Instance.AddItem(val2);
		}

		private void AddItems()
		{
			AddItemFrom(VanityBundle, "ArmorJardChest");
			AddItemFrom(VanityBundle, "ArmorJardLegs");
			AddItemFrom(VanityBundle, "SwordJard");
			AddItemFrom(VanityBundle, "SwordJardOffset");
			AddItemFrom(VanityBundle, "ShieldJardGauntlets");
			AddItemFrom(VanityBundle, "CapeJard");
			AddItemFrom(VanityBundle, "HelmetDriver");
			AddItemFrom(VanityBundle, "CapeDriver");
			PrefabManager.OnVanillaPrefabsAvailable -= AddItems;
		}

		private void AddPieceFrom(string prefabName, AssetBundle parentBundle = null, string tool = "Hammer", string station = "piece_workbench", PieceCategory category = 0, RequirementConfig recipe = null)
		{
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = (GameObject)(((Object)(object)parentBundle == (Object)null) ? ((object)Array.Find(Resources.FindObjectsOfTypeAll<GameObject>(), (GameObject _) => ((Object)_).name.Equals(prefabName))) : ((object)parentBundle.LoadAsset<GameObject>(prefabName)));
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			if ((Object)(object)parentBundle == (Object)null)
			{
				if ((Object)(object)val.GetComponent<Piece>() == (Object)null)
				{
					Piece obj = val.AddComponent<Piece>();
					obj.m_icon = Array.Find(Resources.FindObjectsOfTypeAll<GameObject>(), (GameObject _) => ((Object)_).name.Equals("ShieldBanded")).GetComponent<ItemDrop>().m_itemData.GetIcon();
					CustomPiece val2 = InstantiateCustomPiece(val, "piece_" + prefabName, tool, station, category, recipe);
					Object.Destroy((Object)(object)obj);
					ExposedGameObjectExtension.AddComponentCopy<Piece>(val, val2.Piece);
					PieceManager.Instance.AddPiece(val2);
				}
				else
				{
					PieceManager.Instance.GetPieceTable(tool).m_pieces.Add(val);
				}
			}
			else if (PluginConfig.AddCustomPieces.Value)
			{
				PieceManager.Instance.AddPiece(InstantiateCustomPiece(val, prefabName, tool, station, category, recipe));
			}
		}

		private CustomPiece InstantiateCustomPiece(GameObject prefab, string name, string tool, string station, PieceCategory category, RequirementConfig recipe)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Expected O, but got Unknown
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Expected O, but got Unknown
			PieceConfig val = new PieceConfig();
			val.Name = "$" + name + "_name";
			val.Description = "$" + name + "_description";
			val.PieceTable = tool;
			val.CraftingStation = station;
			val.Category = ((object)(PieceCategory)(ref category)).ToString();
			val.AddRequirement(recipe);
			return new CustomPiece(prefab, true, val);
		}

		private void AddVanillaPieces()
		{
			if (PluginConfig.AddUnusedPieces.Value)
			{
				AddPieceFrom("turf_roof", null, "Hammer", "piece_workbench", (PieceCategory)0);
				AddPieceFrom("turf_roof_top", null, "Hammer", "piece_workbench", (PieceCategory)0);
				AddPieceFrom("wood_ledge", null, "Hammer", "piece_workbench", (PieceCategory)0);
				AddPieceFrom("stone_floor", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("piece_pot1_cracked", null, "Hammer", "piece_workbench", (PieceCategory)4);
				AddPieceFrom("piece_pot2_cracked", null, "Hammer", "piece_workbench", (PieceCategory)4);
				AddPieceFrom("piece_pot3_cracked", null, "Hammer", "piece_workbench", (PieceCategory)4);
				AddPieceFrom("blackmarble_stair_corner", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_stair_corner_left", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_tile_floor_1x1", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_tile_floor_2x2", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_tile_wall_1x1", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_tile_wall_2x2", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_tile_wall_2x4", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_2x2x1", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_floor_large", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_column_3", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_head_01", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_head_02", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_head_big01", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("blackmarble_head_big02", null, "Hammer", "piece_stonecutter", (PieceCategory)3);
				AddPieceFrom("piece_dvergr_wood_wall", null, "Hammer", "piece_workbench", (PieceCategory)2);
			}
			PieceManager.OnPiecesRegistered -= AddVanillaPieces;
		}

		private void AddCustomPieces()
		{
			AddPieceFrom("AltWorkbench", CustomPieceBundle, "Hammer", "", (PieceCategory)1);
			AddPieceFrom("FlametalGrill", CustomPieceBundle, "Hammer", "blackforge", (PieceCategory)1);
			AddPieceFrom("DvergrFermenter", CustomPieceBundle, "Hammer", "blackforge", (PieceCategory)1);
			AddPieceFrom("stone_big_floor_4x4", CustomPieceBundle, "Hammer", "piece_stonecutter", (PieceCategory)3);
		}
	}
	internal enum Protected
	{
		Yes,
		OnlyInWard,
		No
	}
	internal class PvpWardHelpers
	{
		public static bool checkIfLocationIsSafe(Vector3 position)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			bool result = false;
			foreach (PrivateArea allArea in PrivateArea.m_allAreas)
			{
				if (allArea.IsEnabled() && allArea.IsInside(position, 0f))
				{
					return true;
				}
			}
			return result;
		}

		public static bool getSafeAreas(Vector3 position, ref List<PrivateArea> areas)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			bool result = false;
			foreach (PrivateArea allArea in PrivateArea.m_allAreas)
			{
				if (allArea.IsEnabled() && allArea.IsInside(position, 0f))
				{
					areas.Add(allArea);
					result = true;
				}
			}
			return result;
		}
	}
	[HarmonyPatch(typeof(Skills))]
	public class ProtectSkills
	{
		[HarmonyPatch("OnDeath")]
		private static bool Prefix(ref Skills __instance)
		{
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Invalid comparison between Unknown and I4
			Player player = __instance.m_player;
			bool flag = default(bool);
			switch (JardsAdditions.PluginConfig.PreventSkillLoss.Value)
			{
			case Protected.Yes:
				flag = true;
				break;
			case Protected.OnlyInWard:
				flag = PvpWardHelpers.checkIfLocationIsSafe(((Component)player).transform.position);
				break;
			case Protected.No:
				flag = false;
				break;
			default:
				global::<PrivateImplementationDetails>.ThrowInvalidOperationException();
				break;
			}
			bool num = flag;
			bool flag2 = (int)((Character)player).m_lastHit.m_hitType == 2;
			return !(num && flag2);
		}
	}
	[HarmonyPatch(typeof(TombStone))]
	public class ProtectTombstone
	{
		[HarmonyPatch("GetHoverText")]
		[HarmonyPrefix]
		private static bool NoAccessHoverText(ref TombStone __instance, ref string __result)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.m_nview.IsValid())
			{
				bool flag = default(bool);
				switch (JardsAdditions.PluginConfig.ProtectPlayerGraves.Value)
				{
				case Protected.Yes:
					flag = true;
					break;
				case Protected.OnlyInWard:
					flag = PvpWardHelpers.checkIfLocationIsSafe(((Component)__instance).transform.position);
					break;
				case Protected.No:
					flag = false;
					break;
				default:
					global::<PrivateImplementationDetails>.ThrowInvalidOperationException();
					break;
				}
				if (flag && !__instance.IsOwner())
				{
					string text = __instance.m_text + " " + __instance.GetOwnerName();
					__result = Localization.instance.Localize(text + "\n$piece_noaccess");
					return false;
				}
			}
			return true;
		}

		[HarmonyPatch("Interact")]
		[HarmonyPrefix]
		private static bool BlockInteract(ref TombStone __instance)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			List<PrivateArea> areas = new List<PrivateArea>();
			bool flag = default(bool);
			switch (JardsAdditions.PluginConfig.ProtectPlayerGraves.Value)
			{
			case Protected.Yes:
				flag = true;
				break;
			case Protected.OnlyInWard:
				flag = PvpWardHelpers.getSafeAreas(((Component)__instance).transform.position, ref areas);
				break;
			case Protected.No:
				flag = false;
				break;
			default:
				global::<PrivateImplementationDetails>.ThrowInvalidOperationException();
				break;
			}
			if (flag && !__instance.IsOwner())
			{
				foreach (PrivateArea item in areas)
				{
					item.FlashShield(false);
				}
				return false;
			}
			return true;
		}
	}
}
namespace JardsAdditions.VanillaModifiers
{
	internal class StopJumpsHelpers
	{
		public static bool JumpIsRightMB()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Invalid comparison between Unknown and I4
			ButtonDef buttonDef = ZInput.m_instance.GetButtonDef("Jump");
			if (buttonDef != null)
			{
				return (int)buttonDef.m_mouseButton == 1;
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(Humanoid))]
	internal class StopJumpsInInventory
	{
		public static bool ItemFlag;

		[HarmonyPatch("UseItem")]
		[HarmonyPostfix]
		private static void PlayerUsedItem(bool fromInventoryGui)
		{
			if (fromInventoryGui && StopJumpsHelpers.JumpIsRightMB())
			{
				ItemFlag = true;
			}
		}
	}
	[HarmonyPatch(typeof(Character))]
	internal class StopJumpIfRightClicked
	{
		[HarmonyPatch("Jump")]
		[HarmonyPrefix]
		private static bool StopJump(ref Character __instance)
		{
			if (StopJumpsInInventory.ItemFlag && (Object)(object)__instance == (Object)(object)Player.m_localPlayer)
			{
				StopJumpsInInventory.ItemFlag = false;
				return false;
			}
			return true;
		}
	}
}
namespace JardsAdditions.Patches.VanillaModifiers
{
	internal enum BloodstoneEffect
	{
		Damage,
		Vampirism,
		DamageAndVampirism
	}
	[HarmonyPatch(typeof(Attack))]
	internal class BloodstoneDamageModifiers
	{
		private static bool ShouldModifyDamage()
		{
			if (JardsAdditions.PluginConfig.BloodstoneEffect.Value == BloodstoneEffect.Vampirism)
			{
				return true;
			}
			if ((double)JardsAdditions.PluginConfig.BloodstoneDamagePercent.Value != 0.02)
			{
				return true;
			}
			return false;
		}

		[HarmonyPatch("ModifyDamage")]
		[HarmonyPrefix]
		private static bool OverrideBloodDamage(ref Attack __instance, HitData hitData, float damageFactor)
		{
			if (ShouldModifyDamage())
			{
				if (__instance.m_damageMultiplier != 1f)
				{
					((DamageTypes)(ref hitData.m_damage)).Modify(__instance.m_damageMultiplier);
				}
				if (damageFactor != 1f)
				{
					((DamageTypes)(ref hitData.m_damage)).Modify(damageFactor);
				}
				((DamageTypes)(ref hitData.m_damage)).Modify(__instance.GetLevelDamageFactor());
				if (__instance.m_damageMultiplierByTotalHealthMissing > 0f)
				{
					((DamageTypes)(ref hitData.m_damage)).Modify(1f + (1f - ((Character)__instance.m_character).GetHealthPercentage()) * __instance.m_damageMultiplierByTotalHealthMissing);
				}
				if (JardsAdditions.PluginConfig.BloodstoneEffect.Value != BloodstoneEffect.Vampirism && __instance.m_damageMultiplierPerMissingHP > 0f)
				{
					float num = ((JardsAdditions.PluginConfig.BloodstoneDamagePercent.Value != 0.002f) ? JardsAdditions.PluginConfig.BloodstoneDamagePercent.Value : __instance.m_damageMultiplierPerMissingHP);
					if (num > 0f)
					{
						((DamageTypes)(ref hitData.m_damage)).Modify(1f + (((Character)__instance.m_character).GetMaxHealth() - ((Character)__instance.m_character).GetHealth()) * num);
					}
				}
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Attack))]
	internal class BloodstoneAddVampirismPatches
	{
		public static float CalculateVampMultiplier(ItemData item)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			float num = ((JardsAdditions.PluginConfig.BloodstoneVampirismPercent.Value != item.m_shared.m_attack.m_damageMultiplierPerMissingHP) ? JardsAdditions.PluginConfig.BloodstoneVampirismPercent.Value : item.m_shared.m_attack.m_damageMultiplierPerMissingHP);
			DamageTypes damages = item.m_shared.m_damages;
			if (item.m_quality > 1)
			{
				((DamageTypes)(ref damages)).Add(item.m_shared.m_damagesPerLevel, item.m_quality - 1);
			}
			float num2 = ((DamageTypes)(ref damages)).GetTotalPhysicalDamage() / 140f;
			num2 = Mathf.Pow(num2, 2.5f);
			if (num2 < 1f)
			{
				num2 = 1f;
			}
			float num3 = default(float);
			ZoneSystem.instance.GetGlobalKey((GlobalKeys)1, ref num3);
			if (num3 == 0f)
			{
				num3 = 100f;
			}
			num3 /= 100f;
			return num * num2 * num3;
		}

		[HarmonyPatch("OnAttackTrigger")]
		[HarmonyPrefix]
		private static void OnAttackTrigger(ref Attack __instance)
		{
			if (JardsAdditions.PluginConfig.BloodstoneEffect.Value != 0 && __instance.m_damageMultiplierPerMissingHP > 0f)
			{
				float num = CalculateVampMultiplier(__instance.m_weapon);
				float attackHealthReturnHit = (((Character)__instance.m_character).GetMaxHealth() - ((Character)__instance.m_character).GetHealth()) * num;
				__instance.m_attackHealthReturnHit = attackHealthReturnHit;
			}
		}
	}
	[HarmonyPatch(typeof(ItemData))]
	internal class BloodstoneTooltipPatches
	{
		[HarmonyPatch("GetTooltip", new Type[]
		{
			typeof(ItemData),
			typeof(int),
			typeof(bool),
			typeof(float)
		})]
		[HarmonyPostfix]
		private static void OverrideTooltipValues(ref string __result, ItemData item)
		{
			LinkedList<string> linkedList = new LinkedList<string>(__result.Split(new char[1] { '\n' }));
			bool flag = false;
			for (LinkedListNode<string> linkedListNode = linkedList.First; linkedListNode != null; linkedListNode = linkedListNode.Next)
			{
				if (linkedListNode.Value.Contains("$item_damagemultiplierhp"))
				{
					if (JardsAdditions.PluginConfig.BloodstoneDamagePercent.Value != item.m_shared.m_attack.m_damageMultiplierPerMissingHP)
					{
						linkedListNode.Value = $"$item_damagemultiplierhp: <color=orange>{JardsAdditions.PluginConfig.BloodstoneDamagePercent.Value * 100f}%</color>";
						flag = true;
					}
					if (JardsAdditions.PluginConfig.BloodstoneEffect.Value != 0)
					{
						float num = BloodstoneAddVampirismPatches.CalculateVampMultiplier(item);
						string value = $"$item_vampirismhp: <color=orange>{num * 100f}%</color>";
						if (JardsAdditions.PluginConfig.BloodstoneEffect.Value == BloodstoneEffect.Vampirism)
						{
							linkedListNode.Value = value;
						}
						else
						{
							linkedList.AddAfter(linkedListNode, value);
						}
						flag = true;
					}
					break;
				}
			}
			if (!flag)
			{
				return;
			}
			__result = "";
			foreach (string item2 in linkedList)
			{
				__result = __result + "\n" + item2;
			}
		}
	}
	[HarmonyPatch(typeof(EnvMan))]
	internal class ModerPowerModifiers
	{
		[HarmonyPatch("UpdateWind")]
		[HarmonyPrefix]
		private static bool AskCapeWind(ref EnvMan __instance, long timeSec, float dt)
		{
			//IL_007b: 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)
			if (__instance.GetCurrentEnvironment() != null && Object.op_Implicit((Object)(object)Player.m_localPlayer) && (Object)(object)Ship.GetLocalShip() == (Object)null && ((Character)Player.m_localPlayer).m_seman.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("GP_Moder")) && ((Character)Player.m_localPlayer).m_seman.HaveStatusEffect(StringExtensionMethods.GetStableHashCode("WindRun")) && JardsAdditions.PluginConfig.WindRunWithModer.Value)
			{
				State state = Random.state;
				float num = 0f;
				float num2 = 0.5f;
				__instance.AddWindOctave(timeSec, 1, ref num, ref num2);
				__instance.AddWindOctave(timeSec, 2, ref num, ref num2);
				__instance.AddWindOctave(timeSec, 4, ref num, ref num2);
				__instance.AddWindOctave(timeSec, 8, ref num, ref num2);
				Random.state = state;
				num2 = Mathf.Lerp(__instance.GetCurrentEnvironment().m_windMin, __instance.GetCurrentEnvironment().m_windMax, num2);
				__instance.SetTargetWind(((Component)Player.m_localPlayer).transform.forward, num2);
				__instance.UpdateWindTransition(dt);
				return false;
			}
			return true;
		}
	}
}
namespace JardsAdditions.Patches.CustomPatches
{
	[HarmonyPatch(typeof(Humanoid))]
	internal class CapeColliderPatches
	{
		[HarmonyPatch("SetupVisEquipment")]
		[HarmonyPostfix]
		private static void ModifyColliderSize(ref Humanoid __instance)
		{
			if (__instance is Player)
			{
				Transform val = TransformExtensions.FindDeepChild(((Component)__instance).transform, "Hips", (IterativeSearchType)1);
				Transform val2 = TransformExtensions.FindDeepChild(((Component)val).transform, "Spine1", (IterativeSearchType)1);
				Transform val3 = TransformExtensions.FindDeepChild(((Component)val).transform, "Head", (IterativeSearchType)1);
				if (__instance.m_visEquipment.m_shoulderItem.Equals("CapeJard"))
				{
					AttemptAdjustWith(((Component)val).transform, "ClothCollider", 0.575f);
					AttemptAdjustWith(((Component)val).transform, "ClothColliderHips", 0.375f);
					AttemptAdjustWith(((Component)val).transform, "ClothColliderHipsCape", 0.375f);
					AttemptAdjustWith(((Component)val2).transform, "ClothCollider (3)", 0.55f);
					AttemptAdjustWith(((Component)val2).transform, "ClothColliderMid", 0.25f);
					AttemptAdjustWith(((Component)val2).transform, "ClothColliderMidCape", 0.25f);
					AttemptAdjustWith(((Component)val3).transform, "ClothColliderHead", 0f);
					AttemptAdjustWith(((Component)val3).transform, "ClothColliderHeadCape", 0f);
				}
				else
				{
					AttemptAdjustWith(((Component)val).transform, "ClothCollider", 0.8f);
					AttemptAdjustWith(((Component)val).transform, "ClothColliderHips", 0.45f);
					AttemptAdjustWith(((Component)val).transform, "ClothColliderHipsCape", 0.5f);
					AttemptAdjustWith(((Component)val2).transform, "ClothCollider (3)", 0.8f);
					AttemptAdjustWith(((Component)val2).transform, "ClothColliderMid", 0.45f);
					AttemptAdjustWith(((Component)val2).transform, "ClothColliderMidCape", 0.45f);
					AttemptAdjustWith(((Component)val3).transform, "ClothColliderHead", 0.38f);
					AttemptAdjustWith(((Component)val3).transform, "ClothColliderHeadCape", 0.5f);
				}
			}
		}

		private static void AttemptAdjustWith(Transform parent, string colliderToTry, float radius)
		{
			if (Object.op_Implicit((Object)(object)parent) && Object.op_Implicit((Object)(object)parent.Find(colliderToTry)))
			{
				((Component)parent.Find(colliderToTry)).GetComponent<CapsuleCollider>().radius = radius;
			}
		}
	}
	[HarmonyPatch(typeof(Humanoid))]
	internal class ShieldAnimationPatches
	{
		private static AnimationClip originalBlock;

		private static EffectList originalBlockEffects;

		private static EffectList gauntletBlockEffects;

		[HarmonyPatch("SetupAnimationState")]
		[HarmonyPrefix]
		private static bool CustomBlockAnimation(ref Humanoid __instance)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Expected O, but got Unknown
			if (__instance.m_leftItem != null && __instance.m_visEquipment.m_leftItem.Equals("ShieldJardGauntlets"))
			{
				if (__instance.m_rightItem != null)
				{
					__instance.SetAnimationState(__instance.m_rightItem.m_shared.m_animationState);
					AnimatorOverrideController val = null;
					val = (AnimatorOverrideController)(typeof(AnimatorOverrideController).IsInstanceOfType(((Character)__instance).m_zanim.m_animator.runtimeAnimatorController) ? ((object)/*isinst with value type is only supported in some contexts*/) : ((object)new AnimatorOverrideController(((Character)__instance).m_zanim.m_animator.runtimeAnimatorController)));
					if ((Object)(object)originalBlock == (Object)null)
					{
						originalBlock = val["Block idle"];
					}
					val["Block idle"] = val["Sword And Shield Idle"];
					((Character)__instance).m_zanim.m_animator.runtimeAnimatorController = (RuntimeAnimatorController)(object)val;
					return false;
				}
				__instance.SetAnimationState((AnimationState)0);
				return false;
			}
			if (typeof(AnimatorOverrideController).IsInstanceOfType(((Character)__instance).m_zanim.m_animator.runtimeAnimatorController) && (Object)(object)originalBlock != (Object)null)
			{
				RuntimeAnimatorController runtimeAnimatorController = ((Character)__instance).m_zanim.m_animator.runtimeAnimatorController;
				((AnimatorOverrideController)((runtimeAnimatorController is AnimatorOverrideController) ? runtimeAnimatorController : null))["Block idle"] = originalBlock;
			}
			return true;
		}

		[HarmonyPatch("BlockAttack")]
		[HarmonyPrefix]
		private static void ReplaceBlockEffect(ref Humanoid __instance)
		{
			if (originalBlockEffects == null && __instance.GetCurrentBlocker() != null && __instance.m_visEquipment.m_leftItem.Equals("ShieldJardGauntlets"))
			{
				originalBlockEffects = __instance.GetCurrentBlocker().m_shared.m_blockEffect;
				if (gauntletBlockEffects == null)
				{
					gauntletBlockEffects = JardsAdditions.gauntlets.ItemPrefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_blockEffect;
				}
				__instance.GetCurrentBlocker().m_shared.m_blockEffect = gauntletBlockEffects;
			}
		}

		[HarmonyPatch("BlockAttack")]
		[HarmonyPostfix]
		private static void RestoreBlockEffect(ref Humanoid __instance)
		{
			if (originalBlockEffects != null && __instance.GetCurrentBlocker() != null)
			{
				__instance.GetCurrentBlocker().m_shared.m_blockEffect = originalBlockEffects;
				originalBlockEffects = null;
			}
		}
	}
}
namespace JardsAdditions.Grill
{
	[HarmonyPatch(typeof(CookingStation))]
	internal class GrillPatches_CookingStation
	{
		[HarmonyPatch("OnUseItem")]
		[HarmonyPrefix]
		private static bool OverrideOnUseItem(ref CookingStation __instance, ref bool __result, Humanoid user, ItemData item)
		{
			if (((Object)((Component)__instance).gameObject).name.StartsWith("FlametalGrill") && __instance.m_requireFire && __instance.IsFireLit())
			{
				if (GetSlotForGrill(__instance, ((Object)item.m_dropPrefab).name) == -1)
				{
					((Character)user).Message((MessageType)2, "$msg_nocookroom", 0, (Sprite)null);
					__result = false;
					return false;
				}
				__result = __instance.CookItem(user, item);
				return false;
			}
			return true;
		}

		[HarmonyPatch("CookItem")]
		[HarmonyPrefix]
		private static bool OverrideLocalCookItem(ref CookingStation __instance, ref bool __result, Humanoid user, ItemData item)
		{
			if (((Object)((Component)__instance).gameObject).name.StartsWith("FlametalGrill"))
			{
				string name = ((Object)item.m_dropPrefab).name;
				if (!__instance.m_nview.HasOwner())
				{
					__instance.m_nview.ClaimOwnership();
				}
				foreach (ItemMessage incompatibleItem in __instance.m_incompatibleItems)
				{
					if (incompatibleItem.m_item.m_itemData.m_shared.m_name == item.m_shared.m_name)
					{
						((Character)user).Message((MessageType)2, incompatibleItem.m_message + " " + incompatibleItem.m_item.m_itemData.m_shared.m_name, 0, (Sprite)null);
						__result = false;
						return false;
					}
				}
				if (!__instance.IsItemAllowed(item))
				{
					__result = false;
					return false;
				}
				if (GetSlotForGrill(__instance, name) == -1)
				{
					__result = false;
					return false;
				}
				user.GetInventory().RemoveOneItem(item);
				__instance.m_nview.InvokeRPC("RPC_AddItem", new object[1] { name });
				__result = true;
				return false;
			}
			return true;
		}

		[HarmonyPatch("RPC_AddItem")]
		[HarmonyPrefix]
		private static bool OverrideNetworkAddItem(ref CookingStation __instance, long sender, string itemName)
		{
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			if (((Object)__instance).name.StartsWith("FlametalGrill"))
			{
				if (__instance.IsItemAllowed(itemName))
				{
					int slotForGrill = GetSlotForGrill(__instance, itemName);
					if (slotForGrill != -1)
					{
						__instance.SetSlot(slotForGrill, itemName, 0f, (Status)0);
						__instance.m_nview.InvokeRPC(ZNetView.Everybody, "RPC_SetSlotVisual", new object[2] { slotForGrill, itemName });
						__instance.m_addEffect.Create(__instance.m_slots[slotForGrill].position, Quaternion.identity, (Transform)null, 1f, -1);
					}
				}
				return false;
			}
			return true;
		}

		[HarmonyPatch("FindCookableItem")]
		[HarmonyPrefix]
		private static bool FindSuitableItem(ref CookingStation __instance, ref ItemData __result, Inventory inventory)
		{
			if (((Object)__instance).name.StartsWith("FlametalGrill"))
			{
				foreach (ItemConversion item2 in __instance.m_conversion)
				{
					ItemData item = inventory.GetItem(item2.m_from.m_itemData.m_shared.m_name, -1, false);
					if (item != null && GetSlotForGrill(__instance, ((Object)item.m_dropPrefab).name) != -1)
					{
						__result = item;
						return false;
					}
				}
				__result = null;
				return false;
			}
			return true;
		}

		private static int GetSlotForGrill(CookingStation station, string item)
		{
			if (!((Object)((Component)station).gameObject).name.StartsWith("FlametalGrill"))
			{
				return -1;
			}
			if (item.Equals("BugMeat") || item.Equals("BoneMawSerpentMeat") || item.Equals("SerpentMeat") || item.Equals("VoltureMeat"))
			{
				for (int i = 8; i < station.m_slots.Length; i++)
				{
					if (station.m_nview.GetZDO().GetString("slot" + i, "") == "")
					{
						return i;
					}
				}
				return -1;
			}
			return station.GetFreeSlot();
		}
	}
	[HarmonyPatch(typeof(CraftingStation))]
	internal class GrillPatches_CraftingStation
	{
		[HarmonyPatch("GetHoverText")]
		[HarmonyPrefix]
		private static bool ReplaceHoverText(ref CraftingStation __instance, ref string __result)
		{
			if (((Object)__instance).name.StartsWith("FlametalGrill"))
			{
				__result = ((!__instance.InUseDistance((Humanoid)(object)Player.m_localPlayer)) ? Localization.instance.Localize("<color=#888888>$piece_toofar</color>") : Localization.instance.Localize("$piece_cookingstation_flametal\n[<color=yellow><b>$KEY_Use</b></color>] $piece_use "));
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(InventoryGui))]
	internal class GrillPatches_InventoryGui
	{
		[HarmonyPatch("UpdateRecipe")]
		[HarmonyPostfix]
		private static void ReplaceGuiName(ref InventoryGui __instance, Player player, float dt)
		{
			if (Object.op_Implicit((Object)(object)player.GetCurrentCraftingStation()) && ((Object)player.GetCurrentCraftingStation()).name.StartsWith("FlametalGrill"))
			{
				__instance.m_craftingStationName.text = Localization.instance.Localize("$piece_cookingstation_flametal");
			}
		}
	}
	[HarmonyPatch(typeof(Character))]
	internal class GrillBurnsCharacters
	{
		[HarmonyPatch("CustomFixedUpdate")]
		[HarmonyPrefix]
		private static void BurnTheCreature(ref Character __instance, float dt)
		{
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.m_nview.IsValid() && __instance.m_nview.GetZDO().IsOwner())
			{
				if (__instance.IsOnGround() && (Object)(object)__instance.m_lastGroundCollider != (Object)null && (Object)(object)((Component)__instance.m_lastGroundCollider).transform.parent != (Object)null && ((Object)__instance.m_lastGroundCollider).name.Contains("Blocker_hot") && ((Object)((Component)((Component)__instance.m_lastGroundCollider).transform.parent).gameObject).name.StartsWith("FlametalGrill") && ((Component)((Component)__instance.m_lastGroundCollider).transform.parent).gameObject.GetComponent<CookingStation>().IsFireLit())
				{
					Character obj = __instance;
					obj.m_lavaHeatLevel += 0.1f * dt * __instance.m_heatBuildupBase * (1f - __instance.GetEquipmentHeatResistanceModifier());
				}
				else if (!WorldGenerator.IsAshlands(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.z))
				{
					Character obj2 = __instance;
					obj2.m_lavaHeatLevel -= dt * __instance.m_heatCooldownBase;
				}
				__instance.m_lavaHeatLevel = Mathf.Clamp(__instance.m_lavaHeatLevel, 0f, 1f);
			}
		}
	}
}