Files
barotrauma-localmods/Lua Editor/Lua/findtarget.lua
2025-03-31 13:19:47 +02:00

155 lines
4.5 KiB
Lua

local findtarget = {}
-- findowner
findtarget.FindClientCharacter = function(character)
if CLIENT then return nil end
for key, value in pairs(Client.ClientList) do
if value.Character == character then
return value
end
end
end
findtarget.cursor_pos = Vector2(0, 0)
findtarget.cursor_updated = false
local function StringToTable(inputString)
local result = {}
if inputString == nil then
return result
end
for value in inputString:gmatch("[^,]+") do
table.insert(result, value)
end
return result
end
local function itemsorwalls(submarine)
if EditGUI.ClientsideSettings.targetingsetting == "Walls" and EditGUI.Settings.allowtargetingstructures == true then
targeting = "walls"
return submarine.GetWalls(false)
elseif EditGUI.ClientsideSettings.targetingsetting == "Hulls" and EditGUI.Settings.allowtargetingstructures == true then
targeting = "hulls"
return submarine.GetHulls(false)
elseif EditGUI.ClientsideSettings.targetingsetting == "Gaps" and EditGUI.Settings.allowtargetingstructures == true then
targeting = "gaps"
return submarine.GetGaps(false)
else
targeting = "items"
return submarine.GetItems(false)
end
end
local function FindClosestItem(submarine, position)
local closest = nil
for key, value in pairs(submarine and itemsorwalls(submarine) or Item.ItemList) do
if targeting == "items" then
if EditGUI.Settings.allowtargetingnoninteractable == true then
if EditGUI.ClientsideSettings.targetnoninteractable == "False" then
targetnoninter = value.NonInteractable == false
elseif EditGUI.ClientsideSettings.targetnoninteractable == "Target Both" then
targetnoninter = value.NonInteractable == false or true
elseif EditGUI.ClientsideSettings.targetnoninteractable == "Target Only Non Interactable" then
targetnoninter = value.NonInteractable == true
end
else
targetnoninter = value.NonInteractable == false
end
else
targetnoninter = true
end
if EditGUI.Settings.allowtargetingitems == true then
targetitems = EditGUI.ClientsideSettings.targetitems
else
targetitems = false
end
-- Check if the item has a parent inventory
if targeting == "items" then
hasParentInventory = value.ParentInventory ~= nil
end
-- Skip items with parent inventories
if hasParentInventory == EditGUI.ClientsideSettings.targetparentinventory or targeting ~= "items" then
local hasValidTag = true
if EditGUI.ClientsideSettings.tagstotarget ~= nil and targeting == "items" then
for _, tag in ipairs(StringToTable(EditGUI.ClientsideSettings.tagstotarget)) do
if value.HasTag(tag) then
hasValidTag = true
break
else
hasValidTag = false
end
end
end
for _, tag in ipairs(StringToTable(EditGUI.Settings.tagstonottarget)) do
if value.HasTag(tag) then
hasValidTag = false
break
end
end
if hasValidTag and targetnoninter then
-- check if placable or if it does not have holdable component
local check_if_p_or_nh = false
if targeting == "items" then
local holdable = value.GetComponentString("Holdable")
end
if targetitems == false then
if holdable == nil then
check_if_p_or_nh = true
else
if holdable.attachable == true then
check_if_p_or_nh = true
end
end
else
check_if_p_or_nh = true
end
if check_if_p_or_nh == true then
if Vector2.Distance(position, value.WorldPosition) < 100 then
if closest == nil then closest = value end
if Vector2.Distance(position, value.WorldPosition) <
Vector2.Distance(position, closest.WorldPosition) then
closest = value
end
end
end
end
end
end
return closest
end
findtarget.findtarget = function(item)
cursor_updated = false
if Client then
findtarget.cursor_pos = item.ParentInventory.Owner.CursorWorldPosition
cursor_updated = true
end
-- fallback
if not cursor_updated and Game.IsMultiplayer then
findtarget.cursor_pos = item.WorldPosition
end
if item.ParentInventory == nil or item.ParentInventory.Owner == nil then return end
local target = FindClosestItem(item.Submarine, findtarget.cursor_pos)
return target
end
return findtarget