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