#define DEBUG using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Text; using System.Threading; using BepInEx; using HarmonyLib; using SQLite; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.Localization.Settings; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("VoidPouch")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("VoidPouch")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("283868D3-098F-45B8-8765-597AD223EB42")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] public class BagHook : BaseUnityPlugin { [HarmonyPatch(typeof(PlayerInventory))] [HarmonyPatch("CheckBag")] [HarmonyPostfix] public static void CheckBag(PlayerInventory __instance) { VoidPouch.playerInventory = __instance; } [HarmonyPatch(typeof(PlayerInventory))] [HarmonyPatch("HandleDrop")] [HarmonyPostfix] public static void HandleDrop(PlayerInventory __instance) { //IL_00a3: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: 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_012a: 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) if (GameManager.Instance != null && ((NetworkBehaviour)GameManager.Instance).IsServer && UIManager.Instance != null && ((ButtonControl)Keyboard.current.cKey).wasPressedThisFrame) { if (VoidPouch.playerInventory == null) { VoidPouch.playerInventory = __instance; } FieldInfo field = typeof(PlayerInventory).GetField("currentSlot", BindingFlags.Instance | BindingFlags.NonPublic); object value = field.GetValue(__instance); PropertyInfo property = value.GetType().GetProperty("Value"); int num = (int)property.GetValue(value); if (__instance.slots[num].itemId != -1) { LanVoidPouch lanVoidPouch = new LanVoidPouch(VoidPouch.slotName, VoidPouch.mapName, __instance.slots[num].itemId, __instance.slots[num].amount, __instance.slots[num].cost, __instance.slots[num].dayCounter, IsSave: false, deleted: false); lanVoidPouch.Insert(VoidPouch.connection); __instance.slots[num] = new InventorySlot { itemId = -1L, amount = -1, cost = -1, dayCounter = -1 }; } } } [HarmonyPatch(typeof(SaveManager))] [HarmonyPatch("SaveGame")] [HarmonyPostfix] public static void OnDayChanged(SaveManager __instance) { LanVoidPouch.Save(VoidPouch.connection, VoidPouch.slotName, VoidPouch.mapName); } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerInteraction), "Update")] public static void PlayerInteraction_Update_Postfix(PlayerInteraction __instance) { if (GameManager.Instance != null && ((NetworkBehaviour)GameManager.Instance).IsServer && UIManager.Instance != null && Mouse.current != null && Mouse.current.leftButton.wasPressedThisFrame && ((Object)(object)VoidPouch._myVoidPanel == (Object)null || !VoidPouch._myVoidPanel.activeSelf) && !Cursor.visible) { AttemptDeleteItem(__instance); } } private static void AttemptDeleteItem(PlayerInteraction playerInteraction) { //IL_004c: 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_005b: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) Camera main = Camera.main; if ((Object)(object)main == (Object)null) { return; } FieldInfo field = typeof(PlayerInteraction).GetField("isInteractionEnabled", BindingFlags.Instance | BindingFlags.NonPublic); if (!(bool)field.GetValue(playerInteraction)) { return; } Ray val = main.ViewportPointToRay(Vector3.one / 2f); RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, ref val2, playerInteraction.interactionDistance, LayerMask.op_Implicit(playerInteraction.layerMask), (QueryTriggerInteraction)1)) { Item componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && ((Interactable)componentInParent).CanInteract()) { ExecuteItemDeletion(componentInParent); } } } private static void ExecuteItemDeletion(Item item) { LanVoidPouch lanVoidPouch = new LanVoidPouch(VoidPouch.slotName, VoidPouch.mapName, item.itemSO.id, item.amount.Value, item.cost, item.dayCounter.Value, IsSave: false, deleted: false); lanVoidPouch.Insert(VoidPouch.connection); ((Component)item).gameObject.SetActive(false); if ((Object)(object)((NetworkBehaviour)item).NetworkObject != (Object)null) { ((NetworkBehaviour)item).NetworkObject.Despawn(true); } } } public class CustomButton : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public Image image; public TextMeshProUGUI textSubtitle; public TextMeshProUGUI textAmount; private int lanVoidPouchId; private long itemSoId; private string localName; private int number; private TextMeshProUGUI _targetInfoText; public void SetData(int lanVoidPouchId, long itemSoId, int amount, string localName, int number, TextMeshProUGUI infoText) { this.lanVoidPouchId = lanVoidPouchId; this.itemSoId = itemSoId; _targetInfoText = infoText; this.localName = localName; this.number = number; if ((Object)(object)textAmount != (Object)null) { ((TMP_Text)textAmount).text = amount.ToString(); } } public void OnPointerEnter(PointerEventData eventData) { if ((Object)(object)_targetInfoText != (Object)null) { ((TMP_Text)_targetInfoText).text = $"{localName}: {number}"; } } public void OnPointerExit(PointerEventData eventData) { if ((Object)(object)_targetInfoText != (Object)null) { ((TMP_Text)_targetInfoText).text = ""; } } } public class LanVoidPouch { [PrimaryKey] [AutoIncrement] [Column("id")] public int Id { get; set; } [NotNull] [Column("saveName")] public string SaveName { get; set; } [NotNull] [Column("mapName")] public string MapName { get; set; } [NotNull] [Column("itemsoId")] public long ItemsoId { get; set; } [NotNull] [Column("amount")] public int Amount { get; set; } [NotNull] [Column("cost")] public int Cost { get; set; } [NotNull] [Column("dayCounter")] public int DayCounter { get; set; } [NotNull] [Column("isSave")] public bool IsSave { get; set; } [NotNull] [Column("Deleted")] public bool Deleted { get; set; } public LanVoidPouch() { } public LanVoidPouch(string saveName, string mapName, long itemsoId, int amount, int cost, int dayCounter, bool IsSave, bool deleted) { SaveName = saveName; MapName = mapName; ItemsoId = itemsoId; Amount = amount; Cost = cost; DayCounter = dayCounter; this.IsSave = IsSave; Deleted = deleted; } public long Insert(SQLiteConnection connection) { return connection.Execute("INSERT INTO LanVoidPouch (SaveName, MapName, ItemsoId, Amount, Cost, DayCounter, IsSave, Deleted) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", SaveName, MapName, ItemsoId, Amount, Cost, DayCounter, IsSave, Deleted); } public void Delete(SQLiteConnection connection) { connection.Execute("UPDATE LanVoidPouch SET Deleted = 1 , isSave = 0 WHERE Id = ?", Id); } public static void Save(SQLiteConnection connection, string saveName, string mapName) { connection.Execute("UPDATE LanVoidPouch SET IsSave = TRUE WHERE SaveName = ? AND MapName = ?", saveName, mapName); connection.Execute("DELETE FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND Deleted = TRUE", saveName, mapName); } public static void DeleteNotSave(SQLiteConnection connection, string saveName, string mapName) { connection.Execute("UPDATE LanVoidPouch SET IsSave = TRUE, Deleted = FALSE WHERE SaveName = ? AND MapName = ? AND Deleted = TRUE", saveName, mapName); connection.Execute("DELETE FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND IsSave = 0", saveName, mapName); } public static List FindBySaveNameAndMapName(SQLiteConnection connection, string saveName, string mapName) { return connection.Query("SELECT * FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND Deleted = 0 ORDER BY ItemsoId", new object[2] { saveName, mapName }); } public static List FindBySaveNameAndMapNameAndItemSoId(SQLiteConnection connection, string saveName, string mapName, long itemSoId) { return connection.Query("SELECT * FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND ItemsoId = ? AND Deleted = 0", new object[3] { saveName, mapName, itemSoId }); } public static LanVoidPouch HasItemInSlot(SQLiteConnection connection, string saveName, string mapName, long itemSoId) { return connection.Query("SELECT * FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND itemsoId = ? AND Deleted = 0 ORDER BY Amount ASC", new object[3] { saveName, mapName, itemSoId }).FirstOrDefault(); } public static void DecreaseItemInSlot(SQLiteConnection connection, string saveName, string mapName, long itemSoId) { List list = connection.Query("SELECT * FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND itemsoId = ? AND Deleted = 0 ORDER BY Amount ASC", new object[3] { saveName, mapName, itemSoId }); if (list.Count > 0) { LanVoidPouch lanVoidPouch = list[0]; if (lanVoidPouch.Amount == 1) { lanVoidPouch.Delete(connection); return; } lanVoidPouch.Delete(connection); connection.Insert(new LanVoidPouch(saveName, mapName, itemSoId, lanVoidPouch.Amount - 1, lanVoidPouch.Cost, lanVoidPouch.DayCounter, IsSave: false, deleted: false)); } } public static int GetItemAmountInSlot(SQLiteConnection connection, string saveName, string mapName, long itemSoId) { List list = connection.Query("SELECT * FROM LanVoidPouch WHERE SaveName = ? AND MapName = ? AND ItemsoId = ? AND Deleted = 0", new object[3] { saveName, mapName, itemSoId }); ItemSO itemById = GameManager.Instance.GetItemById(itemSoId); if (itemById.amount > 0) { int num = 0; foreach (LanVoidPouch item in list) { num += item.Amount; } return num; } return list.Sum((LanVoidPouch lanVoidPouch) => lanVoidPouch.Amount); } } public class RestockHook : BaseUnityPlugin { [HarmonyPrefix] [HarmonyPatch(typeof(RestockerWait), "OnUpdate")] public static bool OnUpdate(RestockerWait __instance) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0117: 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) if (!((NetworkBehaviour)GameManager.Instance).IsHost) { return true; } FieldInfo field = typeof(RestockerWait).GetField("rc", BindingFlags.Instance | BindingFlags.NonPublic); RestockerController val = (RestockerController)field.GetValue(__instance); if (val.HasReachedDestination(1f)) { val.agent.isStopped = true; val.ChangeAnimationState(__instance.idleAnimation, 0.05f); ((Component)val).transform.rotation = Quaternion.Slerp(((Component)val).transform.rotation, val.GetInitialRotation(), 5f * Time.deltaTime); } FieldInfo field2 = typeof(RestockerWait).GetField("timer", BindingFlags.Instance | BindingFlags.NonPublic); float num = (float)field2.GetValue(__instance); num += Time.deltaTime; field2.SetValue(__instance, num); if (num < __instance.waitTime) { return false; } if (!FindItemToRestock(__instance)) { field2.SetValue(__instance, 0f); if ((double)Vector3.Distance(((Component)val).transform.position, val.GetInitialPosition()) <= 1.0) { return false; } val.agent.isStopped = false; val.GoToStartPosition(); val.ChangeAnimationState(__instance.walkAnimation, 0.05f); } return false; } public static bool FindItemToRestock(RestockerWait __instance) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) FieldInfo field = typeof(RestockerWait).GetField("rc", BindingFlags.Instance | BindingFlags.NonPublic); RestockerController rc = (RestockerController)field.GetValue(__instance); foreach (Item item2 in (from x in Object.FindObjectsOfType() where x.onStand.Value && x.amount.Value <= 0 && !x.IsRestockTarget() select x into go orderby Vector3.Distance(((Component)go).transform.position, ((Component)rc).transform.position) select go).ToList()) { Item item = item2; List list = LanVoidPouch.FindBySaveNameAndMapNameAndItemSoId(VoidPouch.connection, VoidPouch.slotName, VoidPouch.mapName, item.itemSO.id); if (list != null && list.Count > 0) { FieldInfo field2 = typeof(RestockerController).GetField("inventorySlot", BindingFlags.Instance | BindingFlags.NonPublic); NetworkVariable val = (NetworkVariable)field2.GetValue(rc); val.Value = new InventorySlot { itemId = list[0].ItemsoId, amount = list[0].Amount, cost = list[0].Cost, dayCounter = list[0].DayCounter }; list[0].Delete(VoidPouch.connection); Item val2 = Object.FindAnyObjectByType(); rc.SetItems(item, val2); rc.SetDestination(((Component)rc.targetItem).transform); rc.ChangeState(rc.stateRestockTarget); return true; } List list2 = (from x in Object.FindObjectsOfType() where (Object)(object)x.itemSO == (Object)(object)item.itemSO && x.IsInFreezer() && x.amount.Value > 0 && !x.IsRestockSource() select x into go orderby Vector3.Distance(((Component)go).transform.position, ((Component)rc).transform.position) select go).ToList(); if (list2.Count > 0) { rc.SetItems(item, list2[0]); rc.SetDestination(((Component)rc.sourceItem).transform); rc.ChangeState(__instance.stateTakeSource); return true; } } return false; } } public class GameManagerHook : BaseUnityPlugin { [HarmonyPatch(typeof(GameManager))] [HarmonyPatch("OnTimelineChanged")] [HarmonyPostfix] public static void LoadWorldServer(GameManager __instance, float previous, float current) { WorldData val = SaveManager.Instance.LoadWorldData(); if (val != null && !((double)current < 6.05) && !((double)current > 6.08) && !(val.timeline < 6.05f)) { __instance.SetTimelineServer(val.timeline); } } } [BepInPlugin("com.lan.VoidPouch", "储物魂导器", "1.5.2")] public class VoidPouch : BaseUnityPlugin { public class Listen : MonoBehaviour { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func <>9__7_0; public static Func, long> <>9__7_1; public static Func <>9__7_3; public static Func, int> <>9__7_2; public static UnityAction <>9__8_0; internal long b__7_0(LanVoidPouch x) { return x.ItemsoId; } internal long b__7_1(IGrouping g) { return g.Key; } internal int b__7_2(IGrouping g) { LanVoidPouch lanVoidPouch = g.First(); ItemSO itemById = GameManager.Instance.GetItemById(lanVoidPouch.ItemsoId); if ((Object)(object)itemById != (Object)null && itemById.amount > 1) { return g.Count(); } return g.Sum((LanVoidPouch x) => x.Amount); } internal int b__7_3(LanVoidPouch x) { return x.Amount; } internal void b__8_0() { HidePanel(); } } [CompilerGenerated] private sealed class <>c__DisplayClass7_0 { public LanVoidPouch item; public Listen <>4__this; internal void b__4() { playerInventory.GiveItemServerRpc(item.ItemsoId, item.Amount, item.Cost, item.DayCounter); item.Delete(connection); <>4__this.OpenUI(); } } [CompilerGenerated] private sealed class d__7 : IEnumerator, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public Listen <>4__this; private List 5__1; private Dictionary 5__2; private TextMeshProUGUI[] 5__3; private TextMeshProUGUI 5__4; private List