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"));
}
}
}
}
}
}