You can write your topic however you want, but you need to answer these questions:
-
Place blocks/items within a users plot for it to save & restore back to any plot selected.
-
It places it way off the plot so not sure why it’s not picking it up.
-
Read through alot and tried a few diffrenet approaches, But not sure what else todo.
Here is my placeblock script etc:
--serverside script
-- Event handler for block placement
local function onPlaceEvent(player, blockName, position, rotation)
print("onPlaceEvent triggered", player.Name, blockName, position, rotation)
-- Retrieve the player's plot
local plotIdentifier = playerPlots[player.UserId]
if not plotIdentifier then
warn("Plot identifier not found for the player: " .. player.Name)
return
end
local plot = game.Workspace.Plots:FindFirstChild(plotIdentifier)
if not plot then
warn("Plot not found: " .. plotIdentifier)
return
end
local blockFound = findBlockInGroups(ReplicatedStorage.Builder, blockName)
if blockFound then
-- Proceed with placement logic
else
warn("Block not found: ", blockName)
end
-- Find the block model to place
local blockToPlace = findBlockInGroups(ReplicatedStorage.Builder, blockName) -- Adjust path as necessary
if not blockToPlace then
warn("Block not found: " .. blockName)
return
end
blockToPlace = blockToPlace:Clone()
-- Calculate the correct placement position relative to the plot
local plotCFrame = plot.CFrame
local worldPosition = plotCFrame:PointToWorldSpace(position) -- Convert local position to world position
local worldRotation = CFrame.Angles(math.rad(rotation.X), math.rad(rotation.Y), math.rad(rotation.Z))
-- Set the block's position and parent
blockToPlace:SetPrimaryPartCFrame(CFrame.new(worldPosition) * worldRotation)
blockToPlace.Parent = plot
-- Ensure the block is anchored
for _, part in pairs(blockToPlace:GetDescendants()) do
if part:IsA("BasePart") then
part.Anchored = true
end
end
-- Optionally update the player's blocks list and perform further checks
print("Block placed successfully:", blockName, "at", worldPosition)
end
placeEvent.OnServerEvent:Connect(onPlaceEvent)
---player gui scripts
local function handlePlaceItemButtonClick()
print("PlaceItemButton clicked") -- Debug message
if selectedBlock then
local plotName = getPlotFunction:InvokeServer() -- Get the plot name associated with the player
print("Plot Name:", plotName) -- Debug message
if plotName and previewBlock and previewBlock.PrimaryPart then
local position = previewBlock.PrimaryPart.Position
local rotation = previewBlock.PrimaryPart.Orientation
print("Sending placement data to server:", selectedBlock.Name, position, rotation) -- Debug message
-- Fire the PlaceEvent with the necessary information
placeEvent:FireServer(selectedBlock.Name, position, rotation)
-- Clean up after placing the block
previewBlock:Destroy()
previewBlock = nil
isPreviewing = false
selectedBlock = nil
placeItemButton.Visible = false
cancelButton.Visible = false
print("Placement data sent to server.")
else
warn("No plot found or preview block is invalid.")
end
else
warn("No block selected for placement.")
end
end
if placeItemButton then
placeItemButton.MouseButton1Click:Connect(handlePlaceItemButtonClick)
end
local function handleCancelButtonClick()
if isPreviewing and previewBlock then
previewBlock:Destroy()
previewBlock = nil
isPreviewing = false
selectedBlock = nil
placeItemButton.Visible = false
cancelButton.Visible = false
end
end
if cancelButton then
cancelButton.MouseButton1Click:Connect(handleCancelButtonClick)
end
local function tryPlaceBlock()
if selectedBlock and isPreviewing and previewBlock and previewBlock.PrimaryPart then
local position = previewBlock.PrimaryPart.Position
local rotation = previewBlock.PrimaryPart.Orientation
placeEvent:FireServer(selectedBlock.Name, position, rotation)
-- Clean up
selectedBlock = nil
previewBlock:Destroy()
previewBlock = nil
isPreviewing = false
if placeItemButton then
placeItemButton.Visible = false
end
if cancelButton then
cancelButton.Visible = false
end
else
warn("No block selected or no preview block available.")
end
end
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
if gameProcessedEvent then return end
if input.KeyCode == Enum.KeyCode.E and selectedBlock and isPreviewing and previewBlock and previewBlock.PrimaryPart then
local position = previewBlock.PrimaryPart.Position -- Corrected to use PrimaryPart
local rotation = Vector3.new(0, 0, 0) -- Adjust if you have rotation logic
placeEvent:FireServer(selectedBlock.Name, position, rotation)
end
end)
local placeEvent = ReplicatedStorage:WaitForChild("PlaceEvent")
local function finalizePlacement()
if isPreviewing and previewBlock and selectedBlock then
if previewBlock.PrimaryPart then
local position = previewBlock.PrimaryPart.Position
local rotation = previewBlock.PrimaryPart.Orientation -- Ensure these are not nil
-- Debug print
print("Attempting to place - Position:", position, "Rotation:", rotation)
if position and rotation then
placeEvent:FireServer(selectedBlock.Name, position, rotation)
print("Sent to server - Position:", position, "Rotation:", rotation)
else
warn("Position or Rotation is nil")
end
else
warn("previewBlock does not have a PrimaryPart set")
end
-- Cleanup
previewBlock:Destroy()
previewBlock = nil
isPreviewing = false
selectedBlock = nil
if placeItemButton then
placeItemButton.Visible = false
else
warn("placeItemButton not found")
end
if cancelButton then
cancelButton.Visible = false
else
warn("cancelButton not found")
end
end
end
-- Connect this function to wherever you want to listen for the mouse movements or touch
updatePreview()