Files
barotrauma-localmods/ItemIO BetterMergeStack/CSharp/Client/Bmsmod.cs
2025-03-31 13:19:47 +02:00

93 lines
3.4 KiB
C#

using System.Reflection;
using Barotrauma.Extensions;
using Microsoft.Xna.Framework;
using HarmonyLib;
using System.Linq;
using Barotrauma;
using BmsUtils;
// debug
// using System.Diagnostics;
namespace Bms_Harmony
{
partial class BmsHarmony : ACsMod
{
const string harmony_id = "com.Bms.Harmony";
private readonly Harmony harmony;
public override void Stop()
{
harmony.UnpatchAll(harmony_id);
}
public BmsHarmony()
{
harmony = new Harmony(harmony_id);
harmony.PatchAll(Assembly.GetExecutingAssembly());
Barotrauma.DebugConsole.AddWarning("Loaded BmsHarmony");
}
[HarmonyPatch(typeof(Barotrauma.Items.Components.ItemContainer))]
class Patch_MergeStacks
{
static MethodBase TargetMethod()
{
Barotrauma.DebugConsole.AddWarning("Patch_MergeStacks TargetMethod");
return AccessTools.Method(typeof(Barotrauma.Items.Components.ItemContainer), "MergeStacks");
}
static bool Prefix(Barotrauma.Items.Components.ItemContainer __instance)
{
for (int i = 0; i < __instance.Inventory.Capacity - 1; i++)
{
var items = __instance.Inventory.GetItemsAt(i).ToList();
if (items.None()) { continue; }
if (items.First().Prefab.Identifier.ToString() == "StackBox" &&
items.First().OwnInventories.First().AllItemsMod.Any())
{
for (int j = 0; j < __instance.Inventory.Capacity - 1; j++)
{
var items2 = __instance.Inventory.GetItemsAt(j).ToList();
if (items2.None()) { continue; }
if (items2.First().Prefab.Identifier.ToString() != "StackBox")
{
items2.ForEach(it => __instance.Inventory.TryPutItem(it, i, allowSwapping: false, allowCombine: true, user: null, createNetworkEvent: false));
continue;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Barotrauma.Items.Components.ItemContainer))]
class Patch_CreateGUI
{
static MethodBase TargetMethod()
{
Barotrauma.DebugConsole.AddWarning("Patch_CreateGUI TargetMethod");
return AccessTools.Method(typeof(Barotrauma.Items.Components.ItemContainer), "CreateGUI");
}
static void Postfix(Barotrauma.Items.Components.ItemContainer __instance)
{
if (__instance.Inventory.Capacity > 1)
{
var layoutGroup = __instance.GuiFrame.FindChild(c => c is Barotrauma.GUILayoutGroup, recursive: true);
new GUIButton(new RectTransform(Vector2.One, layoutGroup.RectTransform, scaleBasis: ScaleBasis.Smallest), style: "PushButton")
{
ToolTip = TextManager.Get("bms.pushicon"),
OnClicked = (btn, userdata) =>
{
Util.PushItems(true);
return true;
}
};
}
}
}
}
}