public static void UpdateContainerNetworkData(Player player, Container container)
        {
            var containerZNewView = (ZNetView)(typeof(Container).GetField("m_nview", BindingFlags.Instance | BindingFlags.NonPublic)
                                               ?.GetValue(container));

            ReversePatches.ContainerSave(container);
            var containerUid = containerZNewView.GetZDO().m_uid;

            ZDOMan.instance.ForceSendZDO(player.GetPlayerID(), containerUid);
            containerZNewView.GetZDO().SetOwner(player.GetPlayerID());
        }
        private static int RemoveFromInventory(Inventory inventory, string name, int leftToRemove)
        {
            var currentInventoryCount = ReversePatches.InventoryCountItems(inventory, name);
            var itemsToTake           = currentInventoryCount < leftToRemove
                ? currentInventoryCount
                : leftToRemove;

            ReversePatches.InventoryRemoveItemByString(inventory, name, itemsToTake);
            leftToRemove -= itemsToTake;
            Plugin.Log.LogDebug($"Removed {itemsToTake} from inv {inventory.GetHashCode()}");
            return(leftToRemove);
        }
        // ReSharper disable once UnusedMember.Global
        public static void Postfix(ref Inventory __instance, string name, ref int __result)
        {
            if (!Plugin.Settings.CraftingWithContainersEnabled.Value)
            {
                return;
            }
            if (!InventoryTracker.ExpandedPlayerInventories.TryGetValue(__instance.GetHashCode(),
                                                                        out var extraInventories))
            {
                return;
            }
            var sum = new[] { extraInventories.Player.GetInventory() }
            .Concat(extraInventories.Containers.Select(container => container.GetInventory()))
            .Sum(inventory => ReversePatches.InventoryCountItems(inventory, name));

            __result = sum;
        }