-- 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, RELOAD = Keys.R, STACK_TO_CURSOR = Keys.G, LOOT = Keys.L, SONAR = Keys.X, AOEPICKUP = Keys.Y, QICK_FABRICATOR = Keys.K, QICK_DECONSTRUCTOR = Keys.J, QICK_MEDICAL_FABRICATOR = Keys.M, NESTED_CONTAINERS = true, DEBUG_MODE = true, }, MOD_NAME = "Cyka Quick", 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") local quickreload = require("Cyka.quickreload") local quickloot = require("Cyka.quickloot") local sonarpinger = require("Cyka.sonarpinger") local aoepickup = require("Cyka.aoepickup") local quickaccess = require("Cyka.quickaccess") require("Cyka.xpticker") require("Cyka.zoom") -- TODO: Keybind fabricator / medical fabricator / deconstructor on the sub 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.STACK_TO_CURSOR) then return end if not PlayerInput.IsShiftDown() then quickstack.stackToCursor() else quickstack.stackAllToCursor() end 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) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.RELOAD) then return end quickreload.tryReloadCursorItem(PlayerInput.IsShiftDown()) end, Hook.HookMethodType.After) -- Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) -- if not PlayerInput.KeyHit(MyModGlobal.CONFIG.LOOT) then return end -- quickloot.tryLoot() -- end, Hook.HookMethodType.After) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.SONAR) then return end sonarpinger.tryPing() end, Hook.HookMethodType.After) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.AOEPICKUP) then return end aoepickup.tryAoePickup() end, Hook.HookMethodType.After) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.QICK_FABRICATOR) then return end quickaccess.tryAccessFabricator(PlayerInput.IsShiftDown()) end, Hook.HookMethodType.After) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.QICK_DECONSTRUCTOR) then return end quickaccess.tryAccessDeconstructor(PlayerInput.IsShiftDown()) end, Hook.HookMethodType.After) Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable) if not PlayerInput.KeyHit(MyModGlobal.CONFIG.QICK_MEDICAL_FABRICATOR) then return end quickaccess.tryAccessMedicalFabricator(PlayerInput.IsShiftDown()) end, Hook.HookMethodType.After)