Files
barotrauma-localmods/QuickStackToBag/Lua/Autorun/init.lua
2025-03-30 20:33:04 +02:00

121 lines
4.9 KiB
Lua

-- luacheck: globals MyModGlobal
-- luacheck: read_globals Character SERVER Keys LuaUserData Hook Descriptors PlayerInput Timer
-- luacheck: max line length 420
if SERVER then return end
-- Docs: https://evilfactory.github.io/LuaCsForBarotrauma/lua-docs/manual/common-questions/
---@class MyModGlobal
---@field CONFIG {QUICKSTACK_KEYS: Keys, FABRICATOR_KEY: Keys, MAX_BUY: Keys, NESTED_CONTAINERS: boolean, DEBUG_MODE: boolean}
---@field MOD_NAME string
---@field MOD_VERSION string
---@field DumpTable fun(table: table, depth?: number)
---@field debugPrint fun(message: string)
MyModGlobal = {
CONFIG = {
QUICKSTACK_KEYS = Keys.F,
FABRICATOR_KEY = Keys.V,
MAX_BUY = Keys.B,
FIX = Keys.R,
UNLOAD = Keys.E,
NESTED_CONTAINERS = true,
DEBUG_MODE = true,
},
MOD_NAME = "Quick Stack To Containers",
MOD_VERSION = "1.1.0",
BAG_SLOT = 8,
}
---@param table table
---@param depth number?
MyModGlobal.DumpTable = function(table, depth)
if depth == nil then
depth = 0
end
if (depth > 200) then
print("Error: Depth > 200 in dumpTable()")
return
end
for k, v in pairs(table) do
if (type(v) == "table") then
print(string.rep(" ", depth) .. k .. ":")
MyModGlobal.DumpTable(v, depth + 1)
else
print(string.rep(" ", depth) .. k .. ": ", v)
end
end
end
-- Debugging helper function
MyModGlobal.debugPrint = function(message)
if MyModGlobal.CONFIG.DEBUG_MODE then
print("[" .. MyModGlobal.MOD_NAME .. "] " .. message)
end
end
local quickstack = require("Cyka.quickstack")
local fabricatorstack = require("Cyka.fabricatorstack")
local quickbuy = require("Cyka.quickbuy")
local hotkeyrepair = require("Cyka.hotkeyrepair")
local cursormacroer = require("Cyka.cursormacroer")
local quickunload = require("Cyka.quickunload")
require("Cyka.xpticker")
print(MyModGlobal.MOD_NAME .. " v" .. MyModGlobal.MOD_VERSION .. " loaded!")
-- Register necessary types and make fields accessible
LuaUserData.RegisterType("Barotrauma.Items.Components.ItemContainer+SlotRestrictions")
LuaUserData.RegisterType(
'System.Collections.Immutable.ImmutableArray`1[[Barotrauma.Items.Components.ItemContainer+SlotRestrictions, Barotrauma]]')
LuaUserData.MakeFieldAccessible(Descriptors['Barotrauma.Items.Components.ItemContainer'], 'slotRestrictions')
LuaUserData.MakeFieldAccessible(Descriptors['Barotrauma.ItemInventory'], 'slots')
LuaUserData.MakeFieldAccessible(Descriptors['Barotrauma.ItemInventory'], 'slotsPerRow')
LuaUserData.MakeFieldAccessible(Descriptors["Barotrauma.CharacterInventory"], "slots")
LuaUserData.RegisterType("Barotrauma.Store")
LuaUserData.RegisterType("Barotrauma.GUIComponent")
LuaUserData.RegisterType("Barotrauma.PurchasedItem")
LuaUserData.RegisterType("Barotrauma.ItemPrefab")
LuaUserData.RegisterType("Barotrauma.Location+StoreInfo")
LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.CargoManager"], "GetConfirmedSoldEntities")
LuaUserData.RegisterType("Barotrauma.Items.Components.Repairable")
LuaUserData.RegisterType("Barotrauma.VisualSlot")
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.QUICKSTACK_KEYS) then return end
quickstack.quickStackItems(instance)
end, Hook.HookMethodType.After)
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.FABRICATOR_KEY) then return end
fabricatorstack.tryStackFabricator(instance)
end, Hook.HookMethodType.After)
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.FIX) then return end
hotkeyrepair.tryRepair()
end, Hook.HookMethodType.After)
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.MAX_BUY) then return end
quickbuy.tryBuy()
end, Hook.HookMethodType.After)
local throttle = 0.1
local throttleTimer = 0
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if PlayerInput.Mouse4ButtonClicked() then
cursormacroer.setTargetInventory()
end
if not PlayerInput.IsAltDown() then return end
if Timer.GetTime() < throttleTimer then return end
throttleTimer = Timer.GetTime() + throttle
-- We can not use shift because holding shift means we're moving half a stack
-- Fuck me sideways
-- if not PlayerInput.IsShiftDown() then return end
-- if not PlayerInput.PrimaryMouseButtonClicked() then return end
cursormacroer.tryStackCursorItem()
end, Hook.HookMethodType.After)
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.UNLOAD) then return end
quickunload.tryUnloadCursorItem()
end, Hook.HookMethodType.After)