Decompiled source of Wubarrk Wonderland v1.9.7

WubarrkWonderland.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ServerSync;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("WubarrkWonderland")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.9.5.0")]
[assembly: AssemblyInformationalVersion("1.9.5")]
[assembly: AssemblyProduct("WubarrkWonderland")]
[assembly: AssemblyTitle("WubarrkWonderland")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.9.5.0")]
[module: UnverifiableCode]
[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 WubarrkWonderland
{
	[BepInPlugin("com.wubarrk.wonderland", "Wubarrk.Wonderland", "1.9.5")]
	public class WubarrkWonderlandPlugin : BaseUnityPlugin
	{
		private readonly Harmony harmony = new Harmony("com.wubarrk.wonderland");

		private static readonly ConfigSync configSync = new ConfigSync("com.wubarrk.wonderland")
		{
			DisplayName = "Wubarrk Wonderland",
			CurrentVersion = "1.9.5"
		};

		public static ConfigEntry<int> ConfServerLock;

		public static ConfigEntry<float> ConfBoatSpeedMult;

		public static ConfigEntry<float> ConfCraftRadius;

		public static ConfigEntry<float> ConfPlantSpeed;

		public static ConfigEntry<float> ConfStamRegenMult;

		public static ConfigEntry<float> ConfVacuumRadius;

		public static ConfigEntry<float> ConfVacuumInterval;

		public static ConfigEntry<bool> ConfInstantLoot;

		public static ConfigEntry<bool> ConfInfiniteSwim;

		public static ConfigEntry<bool> ConfInfiniteFuel;

		public static ConfigEntry<bool> ConfCraftFromChests;

		private float vTimer;

		private void Awake()
		{
			SetupConfig();
			harmony.PatchAll();
		}

		private void SetupConfig()
		{
			ConfInstantLoot = BindSync<bool>("1. Combat", "Instant Harvest", val: true, "Loot drops instantly.");
			ConfInfiniteSwim = BindSync<bool>("2. Stats", "Infinite Swim", val: true, "No stamina drain in water.");
			ConfStamRegenMult = BindSync<float>("2. Stats", "Stamina Regen Multiplier", 2f, "Recovery speed.");
			ConfBoatSpeedMult = BindSync<float>("3. World", "Boat Speed Factor", 2f, "Ship force multiplier.");
			ConfCraftFromChests = BindSync<bool>("4. Logistics", "Direct Crafting", val: true, "Craft from nearby chests.");
			ConfCraftRadius = BindSync<float>("4. Logistics", "Crafting Radius", 25f, "Search radius.");
			ConfVacuumRadius = BindSync<float>("4. Logistics", "Vacuum Radius", 20f, "Item pull distance.");
			ConfVacuumInterval = BindSync<float>("4. Logistics", "Vacuum Pulse", 5f, "Seconds per scan.");
			ConfInfiniteFuel = BindSync<bool>("4. Logistics", "Infinite Energy", val: true, "No fuel needed.");
			ConfPlantSpeed = BindSync<float>("5. Farming", "Omni-Growth Multiplier", 2f, "Growth speed.");
			ConfigEntry<T> BindSync<T>(string sec, string name, T val, string desc)
			{
				ConfigEntry<T> val2 = ((BaseUnityPlugin)this).Config.Bind<T>(sec, name, val, desc);
				((OwnConfigEntryBase)configSync.AddConfigEntry<T>(val2)).SynchronizedConfig = true;
				return val2;
			}
		}

		[HarmonyPatch(typeof(Character), "OnDeath")]
		[HarmonyPrefix]
		private static void InstantHarvest(Character __instance)
		{
			if (ConfInstantLoot.Value && !__instance.IsPlayer())
			{
				CharacterDrop component = ((Component)__instance).GetComponent<CharacterDrop>();
				if ((Object)(object)component != (Object)null)
				{
					Traverse.Create((object)component).Method("GenerateDrop", Array.Empty<object>()).GetValue();
					Traverse.Create((object)component).Field("m_dropsEnabled").SetValue((object)false);
				}
			}
		}

		[HarmonyPatch(typeof(Player), "UseStamina")]
		[HarmonyPrefix]
		private static bool SwimMaster(Player __instance)
		{
			if (ConfInfiniteSwim.Value)
			{
				return !((Character)__instance).IsSwimming();
			}
			return true;
		}

		[HarmonyPatch(typeof(Ship), "FixedUpdate")]
		[HarmonyPostfix]
		private static void ShipSpeed(Ship __instance)
		{
			if (__instance.IsPlayerInBoat(Player.m_localPlayer))
			{
				Traverse.Create((object)__instance).Field("m_forceMultiplier").SetValue((object)ConfBoatSpeedMult.Value);
			}
		}

		[HarmonyPatch(typeof(Fireplace), "IsBurning")]
		[HarmonyPrefix]
		private static bool InfFire(ref bool __res)
		{
			if (ConfInfiniteFuel.Value)
			{
				__res = true;
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(Plant), "UpdateHealth")]
		[HarmonyPrefix]
		private static void FastGrowth(ref float dt)
		{
			dt *= ConfPlantSpeed.Value;
		}

		private void Update()
		{
			if (!((Object)(object)Player.m_localPlayer == (Object)null))
			{
				vTimer += Time.deltaTime;
				if (vTimer >= ConfVacuumInterval.Value)
				{
					vTimer = 0f;
					PerformVacuum();
				}
			}
		}

		private void PerformVacuum()
		{
			List<ItemDrop> list = AccessTools.StaticFieldRefAccess<List<ItemDrop>>(typeof(ItemDrop), "m_instances");
			List<Container> list2 = AccessTools.StaticFieldRefAccess<List<Container>>(typeof(Container), "m_allContainers");
			if (list == null || list2 == null)
			{
				return;
			}
			List<ItemDrop> list3 = list.Where((ItemDrop i) => Vector3.Distance(((Component)i).transform.position, ((Component)Player.m_localPlayer).transform.position) <= ConfVacuumRadius.Value).ToList();
			IEnumerable<Container> enumerable = list2.Where((Container c) => Vector3.Distance(((Component)c).transform.position, ((Component)Player.m_localPlayer).transform.position) <= ConfVacuumRadius.Value);
			foreach (ItemDrop item in list3)
			{
				foreach (Container item2 in enumerable)
				{
					if (item2.GetInventory().HaveItem(item.m_itemData.m_shared.m_name, true) && item2.GetInventory().AddItem(item.m_itemData))
					{
						ZNetScene.instance.Destroy(((Component)item).gameObject);
						break;
					}
				}
			}
		}
	}
}