-- Bundled by luabundle {"version":"1.6.0"} local __bundle_require, __bundle_loaded, __bundle_register, __bundle_modules = (function(superRequire) local loadingPlaceholder = {[{}] = true} local register local modules = {} local require local loaded = {} register = function(name, body) if not modules[name] then modules[name] = body end end require = function(name) local loadedModule = loaded[name] if loadedModule then if loadedModule == loadingPlaceholder then return nil end else if not modules[name] then if not superRequire then local identifier = type(name) == 'string' and '\"' .. name .. '\"' or tostring(name) error('Tried to require ' .. identifier .. ', but no such module has been registered') else return superRequire(name) end end loaded[name] = loadingPlaceholder loadedModule = modules[name](require, loaded, register, modules) loaded[name] = loadedModule end return loadedModule end return require, loaded, register, modules end)(nil) __bundle_register("__root", function(require, _LOADED, __bundle_register, __bundle_modules) require("accessories/SearchAssistant") end) __bundle_register("accessories/SearchAssistant", function(require, _LOADED, __bundle_register, __bundle_modules) local deckLib = require("util/DeckLib") local playermatApi = require("playermat/PlayermatApi") local searchLib = require("util/SearchLib") -- forward declaration of variables that are used across functions local matColor, handColor, setAsidePosition, setAsideRotation, drawDeckPosition, topCardDetected local addedVectorLines, addedSnapPoint local quickParameters = {} quickParameters.function_owner = self quickParameters.font_size = 165 quickParameters.width = 275 quickParameters.height = 275 quickParameters.color = "White" -- common parameters local buttonParameters = {} buttonParameters.function_owner = self buttonParameters.font_size = 125 buttonParameters.width = 650 buttonParameters.height = 225 buttonParameters.color = "White" local inputParameters = {} inputParameters.function_owner = self inputParameters.input_function = "updateSearchNumber" inputParameters.tooltip = "custom search amount" inputParameters.label = "#" inputParameters.font_size = 175 inputParameters.width = 400 inputParameters.height = inputParameters.font_size + 23 inputParameters.position = { 0, 0.11, 0 } inputParameters.alignment = 3 inputParameters.validation = 2 function onLoad() normalView() self.max_typed_number = 9999 end -- regular view with search box function normalView() self.clearButtons() self.clearInputs() self.createInput(inputParameters) -- create custom search button buttonParameters.click_function = "searchCustom" buttonParameters.tooltip = "Search the entered number of cards" buttonParameters.position = { 0, 0.11, 0.65 } buttonParameters.label = "Search" self.createButton(buttonParameters) -- create buttons to search 3, 6 or 9 cards quickParameters.click_function = "search3" quickParameters.label = "3" quickParameters.position = { -0.65, 0.11, -0.65 } self.createButton(quickParameters) quickParameters.click_function = "search6" quickParameters.label = "6" quickParameters.position = { 0, 0.11, -0.65 } self.createButton(quickParameters) quickParameters.click_function = "search9" quickParameters.label = "9" quickParameters.position = { 0.65, 0.11, -0.65 } self.createButton(quickParameters) end -- click functions function search3(_, playerColor) startSearch(playerColor, 3) end function search6(_, playerColor) startSearch(playerColor, 6) end function search9(_, playerColor) startSearch(playerColor, 9) end -- view during a search with "done" buttons function searchView() self.clearButtons() self.clearInputs() -- create the "End Search" button buttonParameters.click_function = "endSearch" buttonParameters.tooltip = "Left-click: Return cards and shuffle\nRight-click: Return cards without shuffling" buttonParameters.position = { 0, 0.11, 0 } buttonParameters.label = "End Search" self.createButton(buttonParameters) end -- input_function to get number of cards to search function updateSearchNumber(_, _, input) inputParameters.value = tonumber(input) end function onNumberTyped(playerColor, number) startSearch(playerColor, number) end -- starts the search with the number from the input field function searchCustom(_, messageColor) local number = inputParameters.value if number ~= nil then startSearch(messageColor, number) else printToColor("Enter the number of cards to search in the textbox.", messageColor, "Orange") end end -- start the search (change UI, set handCards aside, draw cards) function startSearch(messageColor, number) matColor = playermatApi.getMatColorByPosition(self.getPosition()) handColor = playermatApi.getPlayerColor(matColor) topCardDetected = false -- get draw deck local deckAreaObjects = playermatApi.getDeckAreaObjects(matColor) if deckAreaObjects.draw == nil then printToColor(matColor .. " draw deck could not be found!", messageColor, "Red") return end -- get bounds to know the height of the deck local bounds = deckAreaObjects.draw.getBounds() drawDeckPosition = bounds.center + Vector(0, bounds.size.y / 2 + 0.2, 0) printToColor("Place target(s) of search on set aside spot.", messageColor, "Green") -- get playermat orientation local offset = -15 if matColor == "Orange" or matColor == "Red" then offset = 15 end -- get position and rotation for set aside cards local handData = Player[handColor].getHandTransform() local handCards = Player[handColor].getHandObjects() setAsidePosition = (handData.position + offset * handData.right):setAt("y", 1.5) setAsideRotation = Vector(handData.rotation.x, handData.rotation.y + 180, 180) -- place hand cards set aside if #handCards > 0 then deckLib.placeOrMergeIntoDeck(handCards, setAsidePosition, setAsideRotation) end -- add a temporary snap point for the set aside spot addedSnapPoint = { position = setAsidePosition, rotation = setAsideRotation } local snapPoints = Global.getSnapPoints() or {} table.insert(snapPoints, addedSnapPoint) Global.setSnapPoints(snapPoints) -- add a temporary box for the set aside spot local vectorLines = Global.getVectorLines() or {} local boxSize = Vector(2.5, 0, 3.5) addedVectorLines = generateBoxData(setAsidePosition, boxSize, setAsideRotation.y, handColor) for _, line in ipairs(addedVectorLines) do table.insert(vectorLines, line) end Global.setVectorLines(vectorLines) -- handling for Norman Withers if deckAreaObjects.topCard then deckAreaObjects.topCard.setRotation(setAsideRotation) topCardDetected = true end searchView() Wait.time(function() deckAreaObjects = playermatApi.getDeckAreaObjects(matColor) deckAreaObjects.draw.deal(number, handColor) end, 1) end -- place handCards back into deck and optionally shuffle function endSearch(_, _, isRightClick) local handCards = Player[handColor].getHandObjects() -- place cards on deck deckLib.placeOrMergeIntoDeck(handCards, drawDeckPosition, setAsideRotation) -- draw set aside cards (from the ground!) Wait.time(drawSetAsideCards, 0.5 + #handCards * 0.1) normalView() Wait.time(function() -- maybe shuffle deck if not isRightClick then local deckAreaObjects = playermatApi.getDeckAreaObjects(matColor) if deckAreaObjects.draw then deckAreaObjects.draw.shuffle() end end -- Norman Withers handling if topCardDetected then playermatApi.flipTopCardFromDeck(matColor) end end, 1 + #handCards * 0.1) end function drawSetAsideCards() for _, obj in ipairs(searchLib.atPosition(setAsidePosition, "isCardOrDeck")) do local count = 1 if obj.type == "Deck" then count = #obj.getObjects() end obj.deal(count, handColor) end removeAddedSnapAndLines() end function removeAddedSnapAndLines() local vectorLines = Global.getVectorLines() or {} local snapPoints = Global.getSnapPoints() or {} -- look for previously added data and remove it (iterate in reverse because we're removing entries) for i = #vectorLines, 1, -1 do for _, boxLine in ipairs(addedVectorLines) do if vectorLines[i].points[1] == boxLine.points[1] and vectorLines[i].points[2] == boxLine.points[2] then table.remove(vectorLines, i) break end end end for i = #snapPoints, 1, -1 do if snapPoints[i].position == addedSnapPoint.position then table.remove(snapPoints, i) break end end Global.setVectorLines(vectorLines) Global.setSnapPoints(snapPoints) end -- generates the lines data for a rectangular box ---@param center tts__Vector Center of the box ---@param size tts__Vector X and Z dimension of the box ---@param rotation number Rotation around the Y-axis for the box ---@param boxColor string Color for the box ---@return table lines Vector line data for the box function generateBoxData(center, size, rotation, boxColor) local halfWidth = size.x / 2 local halfDepth = size.z / 2 -- corners of the box in local coordinates local corners = { Vector(-halfWidth, 0, -halfDepth), Vector(halfWidth, 0, -halfDepth), Vector(halfWidth, 0, halfDepth), Vector(-halfWidth, 0, halfDepth) } -- translate corners to global coordinates for i, cornerVec in ipairs(corners) do local rotatedCornerVec = cornerVec:rotateOver('y', rotation) corners[i] = rotatedCornerVec + center end -- generate the lines data local lines = { { points = { corners[1], corners[2] }, color = boxColor }, { points = { corners[2], corners[3] }, color = boxColor }, { points = { corners[3], corners[4] }, color = boxColor }, { points = { corners[4], corners[1] }, color = boxColor } } return lines end end) __bundle_register("playermat/PlayermatApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local PlayermatApi = {} local guidReferenceApi = require("core/GUIDReferenceApi") local searchLib = require("util/SearchLib") local localInvestigatorPosition = { x = -1.17, y = 1, z = -0.01 } -- Convenience function to look up a mat's object by color, or get all mats. ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@return table: Single-element if only single playermat is requested local function getMatForColor(matColor) if matColor == "All" then return guidReferenceApi.getObjectsByType("Playermat") else return { matColor = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") } end end -- Returns the color of the closest playermat ---@param startPos table Starting position to get the closest mat from PlayermatApi.getMatColorByPosition = function(startPos) local result, smallestDistance for matColor, mat in pairs(getMatForColor("All")) do local distance = Vector.between(startPos, mat.getPosition()):magnitude() if smallestDistance == nil or distance < smallestDistance then smallestDistance = distance result = matColor end end return result end -- Returns the color of the player's hand that is seated next to the playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.getPlayerColor = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("playerColor") end end -- Returns the color of the playermat that owns the playercolor's hand ---@param handColor string Color of the playermat PlayermatApi.getMatColor = function(handColor) for matColor, mat in pairs(getMatForColor("All")) do local playerColor = mat.getVar("playerColor") if playerColor == handColor then return matColor end end end -- Instructs a playermat to check for DES ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.checkForDES = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("checkForDES") end end -- Returns if there is the card "Dream-Enhancing Serum" on the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") ---@return boolean: whether DES is present on the playermat PlayermatApi.hasDES = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("hasDES") end end -- gets the slot data for the playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.getSlotData = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getTable("slotData") end end -- sets the slot data for the playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") ---@param newSlotData table New slot data for the playermat PlayermatApi.loadSlotData = function(matColor, newSlotData) for _, mat in pairs(getMatForColor(matColor)) do mat.setTable("slotData", newSlotData) mat.call("redrawSlotSymbols") return end end -- Performs a search of the deck area of the requested playermat and returns the result as table ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.getDeckAreaObjects = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getDeckAreaObjects") end end -- Flips the top card of the deck (useful after deck manipulation for Norman Withers) ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.flipTopCardFromDeck = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("flipTopCardFromDeck") end end -- Returns the position of the discard pile of the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.getDiscardPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDiscardPosition") end end -- Returns the position of the draw pile of the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.getDrawPosition = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("returnGlobalDrawPosition") end end -- Transforms a local position into a global position ---@param localPos table Local position to be transformed ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.transformLocalPosition = function(localPos, matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.positionToWorld(localPos) end end -- Returns the rotation of the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.returnRotation = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getRotation() end end -- Returns a table with spawn data (position and rotation) for a helper object ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@param helperName string Name of the helper object PlayermatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { ["Hand Helper"] = {0.05, 0, -1.182}, ["Search Assistant"] = {-0.3, 0, -1.182} } for color, mat in pairs(getMatForColor(matColor)) do resultTable[color] = { position = mat.positionToWorld(localPositionTable[helperName]), rotation = mat.getRotation() } end return resultTable end -- Triggers the Upkeep for the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@param playerColor string Color of the calling player (for messages) PlayermatApi.doUpkeepFromHotkey = function(matColor, playerColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doUpkeepFromHotkey", playerColor) end end -- Handles discarding for the requested playermat for the provided list of objects ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") ---@param objList table List of objects to discard PlayermatApi.discardListOfObjects = function(matColor, objList) for _, mat in pairs(getMatForColor(matColor)) do mat.call("discardListOfObjects", objList) end end -- Returns the active investigator id ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.returnInvestigatorId = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorId") end end -- Returns the class of the active investigator ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") PlayermatApi.returnInvestigatorClass = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do return mat.getVar("activeInvestigatorClass") end end -- Returns the position for encounter card drawing ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") ---@param stack boolean If true, returns the leftmost position instead of the first empty from the right PlayermatApi.getEncounterCardDrawPosition = function(matColor, stack) for _, mat in pairs(getMatForColor(matColor)) do return Vector(mat.call("getEncounterCardDrawPosition", stack)) end end -- Sets the requested playermat's snap points to limit snapping to matching card types or not. If -- matchTypes is true, the main card slot snap points will only snap assets, while the -- investigator area point will only snap Investigators. If matchTypes is false, snap points will -- be reset to snap all cards. ---@param matchCardTypes boolean Whether snap points should only snap for the matching card types ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.setLimitSnapsByType = function(matchCardTypes, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("setLimitSnapsByType", matchCardTypes) end end -- Sets the requested playermat's draw 1 button to visible ---@param isDrawButtonVisible boolean Whether the draw 1 button should be visible or not ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.showDrawButton = function(isDrawButtonVisible, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("showDrawButton", isDrawButtonVisible) end end -- Shows or hides the clickable clue counter for the requested playermat ---@param showCounter boolean Whether the clickable counter should be present or not ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.clickableClues = function(showCounter, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("clickableClues", showCounter) end end -- Toggles the use of class textures for the requested playermat ---@param state boolean Whether the class texture should be used or not ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.useClassTexture = function(state, matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("useClassTexture", state) end end -- Removes all clues (to the trash for tokens and counters set to 0) for the requested playermat ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.removeClues = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("removeClues") end end -- Reports the clue count for the requested playermat ---@param useClickableCounters boolean Controls which type of counter is getting checked PlayermatApi.getClueCount = function(useClickableCounters, matColor) local count = 0 for _, mat in pairs(getMatForColor(matColor)) do count = count + mat.call("getClueCount", useClickableCounters) end return count end -- Updates the specified owned counter ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@param type string Counter to target ---@param newValue number Value to set the counter to ---@param modifier number If newValue is not provided, the existing value will be adjusted by this modifier PlayermatApi.updateCounter = function(matColor, type, newValue, modifier) for _, mat in pairs(getMatForColor(matColor)) do mat.call("updateCounter", { type = type, newValue = newValue, modifier = modifier }) end end -- Triggers the draw function for the specified playermat ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@param number number Amount of cards to draw PlayermatApi.drawCardsWithReshuffle = function(matColor, number) for _, mat in pairs(getMatForColor(matColor)) do mat.call("drawCardsWithReshuffle", number) end end -- Returns the resource counter amount ---@param matColor string Color of the playermat - White, Orange, Green or Red (does not support "All") ---@param type string Counter to target PlayermatApi.getCounterValue = function(matColor, type) for _, mat in pairs(getMatForColor(matColor)) do return mat.call("getCounterValue", type) end end -- Returns a list of mat colors that have an investigator placed PlayermatApi.getUsedMatColors = function() local usedColors = {} for matColor, mat in pairs(getMatForColor("All")) do local searchPos = mat.positionToWorld(localInvestigatorPosition) local searchResult = searchLib.atPosition(searchPos, "isCardOrDeck") if #searchResult > 0 then table.insert(usedColors, matColor) end end return usedColors end -- Returns investigator name ---@param matColor string Color of the playmat - White, Orange, Green or Red (does not support "All") PlayermatApi.getInvestigatorName = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do local searchPos = mat.positionToWorld(localInvestigatorPosition) local searchResult = searchLib.atPosition(searchPos, "isCardOrDeck") if #searchResult == 1 then return searchResult[1].getName() end end return "" end -- Resets the specified skill tracker to "1, 1, 1, 1" ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.resetSkillTracker = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("resetSkillTracker") end end -- Redraws the XML for the slot symbols based on the slotData table ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.redrawSlotSymbols = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("redrawSlotSymbols") end end -- Finds all objects on the playermat and associated set aside zone and returns a table ---@param matColor string Color of the playermat - White, Orange, Green, Red or All ---@param filter string Name of the filte function (see util/SearchLib) PlayermatApi.searchAroundPlayermat = function(matColor, filter) local objList = {} for _, mat in pairs(getMatForColor(matColor)) do for _, obj in ipairs(mat.call("searchAroundSelf", filter)) do table.insert(objList, obj) end end return objList end -- Discard a non-hidden card from the corresponding player's hand ---@param matColor string Color of the playermat - White, Orange, Green, Red or All PlayermatApi.doDiscardOne = function(matColor) for _, mat in pairs(getMatForColor(matColor)) do mat.call("doDiscardOne") end end -- Triggers the metadata sync for all playermats PlayermatApi.syncAllCustomizableCards = function() for _, mat in pairs(getMatForColor("All")) do mat.call("syncAllCustomizableCards") end end return PlayermatApi end end) __bundle_register("util/DeckLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local DeckLib = {} local searchLib = require("util/SearchLib") -- places a card/deck at a position or merges into an existing deck below ---@param objOrTable tts__Object|table Object or table of objects to move ---@param pos table New position for the object ---@param rot? table New rotation for the object ---@param below? boolean Should the object be placed below an existing deck? DeckLib.placeOrMergeIntoDeck = function(objOrTable, pos, rot, below) if objOrTable == nil or pos == nil then return end -- handle 'objOrTable' parameter local objects = {} if type(objOrTable) == "table" then objects = objOrTable else table.insert(objects, objOrTable) end -- search the new position for existing card/deck local searchResult = searchLib.atPosition(pos, "isCardOrDeck") local targetObj -- get new position local offset = 0.5 local newPos = Vector(pos) + Vector(0, offset, 0) if #searchResult == 1 then targetObj = searchResult[1] local bounds = targetObj.getBounds() if below then newPos = Vector(pos):setAt("y", bounds.center.y - bounds.size.y / 2) else newPos = Vector(pos):setAt("y", bounds.center.y + bounds.size.y / 2 + offset) end end -- process objects in reverse order for i = #objects, 1, -1 do local obj = objects[i] -- add a 0.1 delay for each object (for animation purposes) Wait.time(function() -- allow moving smoothly out of hand and temporarily lock it obj.setLock(true) obj.use_hands = false if rot then obj.setRotationSmooth(rot, false, true) end obj.setPositionSmooth(newPos, false, true) -- wait for object to finish movement (or 2 seconds) Wait.condition( function() -- revert toggles obj.setLock(false) obj.use_hands = true -- use putObject to avoid a TTS bug that merges unrelated cards that are not resting if #searchResult == 1 and targetObj ~= obj and not targetObj.isDestroyed() and not obj.isDestroyed() then targetObj = targetObj.putObject(obj) else targetObj = obj end end, -- check state of the object (make sure it's not moving) function() return obj.isDestroyed() or not obj.isSmoothMoving() end, 2) end, (#objects- i) * 0.1) end end return DeckLib end end) __bundle_register("util/SearchLib", function(require, _LOADED, __bundle_register, __bundle_modules) do local SearchLib = {} local filterFunctions = { isCard = function(x) return x.type == "Card" end, isDeck = function(x) return x.type == "Deck" end, isCardOrDeck = function(x) return x.type == "Card" or x.type == "Deck" end, isClue = function(x) return x.memo == "clueDoom" and x.is_face_down == false end, isTileOrToken = function(x) return x.type == "Tile" end, isUniversalToken = function(x) return x.getMemo() == "universalActionAbility" end, } -- performs the actual search and returns a filtered list of object references ---@param pos tts__Vector Global position ---@param rot? tts__Vector Global rotation ---@param size table Size ---@param filter? string Name of the filter function ---@param direction? table Direction (positive is up) ---@param maxDistance? number Distance for the cast local function returnSearchResult(pos, rot, size, filter, direction, maxDistance) local filterFunc if filter then filterFunc = filterFunctions[filter] end local searchResult = Physics.cast({ origin = pos, direction = direction or { 0, 1, 0 }, orientation = rot or { 0, 0, 0 }, type = 3, size = size, max_distance = maxDistance or 0 }) -- filter the result for matching objects local objList = {} for _, v in ipairs(searchResult) do if not filter or filterFunc(v.hit_object) then table.insert(objList, v.hit_object) end end return objList end -- searches the specified area SearchLib.inArea = function(pos, rot, size, filter) return returnSearchResult(pos, rot, size, filter) end -- searches the area on an object SearchLib.onObject = function(obj, filter) local pos = obj.getPosition() local size = obj.getBounds().size:setAt("y", 1) return returnSearchResult(pos, _, size, filter) end -- searches the specified position (a single point) SearchLib.atPosition = function(pos, filter) local size = { 0.1, 2, 0.1 } return returnSearchResult(pos, _, size, filter) end -- searches below the specified position (downwards until y = 0) SearchLib.belowPosition = function(pos, filter) local size = { 0.1, 2, 0.1 } local direction = { 0, -1, 0 } local maxDistance = pos.y return returnSearchResult(pos, _, size, filter, direction, maxDistance) end return SearchLib end end) __bundle_register("core/GUIDReferenceApi", function(require, _LOADED, __bundle_register, __bundle_modules) do local GUIDReferenceApi = {} local function getGuidHandler() return getObjectFromGUID("123456") end -- Returns the matching object ---@param owner string Parent object for this search ---@param type string Type of object to search for ---@return any: Object reference to the matching object GUIDReferenceApi.getObjectByOwnerAndType = function(owner, type) return getGuidHandler().call("getObjectByOwnerAndType", { owner = owner, type = type }) end -- Returns all matching objects as a table with references ---@param type string Type of object to search for ---@return table: List of object references to matching objects GUIDReferenceApi.getObjectsByType = function(type) return getGuidHandler().call("getObjectsByType", type) end -- Returns all matching objects as a table with references ---@param owner string Parent object for this search ---@return table: List of object references to matching objects GUIDReferenceApi.getObjectsByOwner = function(owner) return getGuidHandler().call("getObjectsByOwner", owner) end -- Sends new information to the reference handler to edit the main index ---@param owner string Parent of the object ---@param type string Type of the object ---@param guid string GUID of the object GUIDReferenceApi.editIndex = function(owner, type, guid) return getGuidHandler().call("editIndex", { owner = owner, type = type, guid = guid }) end -- Returns the owner of an object or the object it's located on ---@param object tts__GameObject Object for this search ---@return string: Parent of the object or object it's located on GUIDReferenceApi.getOwnerOfObject = function(object) return getGuidHandler().call("getOwnerOfObject", object) end return GUIDReferenceApi end end) return __bundle_require("__root")