155 lines
4.5 KiB
Lua
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
|