Files
barotrauma-localmods/CykaQuick/Lua/Cyka/quickaccess.lua

133 lines
3.7 KiB
Lua

-- luacheck: globals MyModGlobal Character Hook EnsurePatch CLIENT
if not CLIENT then return end
local utils = require "Cyka.utils"
local dump = require "Cyka.dump"
-- TODO: Also cook terminal
-- terminal d:28 t:logic,smallitem c:Terminal, Holdable, ConnectionPanel,
local machines = "fabricator,deconstructor,medicalfabricator,navterminal"
Hook.Patch("Cyka", "Barotrauma.Character", "CanInteractWith",
{ "Barotrauma.Item", "System.Single&", "System.Boolean" },
function(_, ptable)
local item = ptable["item"]
if machines:find(tostring(item.Prefab.Identifier.Value)) then
ptable.ReturnValue = true
end
end,
Hook.HookMethodType.After
)
local cachedFabricator = nil
local cachedDeconstructor = nil
local cachedMedicalFabricator = nil
local cachedTerminal = nil
local function select(item)
MyModGlobal.debugPrint("Selecting " .. tostring(item))
item.Prefab.GrabWhenSelected = false
Character.Controlled.SelectedItem = item
end
---@param prefabIdentifier string
---@param componentName string
---@return Barotrauma.Item, Barotrauma.Items.Components
local function findByComponent(prefabIdentifier, componentName)
local items = utils.enqueueAllSubmarineItems({}, function(item)
return item.Prefab.Identifier.Value == prefabIdentifier, item.Prefab.Identifier.Value == prefabIdentifier
end)
if #items == 0 then
MyModGlobal.debugPrint("No " .. componentName .. " found")
return nil, nil
end
if #items > 1 then
MyModGlobal.debugPrint("Multiple " .. componentName .. " found, using first one")
return nil, nil
end
---@type Barotrauma.Item
local item = items[1]
---@type Barotrauma.Items.Components
local component
for itcomponent in item.Components do
if itcomponent.Name == componentName then
component = itcomponent
break
end
end
if not component then
MyModGlobal.debugPrint("No " .. componentName .. " component found")
return
end
return item, component
end
---@param force boolean
local function tryAccessFabricator(force)
local fabricator = cachedFabricator
if not fabricator or force then
fabricator = findByComponent("fabricator", "Fabricator")
if not fabricator then
MyModGlobal.debugPrint("No fabricator found")
return
end
cachedFabricator = fabricator
end
MyModGlobal.debugPrint("Selecting fabricator")
select(fabricator)
end
---@param force boolean
local function tryAccessDeconstructor(force)
local deconstructor = cachedDeconstructor
if not deconstructor or force then
deconstructor = findByComponent("deconstructor", "Deconstructor")
if not deconstructor then
MyModGlobal.debugPrint("No deconstructor found")
return
end
cachedDeconstructor = deconstructor
end
MyModGlobal.debugPrint("Selecting deconstructor")
select(deconstructor)
end
---@param force boolean
local function tryAccessMedicalFabricator(force)
local medicalFabricator = cachedMedicalFabricator
if not medicalFabricator or force then
medicalFabricator = findByComponent("medicalfabricator", "MedicalFabricator")
if not medicalFabricator then
MyModGlobal.debugPrint("No medical fabricator found")
return
end
cachedMedicalFabricator = medicalFabricator
end
MyModGlobal.debugPrint("Selecting medical fabricator")
select(medicalFabricator)
end
local function tryAccessTerminal(force)
local terminal = cachedTerminal
if not terminal or force then
terminal = findByComponent("navterminal", "Steering")
if not terminal then
MyModGlobal.debugPrint("No terminal found")
return
end
cachedTerminal = terminal
end
MyModGlobal.debugPrint("Selecting terminal")
select(terminal)
end
return {
tryAccessFabricator = tryAccessFabricator,
tryAccessDeconstructor = tryAccessDeconstructor,
tryAccessMedicalFabricator = tryAccessMedicalFabricator,
tryAccessTerminal = tryAccessTerminal,
}