Decompiled source of JanooBalance v1.0.5

JanooBalance.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
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("JanooBalance")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("JanooBalance")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("987DE4A8-C340-4AE7-80A7-B27AC864F76B")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace JanooBalance
{
	public class CraftingRange : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static class Workbench_Patch
		{
			[Serializable]
			private struct CraftingStationRange
			{
				public float RangeBuild;

				public float DiscoverRange;

				public float ProjectionRadius;
			}

			private static readonly Dictionary<CraftingStation, CraftingStationRange> _originalCraftingStationRanges = new Dictionary<CraftingStation, CraftingStationRange>();

			private static void Prefix(ref ObjectDB __instance)
			{
				if (_originalCraftingStationRanges.Count == 0)
				{
					GetOriginalValues();
				}
				if (Main.configCraftingRangeMulti == null)
				{
					Main.logger.LogError((object)"configCraftingRangeMulti is null, cannot subscribe to setting changes.");
					return;
				}
				Main.configCraftingRangeMulti.SettingChanged -= OnRangeSettingChanged;
				Main.configCraftingRangeMulti.SettingChanged += OnRangeSettingChanged;
			}

			private static void Postfix(ref ObjectDB __instance)
			{
				UpdateStations();
			}

			private static void GetOriginalValues()
			{
				_originalCraftingStationRanges.Clear();
				CraftingStation[] array = Resources.FindObjectsOfTypeAll<CraftingStation>();
				CraftingStation[] array2 = array;
				foreach (CraftingStation val in array2)
				{
					CircleProjector componentInChildren = ((Component)val).GetComponentInChildren<CircleProjector>();
					_originalCraftingStationRanges.Add(val, new CraftingStationRange
					{
						RangeBuild = val.m_rangeBuild,
						DiscoverRange = val.m_discoverRange,
						ProjectionRadius = (Object.op_Implicit((Object)(object)componentInChildren) ? componentInChildren.m_radius : 0f)
					});
				}
			}

			private static void OnRangeSettingChanged(object sender, EventArgs args)
			{
				Main.logger.LogInfo((object)"Crafting range setting changed, updating stations.");
				UpdateStations();
			}

			private static void UpdateStations()
			{
				float multiplier = Main.configCraftingRangeMulti.Value;
				CraftingStation[] array = Resources.FindObjectsOfTypeAll<CraftingStation>();
				CraftingStation[] array2 = array;
				foreach (CraftingStation craftingStation2 in array2)
				{
					UpdateStation(craftingStation2);
				}
				CraftingStation[] array3 = Object.FindObjectsByType<CraftingStation>((FindObjectsInactive)1, (FindObjectsSortMode)0);
				CraftingStation[] array4 = array3;
				foreach (CraftingStation craftingStation3 in array4)
				{
					UpdateStation(craftingStation3);
				}
				void UpdateStation(CraftingStation craftingStation)
				{
					if (_originalCraftingStationRanges.TryGetValue(craftingStation, out var value))
					{
						craftingStation.m_rangeBuild = value.RangeBuild * multiplier;
						craftingStation.m_discoverRange = value.DiscoverRange * multiplier;
						CircleProjector componentInChildren = ((Component)craftingStation).GetComponentInChildren<CircleProjector>();
						if (Object.op_Implicit((Object)(object)componentInChildren))
						{
							componentInChildren.m_radius = value.ProjectionRadius * multiplier;
						}
					}
				}
			}
		}
	}
	[BepInPlugin("com.Janooba.JanooBalance", "JanooBalance", "1.0.4")]
	public class Main : BaseUnityPlugin
	{
		public const string pluginGUID = "com.Janooba.JanooBalance";

		public const string pluginName = "JanooBalance";

		public const string pluginVersion = "1.0.4";

		private readonly Harmony _harmony = new Harmony("com.Janooba.JanooBalance");

		public static ManualLogSource logger = Logger.CreateLogSource("JanooBalance");

		private static string ConfigFileName = "com.Janooba.JanooBalance.cfg";

		private static string ConfigFileFullPath;

		public static ConfigEntry<float> configRestedMinutes;

		public static ConfigEntry<float> configStaminaRegen;

		public static ConfigEntry<float> configDeathsquitoDamage;

		public static ConfigEntry<int> configMudpileDropMin;

		public static ConfigEntry<int> configMudpileDropMax;

		public static ConfigEntry<float> configMudpileDropChance;

		public static ConfigEntry<float> configCraftingRangeMulti;

		public static ConfigEntry<int> configStoneWall_4x2;

		public static ConfigEntry<int> configStoneWall_2x1;

		public static ConfigEntry<int> configStoneWall_1x1;

		public static ConfigEntry<int> configStoneFloor_2x2;

		public static ConfigEntry<int> configStoneArch;

		public static ConfigEntry<int> configStonePillar;

		public static ConfigEntry<int> configStoneStair;

		public static ConfigEntry<int> configBronzeOutput;

		public static ConfigEntry<int> configBronze5Output;

		public static ConfigEntry<float> configBoarTameTime;

		public static ConfigEntry<float> configWolfTameTime;

		public static ConfigEntry<float> configLoxTameTime;

		private void Awake()
		{
			logger.LogWarning((object)"Binding Configs for JanooBalance...");
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = false;
			BindConfig();
			((BaseUnityPlugin)this).Config.Save();
			((BaseUnityPlugin)this).Config.SaveOnConfigSet = true;
			SetupWatcher();
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
		}

		private void SetupWatcher()
		{
			FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher.Changed += ReadConfigValues;
			fileSystemWatcher.Created += ReadConfigValues;
			fileSystemWatcher.Renamed += ReadConfigValues;
			fileSystemWatcher.IncludeSubdirectories = true;
			fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher.EnableRaisingEvents = true;
		}

		private void ReadConfigValues(object sender, FileSystemEventArgs e)
		{
			if (!File.Exists(ConfigFileFullPath))
			{
				return;
			}
			try
			{
				logger.LogDebug((object)"Attempting to reload configuration...");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				logger.LogError((object)("There was an issue loading " + ConfigFileName));
			}
		}

		private void BindConfig()
		{
			configRestedMinutes = ((BaseUnityPlugin)this).Config.Bind<float>("Player", "RestedMinutes", 5f, "How many minutes each level of rested provides. Vanilla is 1");
			configStaminaRegen = ((BaseUnityPlugin)this).Config.Bind<float>("Player", "StaminaRegen", 14f, "How fast to regenerate stamina. Vanilla is 5");
			configDeathsquitoDamage = ((BaseUnityPlugin)this).Config.Bind<float>("Enemy", "DeathsquitoDamage", 60f, "How much pierce damage a deathsquito attack deals. Vanilla is 90");
			configMudpileDropMin = ((BaseUnityPlugin)this).Config.Bind<int>("Drops", "MudPileDropMin", 1, "Minimum dropped items. Vanilla is 1");
			configMudpileDropMax = ((BaseUnityPlugin)this).Config.Bind<int>("Drops", "MudPileDropMax", 2, "Maximum dropped items. Vanilla is 1");
			configMudpileDropChance = ((BaseUnityPlugin)this).Config.Bind<float>("Drops", "MudPileDropChance", 1f, "Item drop chance, 0 to 1. Vanilla is 0.5");
			configStoneWall_4x2 = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneWall4x2", 8, "The cost of the StoneWall4x2 piece. Vanilla is 6.");
			configStoneWall_2x1 = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneWall2x1", 2, "The cost of the StoneWall2x1 piece. Vanilla is 6.");
			configStoneWall_1x1 = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneWall1x1", 1, "The cost of the StoneWall1x1 piece. Vanilla is 3.");
			configStoneFloor_2x2 = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneFloor2x2", 4, "The cost of the StoneFloor2x2 piece. Vanilla is 6.");
			configStoneArch = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneArch", 2, "The cost of the StoneArch piece. Vanilla is 4.");
			configStonePillar = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StonePillar", 2, "The cost of the StonePillar piece. Vanilla is 5.");
			configStoneStair = ((BaseUnityPlugin)this).Config.Bind<int>("Stone Costs", "StoneStair", 4, "The cost of the StoneStair piece. Vanilla is 8.");
			configCraftingRangeMulti = ((BaseUnityPlugin)this).Config.Bind<float>("Stations", "CraftingRangeMultiplier", 3f, "Value to multiply the crafting station range by.");
			configBronzeOutput = ((BaseUnityPlugin)this).Config.Bind<int>("Bronze Output", "BronzeOutput", 2, "The amount of bronze a single craft results in. Vanilla is 1");
			configBronze5Output = ((BaseUnityPlugin)this).Config.Bind<int>("Bronze Output", "Bronze5Output", 10, "The amount of bronze the bulk craft results in. Vanilla is 5");
			configBoarTameTime = ((BaseUnityPlugin)this).Config.Bind<float>("Taming", "BoarTameTime", 30f, "The time to tame a boar, in minutes. Vanilla is 30");
			configWolfTameTime = ((BaseUnityPlugin)this).Config.Bind<float>("Taming", "WolfTameTime", 30f, "The time to tame a boar, in minutes. Vanilla is 30");
			configLoxTameTime = ((BaseUnityPlugin)this).Config.Bind<float>("Taming", "LoxTameTime", 30f, "The time to tame a boar, in minutes. Vanilla is 30");
		}

		static Main()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
		}
	}
	public class Patch : BaseUnityPlugin
	{
		[HarmonyPatch(typeof(SE_Rested), "UpdateTTL")]
		public static class Rested_Patch
		{
			private static void Prefix(ref float ___m_TTLPerComfortLevel)
			{
				___m_TTLPerComfortLevel = 60f * Main.configRestedMinutes.Value;
			}
		}

		[HarmonyPatch(typeof(Player), "UpdateStats", new Type[] { typeof(float) })]
		public static class StaminaRegen_Patch
		{
			private static void Prefix(ref float ___m_staminaRegen)
			{
				___m_staminaRegen = Main.configStaminaRegen.Value;
			}
		}

		[HarmonyPatch(typeof(ObjectDB), "Awake")]
		public static class Resources_Patch
		{
			private static void Postfix(ref ObjectDB __instance)
			{
				Main.logger.LogInfo((object)"Applying Deathsquito sting damage");
				ItemDrop[] array = Resources.FindObjectsOfTypeAll<ItemDrop>();
				ItemDrop[] array2 = array;
				foreach (ItemDrop val in array2)
				{
					if (val.m_itemData.IsWeapon() && ((Object)val).name == "Deathsquito_sting")
					{
						val.m_itemData.m_shared.m_damages.m_pierce = Main.configDeathsquitoDamage.Value;
					}
				}
				Main.logger.LogInfo((object)"Applying Mudpile drop changes");
				MineRock[] array3 = Resources.FindObjectsOfTypeAll<MineRock>();
				MineRock[] array4 = array3;
				foreach (MineRock val2 in array4)
				{
					if (((Object)val2).name == "mudpile_old")
					{
						val2.m_dropItems.m_dropMin = Main.configMudpileDropMin.Value;
						val2.m_dropItems.m_dropMax = Main.configMudpileDropMax.Value;
						val2.m_dropItems.m_dropChance = Main.configMudpileDropChance.Value;
					}
				}
				Main.logger.LogInfo((object)"Applying Stone piece costs");
				Piece[] array5 = Resources.FindObjectsOfTypeAll<Piece>();
				Piece[] array6 = array5;
				foreach (Piece val3 in array6)
				{
					if (val3.m_resources != null && val3.m_resources.Length != 0)
					{
						Requirement val4 = val3.m_resources[0];
						string name = ((Object)val3).name;
						if (1 == 0)
						{
						}
						int amount = name switch
						{
							"stone_wall_4x2" => Main.configStoneWall_4x2.Value, 
							"stone_wall_2x1" => Main.configStoneWall_2x1.Value, 
							"stone_wall_1x1" => Main.configStoneWall_1x1.Value, 
							"stone_floor_2x2" => Main.configStoneFloor_2x2.Value, 
							"stone_arch" => Main.configStoneArch.Value, 
							"stone_pillar" => Main.configStonePillar.Value, 
							"stone_stair" => Main.configStoneStair.Value, 
							_ => val3.m_resources[0].m_amount, 
						};
						if (1 == 0)
						{
						}
						val4.m_amount = amount;
					}
				}
				Main.logger.LogInfo((object)"Applying Bronze output changes");
				Recipe[] array7 = Resources.FindObjectsOfTypeAll<Recipe>();
				Recipe[] array8 = array7;
				foreach (Recipe val5 in array8)
				{
					Recipe val6 = val5;
					string name2 = ((Object)val5).name;
					if (1 == 0)
					{
					}
					int amount = ((name2 == "Bronze") ? Main.configBronzeOutput.Value : ((!(name2 == "Bronze5")) ? val5.m_amount : Main.configBronze5Output.Value));
					if (1 == 0)
					{
					}
					val6.m_amount = amount;
				}
				Main.logger.LogInfo((object)"Applying Tameable taming time changes");
				Tameable[] array9 = Resources.FindObjectsOfTypeAll<Tameable>();
				Tameable[] array10 = array9;
				foreach (Tameable val7 in array10)
				{
					Tameable val8 = val7;
					string name3 = ((Object)val7).name;
					if (1 == 0)
					{
					}
					float tamingTime = name3 switch
					{
						"Boar" => 60f * Main.configBoarTameTime.Value, 
						"Wolf" => 60f * Main.configWolfTameTime.Value, 
						"Lox" => 60f * Main.configLoxTameTime.Value, 
						_ => val7.m_tamingTime, 
					};
					if (1 == 0)
					{
					}
					val8.m_tamingTime = tamingTime;
				}
			}
		}
	}
	public class Raid : BaseUnityPlugin
	{
		public static class RaidDifficulty_Patch
		{
			private static void Prefix(ref List<RandomEvent> ___m_events)
			{
				foreach (RandomEvent ___m_event in ___m_events)
				{
					if (!___m_event.m_name.Contains("army_"))
					{
						continue;
					}
					Main.logger.LogWarning((object)("Applying Raid difficulty changes for event: " + ___m_event.m_name));
					foreach (SpawnData item in ___m_event.m_spawn)
					{
						Main.logger.LogInfo((object)("- Prefab Name: " + ((Object)item.m_prefab).name + "\n" + $"  - Group Size Min: {item.m_groupSizeMin}\n" + $"  - Group Size Max: {item.m_groupSizeMax}\n" + $"  - Spawn Interval: {item.m_spawnInterval}\n" + $"  - Max Spawned: {item.m_maxSpawned}\n"));
					}
				}
			}
		}
	}
}