I’m making a building system and I did a code to make the object unplacable if it is outside of the part called “Area”, the code currently detect if a piece of the object is inside the area. This is the code:
local function insideArea()
local plr = game.Players.LocalPlayer
local buildArea = "ConstructionArea"..plr.Area.Value
local max = 0
local previewObject = workspace.PreviewObject
local blockTable = {
workspace.PreviewObject;
}
local params = OverlapParams.new()
params.CollisionGroup = "Default"
params.FilterDescendantsInstances = blockTable
params.FilterType = Enum.RaycastFilterType.Whitelist
params.MaxParts = max
local area = workspace.Areas[buildArea].Base.Area
local count = 0
for i,v in pairs (previewObject:GetDescendants()) do
if v:IsA("BasePart") then
count = count + 1
end
end
if count ~= 0 then
local resultTable = workspace:GetPartBoundsInBox(area.CFrame,area.Size,params)
if #resultTable >= count then
return true
else
return false
end
end
end
The blue is the “Area” part, the part that the object has to be touching to can be placed. How I mentioned above, I want that the entire object need to touch, and not just a piece.
Create 2 points with something that can be touched (maybe a part, or something else if you don’t like using parts for that kind of thing), one at the top left of the model and one at the bottom right. Require both of them to be inside of the area for the model to be placeable.
I’ll let you figure out how to do it as it’s probably better for you to do it how you want it and to play around with it so it works for you.
You could calculate the 8 corners of the bounding box of the couch.
Then check if each of the corners x,y,z position values are within your designated area’s 8 corners.
Assuming all of these are cuboids and not other kinds of shapes.
It worked, but I’m looking for script solutions, cuz I don’t wanna have to create two parts in each object. If there’s no other way I’m gonna use that.
I think that might be possible make a script detecting the top left and bottom right of a part (the hitbox part that i put on every object)
Use the function in the first post of this. And check if each of your corners (Pos in the function) are within the two corners of your designated area (A, B)
I used iNazgxl’s solution, but I made it a script, with the help of this post
Here’s the new script for who wants:
function getCorners(part) --by post
local cf = part.CFrame
local size = part.Size
local corners = {}
local frontFaceCenter = (cf + cf.LookVector * size.Z/2)
local backFaceCenter = (cf - cf.LookVector * size.Z/2)
local topFrontEdgeCenter = frontFaceCenter + frontFaceCenter.UpVector * size.Y/2
local bottomFrontEdgeCenter = frontFaceCenter - frontFaceCenter.UpVector * size.Y/2
local topBackEdgeCenter = backFaceCenter + backFaceCenter.UpVector * size.Y/2
local bottomBackEdgeCenter = backFaceCenter - backFaceCenter.UpVector * size.Y/2
corners.topFrontRight = (topFrontEdgeCenter + topFrontEdgeCenter.RightVector * size.X/2).Position
corners.topFrontLeft = (topFrontEdgeCenter - topFrontEdgeCenter.RightVector * size.X/2).Position
corners.bottomFrontRight = (bottomFrontEdgeCenter + bottomFrontEdgeCenter.RightVector * size.X/2).Position
corners.bottomFrontLeft = (bottomFrontEdgeCenter - bottomFrontEdgeCenter.RightVector * size.X/2).Position
corners.topBackRight = (topBackEdgeCenter + topBackEdgeCenter.RightVector * size.X/2).Position
corners.topBackLeft = (topBackEdgeCenter - topBackEdgeCenter.RightVector * size.X/2).Position
corners.bottomBackRight = (bottomBackEdgeCenter + bottomBackEdgeCenter.RightVector * size.X/2).Position
corners.bottomBackLeft = (bottomBackEdgeCenter - bottomBackEdgeCenter.RightVector * size.X/2).Position
return corners
end
local function checkArea()
local plr = game.Players.LocalPlayer
local buildArea = "ConstructionArea"..plr.Area.Value
local max = 0
local previewObject = workspace.PreviewObject
local blockTable = {}
for cornerName, cornerPos in pairs(getCorners(previewObject.Hitbox)) do
if not previewObject.Hitbox.Corners:FindFirstChild(cornerName) then
local part = Instance.new("Part") -- create the part in the corner position of my model's hitbox
part.Name = cornerName
part.Position = cornerPos
part.Anchored = true
part.Transparency = 1
part.Size = Vector3.new(0.1,0.1,0.1)
part.Parent = previewObject.Hitbox.Corners
table.insert(blockTable,part)
elseif previewObject.Hitbox.Corners:FindFirstChild(cornerName) then
blockTable[previewObject.Hitbox.Corners[cornerName]] = nil
previewObject.Hitbox.Corners[cornerName]:Destroy()
local part = Instance.new("Part") --re-create the block each 0.1 seconds
part.Name = cornerName
part.Position = cornerPos
part.Anchored = true
part.Transparency = 1
part.Size = Vector3.new(0.1,0.1,0.1)
part.Parent = previewObject.Hitbox.Corners
table.insert(blockTable,part)
end
end
local params = OverlapParams.new()
params.CollisionGroup = "Default"
params.FilterDescendantsInstances = blockTable
params.FilterType = Enum.RaycastFilterType.Whitelist
params.MaxParts = max
if workspace.Areas:FindFirstChild(buildArea) then
local area = workspace.Areas[buildArea].Base.Area
local count = #blockTable
if count ~= 0 then
local resultTable = workspace:GetPartBoundsInBox(area.CFrame,area.Size,params)
if #resultTable >= count then
return true
else
return false
end
end
end
end
while true do
wait(0.1)
local hitbox = workspace.PreviewObject.Hitbox -- hitbox
checkArea(hitbox)
-- rest of the code (change color)
end