Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of VBQOL v1.2.2
VBQOL.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using ServerSync; using Steamworks; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRules(11)] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<325e5d2a-1e76-4ea7-9145-f16cff94a4a8>Embedded] internal sealed class <325e5d2a-1e76-4ea7-9145-f16cff94a4a8>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [<325e5d2a-1e76-4ea7-9145-f16cff94a4a8>Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] [CompilerGenerated] internal sealed class <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRulesAttribute : Attribute { public readonly int Version; public <ec74b817-87f0-424a-8b7d-4dddd7805b72>RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace VBQOL { public class VB_WardPatch { [HarmonyPatch(typeof(Pickable), "Interact")] internal static class PickableInteract_Patch { private static bool Prefix(Pickable __instance, ref bool repeat) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(Pickable), "GetHoverText")] internal static class PickableHover_Patch { private static string Postfix(string __result, Pickable __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return __result; } } [HarmonyPatch(typeof(ItemDrop), "Interact")] internal static class ItemDropInteract_Patch { private static bool Prefix(ItemDrop __instance, ref bool repeat) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(ItemDrop), "GetHoverText")] internal static class ItemDropHover_Patch { private static string Postfix(string __result, ItemDrop __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return __result; } } [HarmonyPatch(typeof(Beehive), "Interact")] internal static class BeehiveInteract_Patch { private static bool Prefix(Beehive __instance, ref bool repeat) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(Beehive), "GetHoverText")] internal static class BeehiveHover_Patch { private static string Postfix(string __result, Beehive __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return __result; } } [HarmonyPatch(typeof(ShipControlls), "Interact")] internal static class ShipControllsInteract_Patch { private static bool Prefix(ShipControlls __instance, ref bool repeat) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(ShipControlls), "GetHoverText")] internal static class ShipControllsHover_Patch { private static string Postfix(string __result, ShipControlls __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return __result; } } [HarmonyPatch(typeof(Sign), "Interact")] internal static class SignInteract_Patch { private static bool Prefix(Sign __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(Sign), "GetHoverText")] internal static class SignHover_Patch { private static string Postfix(string __result, Sign __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return "\"" + __instance.GetText() + "\"\n" + Localization.instance.Localize(__instance.m_name + "\n[<color=#FFFF00><b>$KEY_Use</b></color>] $piece_use"); } } [HarmonyPatch(typeof(Container), "Interact")] internal static class ContainerInteract_Patch { private static bool Prefix(Container __instance, bool hold) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return false; } return true; } } [HarmonyPatch(typeof(Container), "GetHoverText")] internal static class ContainerHover_Patch { private static string Postfix(string __result, Container __instance) { if (PrivateArea.m_allAreas.Any((PrivateArea x) => x.IsEnabled() && x.IsInside(((Component)__instance).transform.position, 0f) && !PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, false, false))) { return Localization.instance.Localize(__instance.GetHoverName() + "\n$piece_noaccess"); } return __result; } } } public class VB_AshLandsFix { public static float maxTtl = 30f; [HarmonyPatch(typeof(SEMan), "Update")] [HarmonyPostfix] public static void PatchUpdate(SEMan __instance) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Invalid comparison between Unknown and I4 StatusEffect val = __instance.GetStatusEffects().Find((StatusEffect x) => ((Object)x).name == "Wet"); if (Object.op_Implicit((Object)(object)val) && (int)WorldGenerator.instance.GetBiome(((Component)__instance.m_character).transform.position) == 32 && val.m_ttl > maxTtl) { val.m_ttl -= maxTtl / 5f; } } } public class VB_CraftingStationLevelRange { [HarmonyPatch(typeof(CraftingStation), "UpdateKnownStationsInRange")] private static class UpdateKnownStationsInRange_Patch { private static void Postfix(Player player) { foreach (CraftingStation item in (List<CraftingStation>)AccessTools.Field(typeof(CraftingStation), "m_allStations").GetValue(null)) { if (item.m_name == "$piece_stonecutter") { ChangeChildStationRange(item); } } } } private static int stationAmountIncrease = 4; private static int stationDefaultRange = 20; private static double stationSearchRange = 50.0; public static (bool, CraftingStation) IsParentWorkbenchInRange(CraftingStation station, string workbenchType, float searchRange) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) CraftingStation val = CraftingStation.FindClosestStationInRange(workbenchType, ((Component)station).transform.position, searchRange); if ((Object)(object)val == (Object)null) { return (false, val); } Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(((Component)val).transform.position.x, ((Component)val).transform.position.z); Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor(((Component)station).transform.position.x, ((Component)station).transform.position.z); if (Vector2.Distance(val2, val3) <= val.m_rangeBuild) { return (true, val); } return (false, val); } public static void ChangeStationRange(CraftingStation station, float newRange) { if (station.m_rangeBuild != newRange) { CraftingStation component = ((Component)((Component)station).GetComponent<ZNetView>()).GetComponent<CraftingStation>(); component.m_rangeBuild = newRange; component.m_areaMarker.GetComponent<CircleProjector>().m_radius = newRange; component.m_areaMarker.GetComponent<CircleProjector>().m_nrOfSegments = (int)Math.Ceiling(Math.Max(5f, 4f * newRange)); VBQOL.Logger.LogInfo((object)$"{station.m_name} ({((Object)station).GetInstanceID()}) новый радиус {newRange} "); } } public static void ChangeChildStationRange(CraftingStation station) { var (flag, val) = IsParentWorkbenchInRange(station, "$piece_workbench", (float)stationSearchRange); if (!flag) { ChangeStationRange(station, stationDefaultRange); } if (flag && val.GetLevel(true) > 1) { float newRange = (float)stationDefaultRange + (float)stationAmountIncrease * (float)(val.GetLevel(true) - 1); ChangeStationRange(station, newRange); } else if (flag && val.GetLevel(true) == 1) { ChangeStationRange(station, stationDefaultRange); } } } public class VB_FramePerSecondPlus { [HarmonyPatch(typeof(ClutterSystem), "Awake")] private static class ClutterSystem_Awake_Patch { private static void Prefix(ClutterSystem __instance) { __instance.m_grassPatchSize = 15f; } } [HarmonyPatch(typeof(Smoke), "CustomUpdate")] private class SlowUpdaterFix { private static bool Prefix(Smoke __instance, float deltaTime) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) __instance.m_time += deltaTime; float num = 1f - Mathf.Clamp01(__instance.m_time / __instance.m_ttl); __instance.m_body.mass = num * num; Vector3 velocity = __instance.m_body.velocity; Vector3 val = __instance.m_vel - velocity; __instance.m_body.AddForce(val * __instance.m_force * deltaTime, (ForceMode)2); if (__instance.m_fadeTimer >= 0f) { __instance.m_fadeTimer += deltaTime; if (__instance.m_fadeTimer >= __instance.m_fadetime) { Object.Destroy((Object)(object)((Component)__instance).gameObject); } } if (__instance.m_time <= 1f || __instance.m_fadeTimer > 0f) { Color color = __instance.m_propertyBlock.GetColor(Smoke.m_colorProp); color.a = __instance.m_alpha; __instance.m_propertyBlock.SetColor(Smoke.m_colorProp, color); ((Renderer)__instance.m_mr).SetPropertyBlock(__instance.m_propertyBlock); } return false; } } } public class VB_AddAllFuel { [HarmonyPatch(typeof(Fireplace))] public static class FireplacePatch { [HarmonyPrefix] [HarmonyPatch("Interact")] public static bool FireplaceInteractPrefix(ref Fireplace __instance, Humanoid user, bool hold, bool alt, ref bool __result) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) bool flag = !Input.GetKey(AFModifierKeyConfig.Value); __result = false; if (hold) { return false; } if (!__instance.m_nview.HasOwner()) { __instance.m_nview.ClaimOwnership(); } string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; ZLog.Log((object)("Found fuel " + name)); float num = Mathf.CeilToInt(__instance.m_nview.GetZDO().GetFloat("fuel", 0f)); if (num > __instance.m_maxFuel - 1f) { ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_cantaddmore", new string[1] { name }), 0, (Sprite)null); return false; } ZLog.Log((object)("Checking Inventory for fuel " + name)); Inventory inventory = user.GetInventory(); ItemData val = ((inventory != null) ? inventory.GetItem(name, -1, false) : null); if (val == null) { if (flag) { return true; } ((Character)user).Message((MessageType)2, "$msg_outof " + name, 0, (Sprite)null); return false; } ((Character)user).Message((MessageType)2, Localization.instance.Localize("$msg_fireadding", new string[1] { name }), 0, (Sprite)null); int val2 = (int)(__instance.m_maxFuel - num); int num2 = 1; if (!flag) { num2 = Math.Min(val.m_stack, val2); } user.GetInventory().RemoveItem(val, num2); for (int i = 0; i < num2; i++) { __instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); } __result = true; return false; } [HarmonyPostfix] [HarmonyPatch(typeof(Fireplace), "GetHoverText")] public static string AddFuel_FirePlaceGetHoverText_Patch(string __result, Fireplace __instance) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) string text = __result; KeyCode value = AFModifierKeyConfig.Value; string text2 = ((object)(KeyCode)(ref value)).ToString(); string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString(); if ((Object)(object)__instance == (Object)null) { return text; } if (!__instance.IsBurning()) { return text; } if (__instance.m_wet) { return text; } return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value; } public static void RPC_AddFuelAmount(Fireplace instance, ZNetView m_nview, float count) { //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (m_nview.IsOwner()) { float @float = m_nview.GetZDO().GetFloat("fuel", 0f); float num = Mathf.Clamp(@float + count, 0f, instance.m_maxFuel); m_nview.GetZDO().Set("fuel", num); instance.m_fuelAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, (Transform)null, 1f, -1); ZLog.Log((object)$"Added fuel * {count}"); Traverse.Create((object)instance).Method("UpdateState", Array.Empty<object>()).GetValue(); } } } [HarmonyPatch(typeof(Smelter))] public static class SmelterPatch { [HarmonyPrefix] [HarmonyPatch("OnAddOre")] public static bool SmelterOnAddOrePrefix(ref Smelter __instance, ref Switch sw, ref Humanoid user, ItemData item, ref bool __result) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) bool flag = !Input.GetKey(AFModifierKeyConfig.Value); int value = Traverse.Create((object)__instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>(); if (value >= __instance.m_maxOre) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); return false; } if (item == null) { item = FindCookableItem(__instance, user.GetInventory(), flag); } if (item == null) { if (flag) { return true; } ((Character)user).Message((MessageType)2, "$msg_noprocessableitems", 0, (Sprite)null); return false; } if (!Traverse.Create((object)__instance).Method("IsItemAllowed", new object[1] { ((Object)item.m_dropPrefab).name }).GetValue<bool>()) { ((Character)user).Message((MessageType)2, "$msg_wontwork", 0, (Sprite)null); return false; } ((Character)user).Message((MessageType)2, "$msg_added " + item.m_shared.m_name, 0, (Sprite)null); int val = __instance.m_maxOre - value; int num = 1; if (!flag) { num = Math.Min(item.m_stack, val); } user.GetInventory().RemoveItem(item, num); for (int i = 0; i < num; i++) { __instance.m_nview.InvokeRPC("RPC_AddOre", new object[1] { ((Object)item.m_dropPrefab).name }); } __result = true; return false; } [HarmonyPrefix] [HarmonyPatch("OnAddFuel")] public static bool Prefix(ref Smelter __instance, ref bool __result, Switch sw, Humanoid user, ItemData item) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) bool flag = !Input.GetKey(AFModifierKeyConfig.Value); string name = __instance.m_fuelItem.m_itemData.m_shared.m_name; if (item != null && item.m_shared.m_name != name) { ((Character)user).Message((MessageType)2, "$msg_wrongitem", 0, (Sprite)null); return false; } float value = Traverse.Create((object)__instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>(); if (value > (float)(__instance.m_maxFuel - 1)) { ((Character)user).Message((MessageType)2, "$msg_itsfull", 0, (Sprite)null); return false; } item = user.GetInventory().GetItem(name, -1, false); if (item == null) { if (flag) { return true; } ((Character)user).Message((MessageType)2, "$msg_donthaveany " + name, 0, (Sprite)null); return false; } ((Character)user).Message((MessageType)2, "$msg_added " + name, 0, (Sprite)null); int val = (int)((float)__instance.m_maxFuel - value); int num = 1; if (!flag) { num = Math.Min(item.m_stack, val); } user.GetInventory().RemoveItem(item, num); for (int i = 0; i < num; i++) { __instance.m_nview.InvokeRPC("RPC_AddFuel", Array.Empty<object>()); } __result = true; return false; } [HarmonyPatch(typeof(Smelter), "OnHoverAddFuel")] [HarmonyPostfix] public static string AddFuel_OnHoverAddFuel_Patch(string __result, Smelter __instance) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) string text = __result; KeyCode value = AFModifierKeyConfig.Value; string text2 = ((object)(KeyCode)(ref value)).ToString(); string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString(); if ((Object)(object)__instance == (Object)null) { return text; } return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value; } [HarmonyPatch(typeof(Smelter), "OnHoverAddOre")] [HarmonyPostfix] public static string AddFuel_OnHoverAddOre_Patch(string __result, Smelter __instance) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) string text = __result; KeyCode value = AFModifierKeyConfig.Value; string text2 = ((object)(KeyCode)(ref value)).ToString(); string text3 = ((object)(KeyCode)(ref AFModifierKeyUseConfig)).ToString(); if ((Object)(object)__instance == (Object)null) { return text; } return text + "\n[<color=yellow><b>" + text2 + "+" + text3 + "</b></color>] " + AFTextConfig.Value; } public static void RPC_AddOre(Smelter instance, ZNetView m_nview, string name, int count) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) if (m_nview.IsOwner() && Traverse.Create((object)instance).Method("IsItemAllowed", new object[1] { name }).GetValue<bool>()) { int value = Traverse.Create((object)instance).Method("GetQueueSize", Array.Empty<object>()).GetValue<int>(); for (int i = 0; i < count; i++) { m_nview.GetZDO().Set($"item{value + i}", name); } m_nview.GetZDO().Set("queued", value + count); instance.m_oreAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, (Transform)null, 1f, -1); ZLog.Log((object)$"Added ore {name} * {count}"); } } public static void RPC_AddFuel(Smelter instance, ZNetView m_nview, float count) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (m_nview.IsOwner()) { float value = Traverse.Create((object)instance).Method("GetFuel", Array.Empty<object>()).GetValue<float>(); m_nview.GetZDO().Set("fuel", value + count); instance.m_fuelAddedEffects.Create(((Component)instance).transform.position, ((Component)instance).transform.rotation, ((Component)instance).transform, 1f, -1); ZLog.Log((object)$"Added fuel * {count}"); } } } public static ConfigEntry<KeyCode> AFModifierKeyConfig; public static KeyCode AFModifierKeyUseConfig = (KeyCode)101; public static ConfigEntry<string> AFTextConfig; public static ItemData FindCookableItem(Smelter __instance, Inventory inventory, bool isAddOne) { IEnumerable<string> enumerable = null; enumerable = __instance.m_conversion.Select((ItemConversion n) => n.m_from.m_itemData.m_shared.m_name); if (enumerable == null) { return null; } foreach (string item in enumerable) { ItemData val = ((inventory != null) ? inventory.GetItem(item, -1, false) : null); if (val != null) { return val; } } return null; } } [HarmonyPatch] public class VB_DayCycle { [HarmonyPatch(typeof(EnvMan), "Awake")] private static class EnvMan_Awake_Patch { public static void Postfix(ref long ___m_dayLengthSec) { vanillaDayLengthSec = ___m_dayLengthSec; ___m_dayLengthSec = (long)Mathf.Round((float)vanillaDayLengthSec / 0.5f); } } public static long vanillaDayLengthSec; } public class VB_Swampkey { [HarmonyPatch(typeof(Door), "Interact")] public static class SingleDoorPatch { private static void Postfix(Door __instance, ref bool __result, Humanoid character) { Player localPlayer = Player.m_localPlayer; if (!__result || !((Object)(object)character == (Object)(object)localPlayer)) { return; } ItemDrop keyItem = __instance.m_keyItem; if ((Object)(object)keyItem != (Object)null && keyItem.m_itemData.m_shared.m_name == "$item_cryptkey") { Inventory inventory = character.GetInventory(); if (inventory != null && inventory.ContainsItemByName("$item_cryptkey") && Random.value * 100f <= 33f) { inventory.RemoveItem("$item_cryptkey", 1, -1, true); ((Character)character).Message((MessageType)1, Localization.instance.Localize("<color=yellow>Болотный ключ сломался</color>"), 0, (Sprite)null); } } } } } [HarmonyPatch] public static class VB_Timeout_Patch { public static CodeMatcher GetPosition(this CodeMatcher codeMatcher, out int position) { position = codeMatcher.Pos; return codeMatcher; } public static CodeMatcher AddLabel(this CodeMatcher codeMatcher, out Label label) { label = default(Label); codeMatcher.AddLabels((IEnumerable<Label>)new Label[1] { label }); return codeMatcher; } public static CodeMatcher GetLabels(this CodeMatcher codeMatcher, out List<Label> label) { label = codeMatcher.Labels; return codeMatcher; } public static CodeMatcher GetOperand(this CodeMatcher codeMatcher, out object operand) { operand = codeMatcher.Operand; return codeMatcher; } internal static CodeMatcher Print(this CodeMatcher codeMatcher, int before, int after) { for (int i = -before; i <= after; i++) { int num = i; int num2 = codeMatcher.Pos + num; if (num2 > 0) { if (num2 >= codeMatcher.Length) { break; } try { CodeInstruction val = codeMatcher.InstructionAt(num); VBQOL.Logger.LogDebug((object)($"[{num}] " + (object)val)); } catch (Exception ex) { VBQOL.Logger.LogDebug((object)ex.Message); } } } return codeMatcher; } public static bool IsVirtCall(this CodeInstruction i, string declaringType, string name) { return i.opcode == OpCodes.Callvirt && i.operand is MethodInfo methodInfo && methodInfo.DeclaringType?.Name == declaringType && methodInfo.Name == name; } } public class VB_SlopeDamagePatch { [HarmonyPatch(typeof(Attack), "DoMeleeAttack")] public class PatchAttackDoMeleeAttack { public static void Prefix(ref Attack __instance, ref float ___m_maxYAngle, ref float ___m_attackOffset, ref float ___m_attackHeight) { Humanoid character = __instance.m_character; Player val = (Player)(object)((character is Player) ? character : null); if (!((Object)(object)val == (Object)null) && !((Object)(object)val != (Object)(object)Player.m_localPlayer)) { ___m_maxYAngle = 180f; ___m_attackOffset = 0f; ___m_attackHeight = 1f; } } } } public class VB_ClearLogPatch { [HarmonyPrefix] [HarmonyPatch(typeof(ConsoleLogListener), "LogEvent")] private static bool ConsoleLogListenerLog(object sender, LogEventArgs eventArgs) { string text = eventArgs.Data.ToString(); return !text.StartsWith("Failed to find expected binary shader data") && !text.Contains("Fetching PlatformPrefs 'GuiScale' before loading defaults") && !text.Contains("Missing audio clip in music respawn") && !text.Contains("Set button") && !text.Contains("Only custom filters can be played. Please add a custom filter or an audioclip to the audiosource (Amb_MainMenu)."); } } public class VB_FeedFromHandPatch { [HarmonyPatch(typeof(Humanoid), "UseItem")] public static class Humanoid_UseItem_Prefix_Patch { public static bool Prefix(Humanoid __instance, ItemData item) { //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) GameObject hoverObject = __instance.GetHoverObject(); if ((Object)(object)hoverObject == (Object)null) { return true; } if (!Object.op_Implicit((Object)(object)hoverObject.GetComponent<MonsterAI>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Character>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Tameable>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Humanoid>())) { return true; } MonsterAI component = hoverObject.GetComponent<MonsterAI>(); Character component2 = hoverObject.GetComponent<Character>(); Tameable component3 = hoverObject.GetComponent<Tameable>(); Humanoid component4 = hoverObject.GetComponent<Humanoid>(); if (component2.IsTamed() && component.CanConsume(item)) { string hoverName = component2.GetHoverName(); if (component2.GetHealth() < component2.GetMaxHealth()) { component2.Heal(50f, true); component3.ResetFeedingTimer(); component3.Interact(component4, false, false); __instance.DoInteractAnimation(hoverObject.transform.position); ((Character)__instance).Message((MessageType)2, hoverName + " $hud_tamelove", 0, (Sprite)null); Inventory inventory = __instance.GetInventory(); inventory.RemoveOneItem(item); bool flag = false; } if (component3.IsHungry()) { component2.Heal(50f, true); component3.ResetFeedingTimer(); component3.Interact(component4, false, false); __instance.DoInteractAnimation(hoverObject.transform.position); ((Character)__instance).Message((MessageType)2, hoverName + " $hud_tamelove", 0, (Sprite)null); Inventory inventory2 = __instance.GetInventory(); inventory2.RemoveOneItem(item); return false; } ((Character)__instance).Message((MessageType)2, hoverName + " $msg_nomore", 0, (Sprite)null); return false; } return true; } } } public class VB_SnakeCameraPatch { internal class SneakConfig { public enum CrouchPosition { Disabled, Crouching, CrouchStanding, CrouchWalking } public static CrouchPosition LowerCameraWhen = CrouchPosition.Crouching; public static float CameraHeightReduction = 0.5f; internal const float CameraMin = 0f; internal const float CameraMax = 1f; public static bool ChangeCollisionCrouchHeight = true; public static float CrouchHeightMultiplier = 0.8f; internal const float HeightMultMin = 0.75f; internal const float HeightMultMax = 1f; } [HarmonyPatch] internal class CameraPatches { [HarmonyPostfix] [HarmonyPatch(typeof(GameCamera), "GetCameraBaseOffset")] private static void GetCameraBaseOffset(Player player, ref Vector3 __result) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)player != (Object)(object)Player.m_localPlayer) && SneakConfig.LowerCameraWhen != 0 && !(__result != ((Component)((Character)player).m_eye).transform.position - ((Component)player).transform.position) && ((Character)player).IsCrouching() && ((Character)player).IsOnGround()) { bool flag = ((Character)player).IsSneaking(); if (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.Crouching || (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.CrouchWalking && flag) || (SneakConfig.LowerCameraWhen == SneakConfig.CrouchPosition.CrouchStanding && !flag)) { __result += Vector3.up * (0f - Mathf.Clamp(SneakConfig.CameraHeightReduction, 0f, 1f)); } } } } private static float? standingSize; private static float? crouchedSize; [HarmonyPatch(typeof(Player), "FixedUpdate")] [HarmonyPostfix] private static void FixedUpdate(Player __instance) { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || !SneakConfig.ChangeCollisionCrouchHeight) { return; } CapsuleCollider collider = ((Character)__instance).GetCollider(); if (Object.op_Implicit((Object)(object)collider)) { if (!standingSize.HasValue) { standingSize = collider.height; CalculateCrouchedSize(); } bool flag = ((Character)__instance).IsCrouching() && ((Character)__instance).IsOnGround(); collider.height = (flag ? crouchedSize.Value : standingSize.Value); collider.center = new Vector3(0f, collider.height / 2f, 0f); } } internal static void CalculateCrouchedSize() { if (standingSize.HasValue) { _ = SneakConfig.CrouchHeightMultiplier; if (0 == 0) { crouchedSize = standingSize.Value * Mathf.Clamp(SneakConfig.CrouchHeightMultiplier, 0.75f, 1f); } } } } public class VB_BlastFurnaceTalesAll { [HarmonyPatch(typeof(Smelter), "Awake")] [HarmonyPostfix] private static void BlastFurnacePatch(ref Smelter __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Expected O, but got Unknown if (__instance.m_name != "$piece_blastfurnace") { return; } foreach (ItemConversion item in new List<ItemConversion> { new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("CopperOre").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Copper").GetComponent<ItemDrop>() }, new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("CopperScrap").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Copper").GetComponent<ItemDrop>() }, new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("TinOre").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Tin").GetComponent<ItemDrop>() }, new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("IronOre").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Iron").GetComponent<ItemDrop>() }, new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("IronScrap").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Iron").GetComponent<ItemDrop>() }, new ItemConversion { m_from = ObjectDB.instance.GetItemPrefab("SilverOre").GetComponent<ItemDrop>(), m_to = ObjectDB.instance.GetItemPrefab("Silver").GetComponent<ItemDrop>() } }) { __instance.m_conversion.Add(item); } } } public class VB_BetterLaders { [HarmonyPatch(typeof(AutoJumpLedge), "OnTriggerStay")] public static class Ladder_Patch { private static bool Prefix(AutoJumpLedge __instance, Collider collider) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) Character component = ((Component)collider).GetComponent<Character>(); if (Object.op_Implicit((Object)(object)component) && (Object)(object)component == (Object)(object)Player.m_localPlayer) { Vector3 position = ((Component)component).transform.position; Quaternion rotation = ((Component)__instance).gameObject.transform.rotation; float y = ((Quaternion)(ref rotation)).eulerAngles.y; rotation = ((Component)component).transform.rotation; float y2 = ((Quaternion)(ref rotation)).eulerAngles.y; float num = Math.Abs(Mathf.DeltaAngle(y, y2)); if (num <= 12f) { if (!component.m_running) { ((Component)component).transform.position = new Vector3(position.x, position.y + 0.06f, position.z) + ((Component)component).transform.forward * 0.08f; } else { ((Component)component).transform.position = new Vector3(position.x, position.y + 0.08f, position.z) + ((Component)component).transform.forward * 0.08f; } } } return !((Object)(object)component == (Object)(object)Player.m_localPlayer); } } } public class VB_Pickable_UpdateRespawn_Patch { [HarmonyPatch(typeof(Pickable), "UpdateRespawn")] public static class Patch_Pickable_UpdateRespawn { private static Exception Finalizer(Pickable __instance, Exception __exception) { if ((Object)(object)__instance != (Object)null && __exception != null) { VBQOL.Logger.LogDebug((object)"Исправлен таймер расстения:"); VBQOL.Logger.LogDebug((object)__exception); DateTime time = ZNet.instance.GetTime(); __instance.m_nview.GetZDO().Set(ZDOVars.s_pickedTime, time.Ticks); } return null; } } } public class VB_ToolTierPatch { [HarmonyPatch] internal class Change_ToolTierPatch { [HarmonyPatch(typeof(ZNetScene), "Awake")] [HarmonyPostfix] public static void Patch(ZNetScene __instance) { __instance.GetPrefab("Beech1").GetComponent<TreeBase>().m_minToolTier = 0; __instance.GetPrefab("beech_log").GetComponent<TreeLog>().m_minToolTier = 0; __instance.GetPrefab("beech_log_half").GetComponent<TreeLog>().m_minToolTier = 0; __instance.GetPrefab("Beech_Stub").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("FirTree").GetComponent<TreeBase>().m_minToolTier = 0; __instance.GetPrefab("FirTree_log").GetComponent<TreeLog>().m_minToolTier = 0; __instance.GetPrefab("FirTree_log_half").GetComponent<TreeLog>().m_minToolTier = 0; __instance.GetPrefab("FirTree_Stub").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("Pinetree_01").GetComponent<TreeBase>().m_minToolTier = 1; __instance.GetPrefab("PineTree_log").GetComponent<TreeLog>().m_minToolTier = 1; __instance.GetPrefab("PineTree_log_half").GetComponent<TreeLog>().m_minToolTier = 1; __instance.GetPrefab("Pinetree_01_Stub").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("SwampTree1").GetComponent<TreeBase>().m_minToolTier = 2; __instance.GetPrefab("SwampTree1_log").GetComponent<TreeLog>().m_minToolTier = 2; __instance.GetPrefab("SwampTree1_Stub").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("Birch1").GetComponent<TreeBase>().m_minToolTier = 2; __instance.GetPrefab("Birch2").GetComponent<TreeBase>().m_minToolTier = 2; __instance.GetPrefab("Birch_log").GetComponent<TreeLog>().m_minToolTier = 2; __instance.GetPrefab("Birch_log_half").GetComponent<TreeLog>().m_minToolTier = 2; __instance.GetPrefab("BirchStub").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("Birch1_aut").GetComponent<TreeBase>().m_minToolTier = 2; __instance.GetPrefab("Birch2_aut").GetComponent<TreeBase>().m_minToolTier = 2; __instance.GetPrefab("caverock_ice_stalagtite").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("caverock_ice_stalagtite_falling").GetComponent<TreeLog>().m_minToolTier = 2; __instance.GetPrefab("caverock_ice_stalagmite").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("caverock_ice_stalagmite_broken").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("caverock_ice_pillar_wall").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("Oak1").GetComponent<TreeBase>().m_minToolTier = 3; __instance.GetPrefab("Oak_log").GetComponent<TreeLog>().m_minToolTier = 3; __instance.GetPrefab("Oak_log_half").GetComponent<TreeLog>().m_minToolTier = 3; __instance.GetPrefab("OakStub").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("YggaShoot1").GetComponent<TreeBase>().m_minToolTier = 4; __instance.GetPrefab("YggaShoot2").GetComponent<TreeBase>().m_minToolTier = 4; __instance.GetPrefab("YggaShoot3").GetComponent<TreeBase>().m_minToolTier = 4; __instance.GetPrefab("yggashoot_log").GetComponent<TreeLog>().m_minToolTier = 4; __instance.GetPrefab("yggashoot_log_half").GetComponent<TreeLog>().m_minToolTier = 4; __instance.GetPrefab("ShootStump").GetComponent<Destructible>().m_minToolTier = 4; __instance.GetPrefab("Leviathan").GetComponent<MineRock>().m_minToolTier = 1; __instance.GetPrefab("mudpile").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("mudpile2").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("mudpile_beacon").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("mudpile_old").GetComponent<MineRock>().m_minToolTier = 1; __instance.GetPrefab("mudpile_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("mudpile2_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("MineRock_Meteorite").GetComponent<MineRock>().m_minToolTier = 3; __instance.GetPrefab("Rock_3").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("Rock_3_frac").GetComponent<MineRock5>().m_minToolTier = 0; __instance.GetPrefab("rock4_coast").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("rock4_coast_frac").GetComponent<MineRock5>().m_minToolTier = 0; __instance.GetPrefab("rock4_forest").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("rock4_forest_frac").GetComponent<MineRock5>().m_minToolTier = 0; __instance.GetPrefab("rock4_copper").GetComponent<Destructible>().m_minToolTier = 0; __instance.GetPrefab("rock4_copper_frac").GetComponent<MineRock5>().m_minToolTier = 0; __instance.GetPrefab("rock1_mountain").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("rock1_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("rock2_mountain").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("rock2_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("rock3_mountain").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("rock3_mountain_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("rock2_heath").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("rock2_heath_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("rock4_heath").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("rock4_heath_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("HeathRockPillar").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("HeathRockPillar_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("RockThumb").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("RockThumb_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("RockFinger").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("RockFinger_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("RockFingerBroken").GetComponent<Destructible>().m_minToolTier = 1; __instance.GetPrefab("RockFingerBroken_frac").GetComponent<MineRock5>().m_minToolTier = 1; __instance.GetPrefab("rock_mistlands1").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("rock_mistlands1_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands1").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands1_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands2").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands2_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands1_creep").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("cliff_mistlands1_creep_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("silvervein").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("silvervein_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("rock3_silver").GetComponent<Destructible>().m_minToolTier = 2; __instance.GetPrefab("rock3_silver_frac").GetComponent<MineRock5>().m_minToolTier = 2; __instance.GetPrefab("giant_brain").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_brain_frac").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_ribs").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_ribs_frac").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_skull").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_skull_frac").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_helmet1").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_helmet1_destruction").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_helmet2").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_helmet2_destruction").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_sword1").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_sword1_destruction").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("giant_sword2").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("giant_sword2_destruction").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("ice_rock1").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("ice_rock1_frac").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("rock3_ice").GetComponent<Destructible>().m_minToolTier = 3; __instance.GetPrefab("rock3_ice_frac").GetComponent<MineRock5>().m_minToolTier = 3; __instance.GetPrefab("ice1").GetComponent<Destructible>().m_minToolTier = 3; } } } [HarmonyPatch(typeof(InventoryGui))] public class VB_RecycleInventoryGui { [HarmonyPatch(typeof(Humanoid))] private class HumanoidPatch { [HarmonyPostfix] [HarmonyPatch("EquipItem")] private static void EquipItem(Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { if (((Character)__instance).IsPlayer()) { InventoryGui instance = InventoryGui.instance; if (instance != null) { instance.UpdateCraftingPanel(false); } } } [HarmonyPatch("UnequipItem")] [HarmonyPostfix] private static void UnequipItem(Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { if (((Character)__instance).IsPlayer()) { InventoryGui instance = InventoryGui.instance; if (instance != null) { instance.UpdateCraftingPanel(false); } } } } [HarmonyPatch(typeof(InventoryGui))] public class InventoryGuiPatch { [HarmonyPostfix] [HarmonyPatch("Update")] internal static void PostfixUpdate(InventoryGui __instance) { VBQOL.self?.RebuildRecycleTab(); } [HarmonyPatch("OnTabCraftPressed")] [HarmonyPrefix] internal static bool PrefixOnTabCraftPressed(InventoryGui __instance) { ((Selectable)VBQOL.self.recycleButton).interactable = true; return true; } [HarmonyPrefix] [HarmonyPatch("OnTabUpgradePressed")] internal static bool PrefixOnTabUpgradePressed(InventoryGui __instance) { ((Selectable)VBQOL.self.recycleButton).interactable = true; return true; } [HarmonyPatch("SetupRequirement")] [HarmonyPostfix] internal static void PostfixSetupRequirement(Transform elementRoot, Requirement req, int quality) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (VBQOL.self.InTabDeconstruct()) { TMP_Text component = ((Component)((Component)elementRoot).transform.Find("res_amount")).GetComponent<TMP_Text>(); component.text = VBQOL.GetModifiedAmount(quality, req).ToString(); ((Graphic)component).color = Color.green; } } [HarmonyPatch("UpdateCraftingPanel")] [HarmonyPrefix] internal static bool PrefixUpdateCraftingPanel(InventoryGui __instance, bool focusView = false) { if ((Object)(object)VBQOL.self != (Object)null) { Player localPlayer = Player.m_localPlayer; if (Object.op_Implicit((Object)(object)localPlayer.GetCurrentCraftingStation()) && (((Object)((Component)localPlayer.GetCurrentCraftingStation()).gameObject).name.Contains("cauldron") || ((Object)((Component)localPlayer.GetCurrentCraftingStation()).gameObject).name.Contains("artisanstation"))) { VBQOL.self.recycleObject.SetActive(false); ((Selectable)VBQOL.self.recycleButton).interactable = true; return true; } if (!Object.op_Implicit((Object)(object)localPlayer.GetCurrentCraftingStation()) && !localPlayer.NoCostCheat()) { ((Selectable)__instance.m_tabCraft).interactable = false; ((Selectable)__instance.m_tabUpgrade).interactable = true; ((Component)__instance.m_tabUpgrade).gameObject.SetActive(false); VBQOL.self.recycleObject.SetActive(false); ((Selectable)VBQOL.self.recycleButton).interactable = true; } else { ((Component)__instance.m_tabUpgrade).gameObject.SetActive(true); VBQOL.self.recycleObject.SetActive(true); } List<Recipe> list = new List<Recipe>(); localPlayer.GetAvailableRecipes(ref list); __instance.UpdateRecipeList(list); if (__instance.m_availableRecipes.Count <= 0) { __instance.SetRecipe(-1, focusView); return false; } if ((Object)(object)__instance.m_selectedRecipe.Key != (Object)null) { int selectedRecipeIndex = __instance.GetSelectedRecipeIndex(false); __instance.SetRecipe(selectedRecipeIndex, focusView); return false; } __instance.SetRecipe(0, focusView); return false; } return true; } [HarmonyPostfix] [HarmonyPatch("UpdateRecipeList")] internal static void PostfixUpdateRecipeList(InventoryGui __instance, List<Recipe> recipes) { if (!VBQOL.self.InTabDeconstruct()) { return; } Player localPlayer = Player.m_localPlayer; Inventory inventory = ((Humanoid)localPlayer).GetInventory(); __instance.m_availableRecipes.Clear(); foreach (GameObject recipe in __instance.m_recipeList) { Object.Destroy((Object)(object)recipe); } __instance.m_recipeList.Clear(); List<KeyValuePair<Recipe, ItemData>> list = new List<KeyValuePair<Recipe, ItemData>>(); for (int i = 0; i < recipes.Count; i++) { Recipe val = recipes[i]; if (val.m_item.m_itemData.m_shared.m_maxQuality < 1) { continue; } __instance.m_tempItemList.Clear(); if (val.m_item.m_itemData.m_shared.m_maxStackSize == 1) { inventory.GetAllItems(val.m_item.m_itemData.m_shared.m_name, __instance.m_tempItemList); } else { for (int j = 0; j < inventory.m_inventory.Count; j++) { if (inventory.m_inventory[j].m_shared.m_name.Equals(val.m_item.m_itemData.m_shared.m_name) && inventory.m_inventory[j].m_stack >= val.m_amount) { __instance.m_tempItemList.Add(inventory.m_inventory[j]); break; } } } foreach (ItemData tempItem in __instance.m_tempItemList) { if (tempItem.m_quality >= 1) { list.Add(new KeyValuePair<Recipe, ItemData>(val, tempItem)); } } } IEnumerable<int> equipped = from item in inventory.GetEquippedItems() select ((object)item).GetHashCode(); list.RemoveAll((KeyValuePair<Recipe, ItemData> m) => equipped.Contains(((object)m.Value).GetHashCode())); List<ItemData> list2 = new List<ItemData>(); inventory.GetBoundItems(list2); IEnumerable<int> hotbarItemsHashes = list2.Select((ItemData item) => ((object)item).GetHashCode()); list.RemoveAll((KeyValuePair<Recipe, ItemData> m) => hotbarItemsHashes.Contains(((object)m.Value).GetHashCode())); foreach (KeyValuePair<Recipe, ItemData> item in list) { __instance.AddRecipeToList(localPlayer, item.Key, item.Value, true); } float num = (float)__instance.m_recipeList.Count * __instance.m_recipeListSpace; num = Mathf.Max(__instance.m_recipeListBaseSize, num); __instance.m_recipeListRoot.SetSizeWithCurrentAnchors((Axis)1, num); } [HarmonyPrefix] [HarmonyPatch("UpdateRecipe")] internal static bool PrefixUpdateRecipe(InventoryGui __instance, Player player, float dt) { //IL_03d4: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) if (VBQOL.self.InTabDeconstruct()) { CraftingStation currentCraftingStation = player.GetCurrentCraftingStation(); if (Object.op_Implicit((Object)(object)currentCraftingStation)) { __instance.m_craftingStationName.text = Localization.instance.Localize(currentCraftingStation.m_name); ((Component)__instance.m_craftingStationIcon).gameObject.SetActive(true); __instance.m_craftingStationIcon.sprite = currentCraftingStation.m_icon; int level = currentCraftingStation.GetLevel(true); __instance.m_craftingStationLevel.text = level.ToString(); ((Component)__instance.m_craftingStationLevelRoot).gameObject.SetActive(true); } else { __instance.m_craftingStationName.text = Localization.instance.Localize("$hud_crafting"); ((Component)__instance.m_craftingStationIcon).gameObject.SetActive(false); ((Component)__instance.m_craftingStationLevelRoot).gameObject.SetActive(false); } if (Object.op_Implicit((Object)(object)__instance.m_selectedRecipe.Key)) { ((Behaviour)__instance.m_recipeIcon).enabled = true; ((Behaviour)__instance.m_recipeName).enabled = true; ItemData value = __instance.m_selectedRecipe.Value; if (value.m_quality == 1) { ((Behaviour)__instance.m_recipeDecription).enabled = false; } else { ((Behaviour)__instance.m_recipeDecription).enabled = true; } int num = ((value == null) ? 1 : ((value.m_quality >= 1) ? (value.m_quality - 1) : 0)); bool flag = num <= __instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_maxQuality; int num2 = value?.m_variant ?? __instance.m_selectedVariant; __instance.m_recipeIcon.sprite = __instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_icons[num2]; string text = Localization.instance.Localize(__instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_name); if (__instance.m_selectedRecipe.Key.m_amount > 1) { text = text + " x" + __instance.m_selectedRecipe.Key.m_amount; } __instance.m_recipeName.text = text; __instance.m_recipeDecription.text = Localization.instance.Localize(ItemData.GetTooltip(__instance.m_selectedRecipe.Key.m_item.m_itemData, num, true, (float)Game.m_worldLevel)); if (value != null) { ((Component)__instance.m_itemCraftType).gameObject.SetActive(true); string text2 = Localization.instance.Localize(value.m_shared.m_name); __instance.m_itemCraftType.text = "Предмет будет разобран"; } else { ((Component)__instance.m_itemCraftType).gameObject.SetActive(false); } ((Component)__instance.m_variantButton).gameObject.SetActive(__instance.m_selectedRecipe.Key.m_item.m_itemData.m_shared.m_variants > 1 && __instance.m_selectedRecipe.Value == null); __instance.SetupRequirementList(num + 1, player, flag); int num3 = 0; CraftingStation requiredStation = __instance.m_selectedRecipe.Key.GetRequiredStation(num); if ((Object)(object)requiredStation != (Object)null && flag) { ((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(true); __instance.m_minStationLevelText.text = num3.ToString(); if ((Object)(object)currentCraftingStation == (Object)null || currentCraftingStation.GetLevel(true) < num3) { ((Graphic)__instance.m_minStationLevelText).color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : __instance.m_minStationLevelBasecolor); } else { ((Graphic)__instance.m_minStationLevelText).color = __instance.m_minStationLevelBasecolor; } } else { ((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(false); } bool flag2 = true; bool flag3 = VBQOL.HaveEmptySlotsForRecipe(((Humanoid)player).GetInventory(), __instance.m_selectedRecipe.Key, num + 1); bool flag4 = !Object.op_Implicit((Object)(object)requiredStation) || (Object.op_Implicit((Object)(object)currentCraftingStation) && currentCraftingStation.CheckUsable(player, false)); ((Selectable)__instance.m_craftButton).interactable = ((flag2 && flag4) || player.NoCostCheat()) && flag3 && flag; TMP_Text componentInChildren = ((Component)__instance.m_craftButton).GetComponentInChildren<TMP_Text>(); componentInChildren.text = "Разбор"; UITooltip component = ((Component)__instance.m_craftButton).GetComponent<UITooltip>(); if (!flag3) { component.m_text = Localization.instance.Localize("$inventory_full"); } else if (!flag4) { component.m_text = Localization.instance.Localize("$msg_missingstation"); } else { component.m_text = ""; } } else { ((Behaviour)__instance.m_recipeIcon).enabled = false; ((Behaviour)__instance.m_recipeName).enabled = false; ((Behaviour)__instance.m_recipeDecription).enabled = false; ((Component)__instance.m_qualityPanel).gameObject.SetActive(false); ((Component)__instance.m_minStationLevelIcon).gameObject.SetActive(false); ((Component)__instance.m_craftButton).GetComponent<UITooltip>().m_text = ""; ((Component)__instance.m_variantButton).gameObject.SetActive(false); ((Component)__instance.m_itemCraftType).gameObject.SetActive(false); for (int i = 0; i < __instance.m_recipeRequirementList.Length; i++) { InventoryGui.HideRequirement(__instance.m_recipeRequirementList[i].transform); } ((Selectable)__instance.m_craftButton).interactable = false; } if (__instance.m_craftTimer < 0f) { ((Component)__instance.m_craftProgressPanel).gameObject.SetActive(false); ((Component)__instance.m_craftButton).gameObject.SetActive(true); return false; } ((Component)__instance.m_craftButton).gameObject.SetActive(false); ((Component)__instance.m_craftProgressPanel).gameObject.SetActive(true); __instance.m_craftProgressBar.SetMaxValue(__instance.m_craftDuration); __instance.m_craftProgressBar.SetValue(__instance.m_craftTimer); __instance.m_craftTimer += dt; if (__instance.m_craftTimer >= __instance.m_craftDuration) { if (VBQOL.self.InTabDeconstruct()) { VBQOL.DoRecycle(player, __instance); } else { __instance.DoCrafting(player); } __instance.m_craftTimer = -1f; } return false; } return true; } } } [HarmonyPatch] public class VB_FirePlaceUtilites { public static KeyCode configPOKey; public static ConfigEntry<bool> extinguishItemsConfig; public static ConfigEntry<string> extinguishStringConfig; public static ConfigEntry<string> igniteStringConfig; public static ConfigEntry<KeyCode> keyPOCodeStringConfig; public static Fireplace GetAndCheckFireplace(Player player, bool checkIfBurning) { GameObject hoverObject = ((Humanoid)player).GetHoverObject(); Fireplace val = (((Object)(object)hoverObject != (Object)null) ? hoverObject.GetComponentInParent<Fireplace>() : null); if ((Object)(object)val == (Object)null) { return null; } Fireplace component = ((Component)((Component)val).GetComponent<ZNetView>()).GetComponent<Fireplace>(); if ((Object)(object)component == (Object)null) { return null; } if (checkIfBurning) { if (!component.IsBurning()) { return null; } if (component.m_wet) { return null; } } return component; } [HarmonyPatch(typeof(Fireplace), "UpdateFireplace")] [HarmonyPostfix] public static void FireplaceUpdateFireplace_Patch(Fireplace __instance) { ZDO zDO = __instance.m_nview.GetZDO(); float @float = zDO.GetFloat("fuel", 0f); if (!zDO.GetBool("enabledFire", false)) { if (@float <= 0f) { return; } zDO.Set("enabledFire", true); zDO.Set("fuel", zDO.GetFloat("hiddenFuelAmount", 0f) + @float); } if (zDO.GetFloat("hiddenFuelAmount", 0f) != @float) { float num = @float; zDO.Set("hiddenFuelAmount", num); } if (zDO.GetFloat("fuel", 0f) > __instance.m_maxFuel) { zDO.Set("fuel", __instance.m_maxFuel); } } [HarmonyPatch(typeof(Fireplace), "GetHoverText")] [HarmonyPostfix] public static string FireplaceGetHoverText_Patch(string __result, Fireplace __instance) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) string text = __result; KeyCode value = keyPOCodeStringConfig.Value; string text2 = ((object)(KeyCode)(ref value)).ToString(); if ((Object)(object)__instance == (Object)null) { return text; } ZDO zDO = __instance.m_nview.GetZDO(); float @float = zDO.GetFloat("hiddenFuelAmount", 0f); if (extinguishItemsConfig.Value && !__instance.IsBurning() && @float > 0f) { int num = (int)__instance.m_maxFuel; text = text.Replace($"0/{num}", $"{(int)Mathf.Ceil(@float)}/{num}") + "\n[<color=yellow><b>" + text2 + "</b></color>] " + igniteStringConfig.Value; } if (!__instance.IsBurning()) { return text; } if (__instance.m_wet) { return text; } if (extinguishItemsConfig.Value) { text = text + "\n[<color=yellow><b>" + text2 + "</b></color>] " + extinguishStringConfig.Value; } return text; } [HarmonyPostfix] [HarmonyPatch(typeof(Player), "Update")] public static void PlayerUpdate_Patch(Player __instance) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)__instance) || !Input.GetKeyUp(configPOKey) || !extinguishItemsConfig.Value) { return; } Fireplace andCheckFireplace = GetAndCheckFireplace(__instance, checkIfBurning: false); if (!((Object)(object)andCheckFireplace == (Object)null)) { ZDO zDO = andCheckFireplace.m_nview.GetZDO(); bool flag = !zDO.GetBool("enabledFire", false); zDO.Set("enabledFire", flag); if (!flag) { andCheckFireplace.m_fuelAddedEffects.Create(((Component)andCheckFireplace).transform.position, ((Component)andCheckFireplace).transform.rotation, (Transform)null, 1f, -1); zDO.Set("fuel", 0f); } if (flag) { andCheckFireplace.m_fuelAddedEffects.Create(((Component)andCheckFireplace).transform.position, ((Component)andCheckFireplace).transform.rotation, (Transform)null, 1f, -1); zDO.Set("fuel", zDO.GetFloat("hiddenFuelAmount", 0f)); } } } } public class VB_BuildDamage { public static class RPC_HealthChanged_Patch { public static bool Prefix(long peer, Piece ___m_piece, WearNTear __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) foreach (PrivateArea allArea in PrivateArea.m_allAreas) { if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f)) { if (___m_piece == null) { return true; } if (uncreatedDamageMultConfig.Value == 0f && ___m_piece.GetCreator() == 0) { return false; } if (nonCreatorDamageMultConfig.Value == 0f && ___m_piece.GetCreator() != 0L && peer != ___m_piece.GetCreator()) { return false; } if (creatorDamageMultConfig.Value == 0f && ___m_piece.GetCreator() != 0L && peer == ___m_piece.GetCreator()) { return false; } } } return true; } } [HarmonyPatch(typeof(WearNTear), "RPC_Damage")] public static class RPC_Damage_Patch { public static void Prefix(ref HitData hit, Piece ___m_piece, WearNTear __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) foreach (PrivateArea allArea in PrivateArea.m_allAreas) { if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f)) { if (!enableModBDConfig.Value) { break; } float num = 1f; _ = hit.m_attacker; num = (((ZDOID)(ref hit.m_attacker)).IsNone() ? naturalDamageMultConfig.Value : ((___m_piece != null && ___m_piece.GetCreator() == 0) ? uncreatedDamageMultConfig.Value : ((!(hit.m_attacker == ((Character)Player.m_localPlayer).GetZDOID()) || !((Object)(object)___m_piece != (Object)null) || !___m_piece.IsCreator()) ? nonCreatorDamageMultConfig.Value : creatorDamageMultConfig.Value))); MultiplyDamage(ref hit, num); } } } private static void MultiplyDamage(ref HitData hit, float value) { value = Math.Max(0f, value); hit.m_damage.m_damage *= value; hit.m_damage.m_blunt *= value; hit.m_damage.m_slash *= value; hit.m_damage.m_pierce *= value; hit.m_damage.m_chop *= value; hit.m_damage.m_pickaxe *= value; hit.m_damage.m_fire *= value; hit.m_damage.m_frost *= value; hit.m_damage.m_lightning *= value; hit.m_damage.m_poison *= value; hit.m_damage.m_spirit *= value; } } [HarmonyPatch(typeof(WearNTear), "ApplyDamage")] public static class ApplyDamage_Patch { public static void Prefix(ref float damage, WearNTear __instance) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) foreach (PrivateArea allArea in PrivateArea.m_allAreas) { if (allArea.IsEnabled() && allArea.IsInside(((Component)__instance).transform.position, 0f)) { if (!enableModBDConfig.Value || Environment.StackTrace.Contains("RPC_Damage")) { break; } damage *= naturalDamageMultConfig.Value; } } } } public static ConfigEntry<bool> enableModBDConfig; public static ConfigEntry<float> creatorDamageMultConfig; public static ConfigEntry<float> nonCreatorDamageMultConfig; public static ConfigEntry<float> uncreatedDamageMultConfig; public static ConfigEntry<float> naturalDamageMultConfig; } [HarmonyPatch(typeof(MessageHud))] public static class VB_BetterPickupNotifications { private class PickupMessage : MsgData { public float Timer; } private class PickupDisplay { public GameObject RootGO; private Image IconComp; private TMP_Text TextComp; private int Index; public PickupDisplay(int index) { Index = index; CreateUI(); } private void CreateUI() { //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) RootGO = Object.Instantiate<GameObject>(((Component)((Component)MessageHud.instance.m_messageText).gameObject.transform.parent).gameObject, ((Component)MessageHud.instance.m_messageText).gameObject.transform.parent.parent); RootGO.transform.SetAsFirstSibling(); IconComp = RootGO.GetComponentInChildren<Image>(); TextComp = RootGO.GetComponentInChildren<TMP_Text>(); Transform transform = RootGO.transform; Vector3 position = transform.position; Vector3 up = Vector3.up; Rect rect = ((Graphic)IconComp).rectTransform.rect; transform.position = position + up * (0f - ((Rect)(ref rect)).height * MessageVerticalSpacingModifier.Value) * (float)(Index + 1); Transform transform2 = ((Component)TextComp).gameObject.transform; Vector3 position2 = transform2.position; Vector3 up2 = Vector3.up; rect = ((Graphic)IconComp).rectTransform.rect; Vector3 val = up2 * (0f - ((Rect)(ref rect)).height) * MessageTextVerticalModifier.Value; Vector3 right = Vector3.right; rect = ((Graphic)IconComp).rectTransform.rect; transform2.position = position2 + (val + right * ((Rect)(ref rect)).width * MessageTextHorizontalSpacingModifier.Value); } public void Display(PickupMessage msg) { try { ((Graphic)TextComp).canvasRenderer.SetAlpha(1f); ((Graphic)TextComp).CrossFadeAlpha(1f, 0f, true); if (((MsgData)msg).m_amount > 1) { TextComp.text = ((MsgData)msg).m_text + " x" + ((MsgData)msg).m_amount; } else { TextComp.text = ((MsgData)msg).m_text; } IconComp.sprite = ((MsgData)msg).m_icon; ((Graphic)IconComp).canvasRenderer.SetAlpha(1f); ((Graphic)IconComp).CrossFadeAlpha(1f, 0f, true); } catch { if (msg != null && (Object)(object)((MsgData)msg).m_icon != (Object)null) { CreateUI(); Display(msg); } } } public void FadeAway() { ((Graphic)TextComp).CrossFadeAlpha(0f, MessageFadeTime.Value, true); ((Graphic)IconComp).CrossFadeAlpha(0f, MessageFadeTime.Value, true); } } public static ConfigEntry<float> MessageLifetime; public static ConfigEntry<float> MessageFadeTime; public static ConfigEntry<float> MessageBumpTime; public static ConfigEntry<bool> ResetMessageTimerOnDupePickup; public static ConfigEntry<float> MessageVerticalSpacingModifier; public static ConfigEntry<float> MessageTextHorizontalSpacingModifier; public static ConfigEntry<float> MessageTextVerticalModifier; private static List<PickupMessage> PickupMessages; private static List<PickupDisplay> PickupDisplays; [HarmonyPatch("ShowMessage")] [HarmonyPrefix] public static bool ShowMessagePrefix(MessageHud __instance, MessageType type, string text, int amount, Sprite icon) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Invalid comparison between Unknown and I4 if (Hud.IsUserHidden()) { return false; } text = Localization.instance.Localize(text); if ((int)type == 2 || string.IsNullOrWhiteSpace(text) || amount < 1 || (Object)(object)icon == (Object)null) { return true; } int i; for (i = 0; i < PickupMessages.Count && (PickupMessages[i] == null || !(((MsgData)PickupMessages[i]).m_text == text)); i++) { } if (i == PickupMessages.Count) { i = PickupMessages.IndexOf(null); if (i < 0) { i = PickupMessages.Count; PickupMessages.Add(null); PickupDisplays.Add(new PickupDisplay(i)); } PickupMessages[i] = new PickupMessage { m_text = text, m_amount = amount, m_icon = icon, Timer = MessageLifetime.Value }; PickupDisplays[i].Display(PickupMessages[i]); } else { PickupMessage pickupMessage = PickupMessages[i]; ((MsgData)pickupMessage).m_amount = ((MsgData)pickupMessage).m_amount + amount; if (ResetMessageTimerOnDupePickup.Value) { PickupMessages[i].Timer = MessageLifetime.Value; } else { PickupMessages[i].Timer += MessageBumpTime.Value; if (PickupMessages[i].Timer > MessageLifetime.Value) { PickupMessages[i].Timer = MessageLifetime.Value; } PickupDisplays[i].Display(PickupMessages[i]); } } return false; } [HarmonyPatch("UpdateMessage")] [HarmonyPrefix] public static bool UpdateMessagePrefix(MessageHud __instance, float dt) { for (int i = 0; i < PickupMessages.Count; i++) { if (PickupMessages[i] != null) { PickupMessages[i].Timer -= dt; if (PickupMessages[i].Timer <= 0f) { PickupMessages[i] = null; PickupDisplays[i].FadeAway(); } } } return true; } [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AwakePostfix() { PickupMessages = new List<PickupMessage>(); PickupDisplays = new List<PickupDisplay>(); } [HarmonyPatch("OnDestroy")] [HarmonyPostfix] public static void OnDestroyPostfix() { PickupMessages = null; PickupDisplays = null; } } public static class VB_CustomSlotManager { public static readonly Dictionary<Humanoid, Dictionary<string, ItemData>> customSlotItemData = new Dictionary<Humanoid, Dictionary<string, ItemData>>(); public static string GetCustomSlotName(ItemData item) { return item.m_dropPrefab.GetComponent<VB_CustomSlotItem>().m_slotName; } public static bool IsCustomSlotItem(ItemData item) { return item != null && Object.op_Implicit((Object)(object)item.m_dropPrefab) && Object.op_Implicit((Object)(object)item.m_dropPrefab.GetComponent<VB_CustomSlotItem>()); } public static ItemData GetPrefabItemData(Humanoid humanoid, string slotName) { if (!DoesSlotExist(humanoid, slotName)) { return null; } return customSlotItemData[humanoid][slotName].m_dropPrefab.GetComponent<ItemDrop>().m_itemData; } public static ItemData GetSlotItem(Humanoid humanoid, string slotName) { if (DoesSlotExist(humanoid, slotName)) { return customSlotItemData[humanoid][slotName]; } return null; } public static void SetSlotItem(Humanoid humanoid, string slotName, ItemData item) { customSlotItemData[humanoid][slotName] = item; } public static bool DoesSlotExist(Humanoid humanoid, string slotName) { return customSlotItemData[humanoid] != null && customSlotItemData[humanoid].ContainsKey(slotName); } public static bool IsSlotOccupied(Humanoid humanoid, string slotName) { return customSlotItemData[humanoid] != null && customSlotItemData[humanoid].ContainsKey(slotName) && customSlotItemData[humanoid][slotName] != null; } public static void ApplyCustomSlotItem(GameObject prefab, string slotName) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)prefab.GetComponent<VB_CustomSlotItem>())) { prefab.AddComponent<VB_CustomSlotItem>(); } prefab.GetComponent<VB_CustomSlotItem>().m_slotName = slotName; prefab.GetComponent<ItemDrop>().m_itemData.m_shared.m_itemType = (ItemType)0; } } internal class VB_CustomSlotItem : MonoBehaviour { [HarmonyPatch] public class Patches { [HarmonyPatch] public class PatchSlot { [HarmonyPostfix] [HarmonyPatch(typeof(ZNetScene), "Awake")] private static void PrefabPostfix(ref ZNetScene __instance) { VB_CustomSlotManager.ApplyCustomSlotItem(__instance.GetPrefab("Wishbone"), "wishbone"); VB_CustomSlotManager.ApplyCustomSlotItem(__instance.GetPrefab("Demister"), "wisplight"); } } [HarmonyPatch(typeof(ItemData), "IsEquipable")] [HarmonyPostfix] private static void IsEquipablePostfix(ref bool __result, ref ItemData __instance) { __result = __result || VB_CustomSlotManager.IsCustomSlotItem(__instance); } [HarmonyPostfix] [HarmonyPatch(typeof(Humanoid), "Awake")] private static void HumanoidEntryPostfix(ref Humanoid __instance) { VB_CustomSlotManager.customSlotItemData[__instance] = new Dictionary<string, ItemData>(); } [HarmonyPostfix] [HarmonyPatch(typeof(Player), "Load")] private static void InventoryLoadPostfix(ref Player __instance) { foreach (ItemData equippedItem in ((Humanoid)__instance).m_inventory.GetEquippedItems()) { if (VB_CustomSlotManager.IsCustomSlotItem(equippedItem)) { string customSlotName = VB_CustomSlotManager.GetCustomSlotName(equippedItem); VB_CustomSlotManager.SetSlotItem((Humanoid)(object)__instance, customSlotName, equippedItem); } } } [HarmonyPostfix] [HarmonyPatch(typeof(Humanoid), "EquipItem")] private static void EquipItemPostfix(ref bool __result, ref Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { if (__result && VB_CustomSlotManager.IsCustomSlotItem(item)) { string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item); if (VB_CustomSlotManager.IsSlotOccupied(__instance, customSlotName)) { __instance.UnequipItem(VB_CustomSlotManager.GetSlotItem(__instance, customSlotName), triggerEquipEffects); } VB_CustomSlotManager.SetSlotItem(__instance, customSlotName, item); if (__instance.IsItemEquiped(item)) { item.m_equipped = true; } __instance.SetupEquipment(); if (triggerEquipEffects) { __instance.TriggerEquipEffect(item); } __result = true; } } [HarmonyPatch(typeof(Humanoid), "UnequipItem")] [HarmonyPostfix] private static void UnequipItemPostfix(ref Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { if (VB_CustomSlotManager.IsCustomSlotItem(item)) { string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item); if (item == VB_CustomSlotManager.GetSlotItem(__instance, customSlotName)) { VB_CustomSlotManager.SetSlotItem(__instance, customSlotName, null); } __instance.UpdateEquipmentStatusEffects(); } } [HarmonyPatch(typeof(Humanoid), "IsItemEquiped")] [HarmonyPostfix] private static void IsItemEquipedPostfix(ref bool __result, ref Humanoid __instance, ItemData item) { if (VB_CustomSlotManager.IsCustomSlotItem(item)) { string customSlotName = VB_CustomSlotManager.GetCustomSlotName(item); bool flag = VB_CustomSlotManager.DoesSlotExist(__instance, customSlotName) && VB_CustomSlotManager.GetSlotItem(__instance, customSlotName) == item; __result |= flag; } } [HarmonyPatch(typeof(Humanoid), "GetEquipmentWeight")] [HarmonyPostfix] private static void GetEquipmentWeightPostfix(ref float __result, ref Humanoid __instance) { foreach (string key in VB_CustomSlotManager.customSlotItemData[__instance].Keys) { if (VB_CustomSlotManager.IsSlotOccupied(__instance, key)) { __result += VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_weight; } } } [HarmonyPatch(typeof(Humanoid), "UnequipAllItems")] [HarmonyPostfix] private static void UnequipAllItemsPostfix(ref Humanoid __instance) { foreach (string item in VB_CustomSlotManager.customSlotItemData[__instance].Keys.ToList()) { if (VB_CustomSlotManager.IsSlotOccupied(__instance, item)) { __instance.UnequipItem(VB_CustomSlotManager.GetSlotItem(__instance, item), false); } } } [HarmonyPostfix] [HarmonyPatch(typeof(Humanoid), "GetSetCount")] private static void GetSetCountPostfix(ref int __result, ref Humanoid __instance, string setName) { foreach (string item in VB_CustomSlotManager.customSlotItemData[__instance].Keys.ToList()) { if (VB_CustomSlotManager.IsSlotOccupied(__instance, item) && VB_CustomSlotManager.GetSlotItem(__instance, item).m_shared.m_setName == setName) { __result++; } } } public static HashSet<StatusEffect> GetStatusEffectsFromCustomSlotItems(Humanoid __instance) { HashSet<StatusEffect> hashSet = new HashSet<StatusEffect>(); foreach (string key in VB_CustomSlotManager.customSlotItemData[__instance].Keys) { if (VB_CustomSlotManager.IsSlotOccupied(__instance, key)) { if (Object.op_Implicit((Object)(object)VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_equipStatusEffect)) { StatusEffect equipStatusEffect = VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_equipStatusEffect; hashSet.Add(equipStatusEffect); } if (__instance.HaveSetEffect(VB_CustomSlotManager.GetSlotItem(__instance, key))) { StatusEffect setStatusEffect = VB_CustomSlotManager.GetSlotItem(__instance, key).m_shared.m_setStatusEffect; hashSet.Add(setStatusEffect); } } } return hashSet; } [HarmonyPatch(typeof(Humanoid), "UpdateEquipmentStatusEffects")] [HarmonyTranspiler] private static IEnumerable<CodeInstruction> UpdateEquipmentStatusEffectsTranspiler(IEnumerable<CodeInstruction> instructions) { List<CodeInstruction> codes = instructions.ToList(); if (codes[0].opcode != OpCodes.Newobj || codes[1].opcode != OpCodes.Stloc_0) { throw new Exception("CustomSlotItemLib Transpiler injection point NOT found!! Game has most likely updated and broken this mod!"); } yield return codes[0]; yield return codes[1]; yield return new CodeInstruction(OpCodes.Ldloc_0, (object)null); yield return new CodeInstruction(OpCodes.Ldarg_0, (object)null); yield return CodeInstruction.Call(typeof(Patches), "GetStatusEffectsFromCustomSlotItems", (Type[])null, (Type[])null); yield return CodeInstruction.Call(typeof(HashSet<StatusEffect>), "UnionWith", (Type[])null, (Type[])null); for (int i = 2; i < codes.Count; i++) { yield return codes[i]; } } } public string m_slotName; } [BepInPlugin("VitByr.VBQOL", "VBQOL", "0.2.2")] internal class VBQOL : BaseUnityPlugin { public enum TabPositions { Left, Middle, Right } [HarmonyPatch] public static class Patches { [HarmonyPrefix] [HarmonyPatch(typeof(Character), "IsSwimming")] public static bool IsSwimming_Prefix(Humanoid __instance, float ___m_swimTimer, ref bool __result) { if (___m_swimTimer >= 0.5f) { return true; } StackTrace stackTrace = new StackTrace(); string text = ""; for (int i = 2; i < stackTrace.FrameCount && i < 10; i++) { text = text + GeneralExtensions.FullDescription(stackTrace.GetFrame(i).GetMethod()) + "_"; } if (!((Character)__instance).IsPlayer() || (!text.Contains("UpdateEquipment") && !text.Contains("EquipItem"))) { return true; } if ((__instance.GetRightItem() != null && !EiW_Custom.Value.Split(',').Contains(((Object)__instance.GetRightItem().m_dropPrefab).name)) || (__instance.GetLeftItem() != null && !EiW_Custom.Value.Split(',').Contains(((Object)__instance.GetLeftItem().m_dropPrefab).name))) { __instance.HideHandItems(); } return false; } [HarmonyPrefix] [HarmonyPatch(typeof(Humanoid), "EquipItem")] private static void EquipItem_Prefix() { } [HarmonyPatch(typeof(Humanoid), "UpdateEquipment")] [HarmonyPrefix] private static void UpdateEquipment_Prefix() { } } [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int A_1) { Version = A_1; } } [HarmonyPatch(typeof(ZNet), "Start")] private static class FejdStartup_Start_Patch { [UsedImplicitly] private static void Postfix() { if (IsServer) { Application.targetFrameRate = ((BaseUnityPlugin)self).Config.Bind<int>("01 - General", "Target_FPS", Application.targetFrameRate, "Целевой FPS").Value; } } } [HarmonyPatch] private static class PatchMethods { [HarmonyTargetMethods] private static IEnumerable<MethodBase> Target() { yield return AccessTools.Method(typeof(ZSteamSocket), "Send", new Type[1] { typeof(ZPackage) }, (Type[])null); yield return AccessTools.Method(typeof(ZSteamSocket), "Flush", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZSteamSocket), "Update", (Type[])null, (Type[])null); } [HarmonyTranspiler] private static IEnumerable<CodeInstruction> FixingIssue(IEnumerable<CodeInstruction> code) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown List<CodeInstruction> list = new List<CodeInstruction>(code); MethodInfo methodInfo = AccessTools.Method(typeof(VBQOL), IsServer ? "Replacement_Server" : "Replacement_Client", (Type[])null, (Type[])null); MethodInfo targetMethod = AccessTools.Method(typeof(ZSteamSocket), "SendQueuedPackages", (Type[])null, (Type[])null); int num = list.FindIndex((CodeInstruction ins) => ins.opcode == OpCodes.Call && ins.operand == targetMethod); if (num == -1) { Logger.LogError((object)"VBQOL: Не удалось найти callvirt to ZSteamSocket.SendQueuedPackages"); return list; } list[num] = new CodeInstruction(OpCodes.Call, (object)methodInfo); return list; } } private const string ModName = "VBQOL"; private const string ModVersion = "0.2.2"; private const string ModGUID = "VitByr.VBQOL"; private Harmony harmony = new Harmony("VitByr.VBQOL"); internal static VBQOL self; private static ConfigEntry<string> EiW_Custom; internal ConfigEntry<int> nomorecrashes; internal GameObject recycleObject; internal Button recycleButton; internal float width; private Vector3 craftingPos; internal ConfigEntry<TabPositions> tabPosition; internal ConfigEntry<float> resourceMultiplier; internal ConfigEntry<bool> preserveOriginalItem; internal ConfigEntry<string> recyclebuttontext; private static string ConfigFileName = "VitByr.VBQOL.cfg"; private static string ConfigFileFullPath = Paths.ConfigPath + Path.DirectorySeparatorChar + ConfigFileName; private DateTime LastConfigChange; private static ConfigEntry<bool> serverConfigLocked = null; public Action OnConfigurationChanged; public static readonly ManualLogSource Logger = Logger.CreateLogSource("VBQOL"); public readonly ConfigSync configSync = new ConfigSync("VBQOL") { DisplayName = "VBQOL", CurrentVersion = "0.2.2", MinimumRequiredVersion = "0.2.2" }; private static ConfigEntry<float> Timeout { get; set; } private static bool IsServer => (int)SystemInfo.graphicsDeviceType == 4; internal bool InTabDeconstruct() { return !((Selectable)recycleButton).interactable; } private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_030d: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) self = this; Harmony.CreateAndPatchAll(typeof(VB_ClearLogPatch), (string)null); serverConfigLocked = config("01 - Awake", "Lock Configuration", value: true, new ConfigDescription("Вкл/ Выкл синхронизацию с сервером.", (AcceptableValueBase)null, Array.Empty<object>())); configSync.AddLockingConfigEntry<bool>(serverConfigLocked); nomorecrashes = config("01 - General", "Target_FPS", Application.targetFrameRate, "Целевой FPS", synchronizedSetting: false); Timeout = config("01 - General", "Timeout", 90f, "Время ожидания в секундах"); VB_AddAllFuel.AFModifierKeyConfig = config<KeyCode>("02 - AddAllFuel", "AFModifierKey", (KeyCode)304, "Клавиша для добавления сразу стака в печь/ плавильню.", synchronizedSetting: false); VB_AddAllFuel.AFTextConfig = config("02 - AddAllFuel", "AF_Extinguish_Text", "Добавить стак", "Текст отображаемый при наведении печь/костер", synchronizedSetting: false); VB_BuildDamage.enableModBDConfig = config("03 - BuildDamage", "BD_Enable_Section", value: true, "Включите или отключите этот раздел"); VB_BuildDamage.creatorDamageMultConfig = config("03 - BuildDamage", "BD_CreatorDamageMult", 0.75f, "Множитель урона от создателя постройки"); VB_BuildDamage.nonCreatorDamageMultConfig = config("03 - BuildDamage", "BD_NonCreatorDamageMult", 0.05f, "Множитель урона от не создателя постройки"); VB_BuildDamage.uncreatedDamageMultConfig = config("03 - BuildDamage", "BD_UncreatedDamageMult", 0.75f, "Множитель урона постройкам не созданным игроком"); VB_BuildDamage.naturalDamageMultConfig = config("03 - BuildDamage", "BD_NaturalDamageMult", 0.75f, "Множитель урона от погоды и монстров."); VB_BetterPickupNotifications.MessageLifetime = config("04 - BetterPickupNotifications", "BPN_MessageLifetime", 4f, "Как долго уведомление отображается в HUD, прежде чем исчезнуть", synchronizedSetting: false); VB_BetterPickupNotifications.MessageFadeTime = config("04 - BetterPickupNotifications", "BPN_MessageFadeTime", 2f, "Как долго исчезают уведомления", synchronizedSetting: false); VB_BetterPickupNotifications.MessageBumpTime = config("04 - BetterPickupNotifications", "BPN_MessageBumpTime", 2f, "Сколько времени добавлять к сроку действия уведомления при получении дублирующегося элемента", synchronizedSetting: false); VB_BetterPickupNotifications.ResetMessageTimerOnDupePickup = config("04 - BetterPickupNotifications", "BPN_ResetMessageTimerOnDupePickup", value: false, "Сбрасывает таймер уведомления на максимальное время жизни при получении дублирующегося предмета", synchronizedSetting: false); VB_BetterPickupNotifications.MessageVerticalSpacingModifier = config("04 - BetterPickupNotifications", "BPN_MessageVerticalSpacingModifier", 1.25f, "Вертикальное разделение между сообщениями"); VB_BetterPickupNotifications.MessageTextHorizontalSpacingModifier = config("04 - BetterPickupNotifications", "BPN_MessageTextHorizontalSpacingModifier", 2f, "Горизонтальный интервал между иконкой и текста уведомлений", synchronizedSetting: false); VB_BetterPickupNotifications.MessageTextVerticalModifier = config("04 - BetterPickupNotifications", "BPN_MessageTextVerticalModifier", 1f, "Вертикальное выравнивание текста уведомлений", synchronizedSetting: false); EiW_Custom = config("05 - EquipInWater", "EiW_Custom", "KnifeFlint,KnifeCopper,KnifeChitin,KnifeSilver,KnifeBlackMetal,KnifeButcher,KnifeSkollAndHati,SpearFlint,SpearBronze,SpearElderbark,SpearWolfFang,SpearChitin,SpearCarapace,PickaxeAntler,PickaxeBronze,PickaxeIron,PickaxeBlackMetal,Hammer,Hoe,FistFenrirClaw", "Разрешить использовать оружие/инструмент в воде"); VB_FirePlaceUtilites.extinguishItemsConfig = config("06 - EnableFire", "EF_Enable", value: true, "Вкл/Выкл секцию"); VB_FirePlaceUtilites.extinguishStringConfig = config("06 - EnableFire", "EF_Extinguish_Fire_Text", "Тушить огонь", "Текст отображаемый при наведении курсора на огонь", synchronizedSetting: false); VB_FirePlaceUtilites.igniteStringConfig = config("06 - EnableFire", "EF_Ignite_Fire_Text", "Разжечь огонь", "Текст, отображаемый при наведении курсора на огонь, если тот потушен", synchronizedSetting: false); VB_FirePlaceUtilites.keyPOCodeStringConfig = config<KeyCode>("06 - EnableFire", "EF_Put_Out_Fire_Key", (KeyCode)308, "Клавиша чтобы потушить огонь.", synchronizedSetting: false); Type typeFromHandle = typeof(KeyCode); KeyCode value = VB_FirePlaceUtilites.keyPOCodeStringConfig.Value; VB_FirePlaceUtilites.configPOKey = (KeyCode)Enum.Parse(typeFromHandle, ((object)(KeyCode)(ref value)).ToString()); tabPosition = config("07 - Recycle", "R_TabPosition", TabPositions.Left, "Положение вкладки Разобрать в меню крафта. (Требуется перезапуск)", synchronizedSetting: false); resourceMultiplier = config("07 - Recycle", "R_ResourceMultiplier", 0.35f, "Количество ресурсов, возвращаемых в результате разбора (от 0 до 1, где 1 возвращает 100% ресурсов, а 0 - 0%)"); preserveOriginalItem = config("07 - Recycle", "R_PreserveOriginalItem", value: true, "Сохранять ли данные оригинального предмета при понижении уровня. Полезно для модов, добавляющих дополнительные свойства к предметам, например EpicLoot.\nОтключите, если возникли проблемы."); recyclebuttontext = config("07 - Recycle", "R_RecycleButtonText", "Разобрать", "Текст кнопки в меню крафта", synchronizedSetting: false); QualitySettings.softParticles = false; QualitySettings.particleRaycastBudget = 1024; QualitySettings.softVegetation = false; QualitySettings.streamingMipmapsMemoryBudget = 4096f; SetupWatcher(); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); Harmony.CreateAndPatchAll(typeof(VB_AddAllFuel), (string)null); Harmony.CreateAndPatchAll(typeof(VB_Swampkey), (string)null); Harmony.CreateAndPatchAll(typeof(VB_BlastFurnaceTalesAll), (string)null); Harmony.CreateAndPatchAll(typeof(VB_FeedFromHandPatch), (string)null); Harmony.CreateAndPatchAll(typeof(VB_Pickable_UpdateRespawn_Patch), (string)null); Harmony.CreateAndPatchAll(typeof(VB_SlopeDamagePatch), (string)null); Harmony.CreateAndPatchAll(typeof(VB_SnakeCameraPatch), (string)null); Harmony.CreateAndPatchAll(typeof(VB_Timeout_Patch), (string)null); Harmony.CreateAndPatchAll(typeof(VB_CraftingStationLevelRange), (string)null); Harmony.CreateAndPatchAll(typeof(VB_AshLandsFix), (string)null); Harmony.CreateAndPatchAll(typeof(VB_WardPatch), (string)null); } public static int GetModifiedAmount(int quality, Requirement requirement) { return (int)Math.Round(self.resourceMultiplier.Value * (float)requirement.GetAmount(quality), 0); } public static bool HaveEmptySlotsForRecipe(Inventory inventory, Recipe recipe, int quality) { int emptySlots = inventory.GetEmptySlots(); int num = 0; Requirement[] resources = recipe.m_resources; foreach (Requirement requirement in resources) { if (GetModifiedAmount(quality, requirement) > 0) { num++; } } if (emptySlo