Decompiled source of ExtendedCraftingRange v1.0.2

TTC.ExtendedCraftingRange.dll

Decompiled 5 days 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 BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ExtendedCraftingRadius")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ExtendedCraftingRadius")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("3f73b5c1-0470-4c09-9fb3-1f4d16f13398")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
[BepInPlugin("TTC.ExtendedCraftingRange", "TTC Extended Crafting Range", "1.0.0")]
public class ExtendedCraftingRange : BaseUnityPlugin
{
	[HarmonyPatch(typeof(CraftingStation), "Start")]
	public static class Patch_CraftingStationStart
	{
		private static void Postfix(CraftingStation __instance)
		{
			if (__instance.m_name == "$piece_workbench")
			{
				if (!originalWorkbenchBuild.ContainsKey(__instance))
				{
					originalWorkbenchBuild[__instance] = __instance.m_rangeBuild;
				}
				if (!originalWorkbenchDiscover.ContainsKey(__instance))
				{
					originalWorkbenchDiscover[__instance] = __instance.m_discoverRange;
				}
				__instance.m_rangeBuild = originalWorkbenchBuild[__instance];
				__instance.m_discoverRange = originalWorkbenchDiscover[__instance] * workbenchDiscoverRangeMultiplier.Value;
			}
		}
	}

	[HarmonyPatch(typeof(CraftingStation), "GetStationBuildRange")]
	public static class Patch_GetStationBuildRange
	{
		private static void Postfix(CraftingStation __instance, ref float __result)
		{
			if (__instance.m_name == "$piece_workbench")
			{
				__result *= workbenchRangeMultiplier.Value;
			}
			else if (__instance.m_name == "$piece_stonecutter")
			{
				__result *= stonecutterRangeMultiplier.Value;
			}
			else if (__instance.m_name == "$piece_forge")
			{
				__result *= forgeRangeMultiplier.Value;
			}
			else if (__instance.m_name == "$piece_artisanstation")
			{
				__result *= artisanTableRangeMultiplier.Value;
			}
			else if (__instance.m_name == "$piece_blackforge")
			{
				__result *= blackForgeRangeMultiplier.Value;
			}
		}
	}

	[HarmonyPatch(typeof(CraftingStation), "CheckUsable")]
	public static class Patch_DisableRoofRequirement
	{
		private static void Prefix(CraftingStation __instance)
		{
			if ((__instance.m_name == "$piece_workbench" && !workbenchRoofRequirement.Value) || (__instance.m_name == "$piece_stonecutter" && !stonecutterRoofRequirement.Value) || (__instance.m_name == "$piece_forge" && !forgeRoofRequirement.Value) || (__instance.m_name == "$piece_artisanstation" && !artisanTableRoofRequirement.Value) || (__instance.m_name == "$piece_blackforge" && !blackForgeRoofRequirement.Value))
			{
				__instance.m_craftRequireRoof = false;
			}
		}
	}

	[HarmonyPatch(typeof(CraftingStation), "UpdateKnownStationsInRange")]
	public static class Patch_UpdateKnownStationsInRange
	{
		private static void Postfix(Player player)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = ((Component)player).transform.position;
			List<CraftingStation> list = new List<CraftingStation>();
			CraftingStation.FindStationsInRange("$piece_workbench", position, 999f, list);
			CraftingStation.FindStationsInRange("$piece_stonecutter", position, 999f, list);
			CraftingStation.FindStationsInRange("$piece_forge", position, 999f, list);
			CraftingStation.FindStationsInRange("$piece_artisanstation", position, 999f, list);
			CraftingStation.FindStationsInRange("$piece_blackforge", position, 999f, list);
			foreach (CraftingStation item in list)
			{
				if (Object.op_Implicit((Object)(object)item.m_areaMarker))
				{
					CircleProjector component = item.m_areaMarker.GetComponent<CircleProjector>();
					if (Object.op_Implicit((Object)(object)component))
					{
						component.m_radius = item.GetStationBuildRange();
					}
				}
			}
		}
	}

	[HarmonyPatch(typeof(CraftingStation), "ShowAreaMarker")]
	public static class Patch_ShowAreaMarker
	{
		private static void Prefix(CraftingStation __instance)
		{
			if (Object.op_Implicit((Object)(object)__instance.m_areaMarker))
			{
				CircleProjector component = __instance.m_areaMarker.GetComponent<CircleProjector>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.m_radius = __instance.GetStationBuildRange();
				}
			}
		}
	}

	private static ConfigEntry<float> workbenchRangeMultiplier;

	private static ConfigEntry<float> workbenchDiscoverRangeMultiplier;

	private static ConfigEntry<float> stonecutterRangeMultiplier;

	private static ConfigEntry<float> forgeRangeMultiplier;

	private static ConfigEntry<float> artisanTableRangeMultiplier;

	private static ConfigEntry<float> blackForgeRangeMultiplier;

	private static ConfigEntry<bool> workbenchRoofRequirement;

	private static ConfigEntry<bool> stonecutterRoofRequirement;

	private static ConfigEntry<bool> forgeRoofRequirement;

	private static ConfigEntry<bool> artisanTableRoofRequirement;

	private static ConfigEntry<bool> blackForgeRoofRequirement;

	private static Dictionary<CraftingStation, float> originalWorkbenchBuild;

	private static Dictionary<CraftingStation, float> originalWorkbenchDiscover;

	private void Awake()
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Expected O, but got Unknown
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Expected O, but got Unknown
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Expected O, but got Unknown
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Expected O, but got Unknown
		//IL_0122: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Expected O, but got Unknown
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0169: Expected O, but got Unknown
		//IL_0305: Unknown result type (might be due to invalid IL or missing references)
		workbenchRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Workbench Settings", "Build Range Multiplier", 2f, new ConfigDescription("Multiplier for workbench build radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		workbenchDiscoverRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Workbench Settings", "Spawnblock Range Multiplier", 2f, new ConfigDescription("Multiplier for the spawn blocking radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		stonecutterRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Stonecutter Settings", "Build Range Multiplier", 2f, new ConfigDescription("Multiplier for stonecutter build radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		forgeRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Forge Settings", "Build Range Multiplier", 2f, new ConfigDescription("Multiplier for forge build radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		artisanTableRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Artisan Table Settings", "Build Range Multiplier", 2f, new ConfigDescription("Multiplier for artisan table build radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		blackForgeRangeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Black Forge Settings", "Build Range Multiplier", 2f, new ConfigDescription("Multiplier for black forge build radius (1x - 5x)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 5f), Array.Empty<object>()));
		workbenchRoofRequirement = ((BaseUnityPlugin)this).Config.Bind<bool>("Workbench Settings", "Roof Requirement", false, "Disable to allow the workbench to function without a roof");
		stonecutterRoofRequirement = ((BaseUnityPlugin)this).Config.Bind<bool>("Stonecutter Settings", "Roof Requirement", false, "Disable to allow the stonecutter to function without a roof");
		forgeRoofRequirement = ((BaseUnityPlugin)this).Config.Bind<bool>("Forge Settings", "Roof Requirement", false, "Disable to allow the forge to function without a roof");
		artisanTableRoofRequirement = ((BaseUnityPlugin)this).Config.Bind<bool>("Artisan Table Settings", "Roof Requirement", false, "Disable to allow the artisan table to function without a roof");
		blackForgeRoofRequirement = ((BaseUnityPlugin)this).Config.Bind<bool>("Black Forge Settings", "Roof Requirement", false, "Disable to allow the black forge to function without a roof");
		workbenchRangeMultiplier.SettingChanged += OnConfigChanged;
		workbenchDiscoverRangeMultiplier.SettingChanged += OnConfigChanged;
		stonecutterRangeMultiplier.SettingChanged += OnConfigChanged;
		forgeRangeMultiplier.SettingChanged += OnConfigChanged;
		artisanTableRangeMultiplier.SettingChanged += OnConfigChanged;
		blackForgeRangeMultiplier.SettingChanged += OnConfigChanged;
		workbenchRoofRequirement.SettingChanged += OnConfigChanged;
		stonecutterRoofRequirement.SettingChanged += OnConfigChanged;
		forgeRoofRequirement.SettingChanged += OnConfigChanged;
		artisanTableRoofRequirement.SettingChanged += OnConfigChanged;
		blackForgeRoofRequirement.SettingChanged += OnConfigChanged;
		new Harmony("TTC.ExtendedCraftingRange").PatchAll();
	}

	private void OnConfigChanged(object sender, EventArgs e)
	{
		UpdateAllStations();
	}

	private void UpdateAllStations()
	{
		foreach (IMonoUpdater instance in CraftingStation.Instances)
		{
			CraftingStation val = (CraftingStation)(object)((instance is CraftingStation) ? instance : null);
			if ((Object)(object)val == (Object)null)
			{
				continue;
			}
			if (val.m_name == "$piece_workbench")
			{
				if (originalWorkbenchBuild.TryGetValue(val, out var value))
				{
					val.m_rangeBuild = value * workbenchRangeMultiplier.Value;
				}
				if (originalWorkbenchDiscover.TryGetValue(val, out var value2))
				{
					val.m_discoverRange = value2 * workbenchDiscoverRangeMultiplier.Value;
				}
			}
			if (Object.op_Implicit((Object)(object)val.m_areaMarker))
			{
				CircleProjector component = val.m_areaMarker.GetComponent<CircleProjector>();
				if (Object.op_Implicit((Object)(object)component))
				{
					component.m_radius = val.GetStationBuildRange();
				}
			}
		}
	}

	static ExtendedCraftingRange()
	{
		originalWorkbenchBuild = new Dictionary<CraftingStation, float>();
		originalWorkbenchDiscover = new Dictionary<CraftingStation, float>();
	}
}