diff --git a/src/core/Global.ttslua b/src/core/Global.ttslua index 65b3f8e5..77d1fe3a 100644 --- a/src/core/Global.ttslua +++ b/src/core/Global.ttslua @@ -1407,7 +1407,6 @@ function updateDownloadItemList(skipAuthorUpdate) -- if there's a filter, apply it (both for name and author) if (searchFilter == nil or string.contains(string.lower(v.name), searchFilter)) and (authorFilter == nil or v.author == authorFilter) then - -- start collecting authors unless skipping if not skipAuthorUpdate then table.insert(authorList, v.author) @@ -2755,3 +2754,9 @@ function removeDuplicatesAndSort(t) return result end + +-- wrapper for 'easier' access to this function +-- Note: There's intentionally no proper UI or button etc. for this, since we don't fully support rotated mats +function moveAndRotatePlayermat(params) + playermatApi.moveAndRotate(params.matColor, params.position, params.rotationY) +end diff --git a/src/playermat/PlayermatApi.ttslua b/src/playermat/PlayermatApi.ttslua index 313f0778..2307aa12 100644 --- a/src/playermat/PlayermatApi.ttslua +++ b/src/playermat/PlayermatApi.ttslua @@ -122,8 +122,8 @@ do PlayermatApi.getHelperSpawnData = function(matColor, helperName) local resultTable = {} local localPositionTable = { - ["Hand Helper"] = Vector( -0.055, 0, -1.132 ), - ["Search Assistant"] = Vector( -0.34, 0, -1.132 ) + ["Hand Helper"] = Vector(-0.055, 0, -1.132), + ["Search Assistant"] = Vector(-0.34, 0, -1.132) } for color, mat in pairs(getMatForColor(matColor)) do @@ -345,5 +345,48 @@ do end end + -- moves + rotates a playermat (and related objects) + ---@param matColor string Color of the playermat - White, Orange, Green, Red or All + ---@param position table New position for the playermat + ---@param rotationY number New y-rotation for the playermat (X and Z will be 0) + PlayermatApi.moveAndRotate = function(matColor, position, rotationY) + -- get mat and related objects + local mat = guidReferenceApi.getObjectByOwnerAndType(matColor, "Playermat") + local matObjects = guidReferenceApi.getObjectsByOwner(matColor) + + if not mat then return end + + -- use current value if undefined + position = position or mat.getPosition() + rotationY = rotationY or mat.getRotation().y + + -- store relative positions + local storedPositions = {} + for _, obj in pairs(matObjects) do + if obj ~= mat then + storedPositions[obj.getGUID()] = mat.positionToLocal(obj.getPosition()) + end + end + + -- also get objects on the mat + local objectsOnMat = searchLib.onObject(mat) + for _, obj in ipairs(objectsOnMat) do + if obj ~= mat and storedPositions[obj.getGUID()] == nil and obj.interactable ~= false then + storedPositions[obj.getGUID()] = mat.positionToLocal(obj.getPosition()) + end + end + + -- move main mat + mat.setPosition(position) + mat.setRotation({ 0, rotationY, 0 }) + + -- set new position + rotation (preserve object X / Z rotation) + for guid, pos in pairs(storedPositions) do + local obj = getObjectFromGUID(guid) + obj.setPosition(mat.positionToWorld(pos)) + obj.setRotation(obj.getRotation():setAt("y", rotationY)) + end + end + return PlayermatApi end