Merge pull request #910 from argonui/playermat-moving

Added function for playermat moving / rotating
This commit is contained in:
dscarpac 2024-10-17 08:42:49 -05:00 committed by GitHub
commit bcd5c76a9c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 3 deletions

View File

@ -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

View File

@ -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