It results in an error with position, repeated no matter what and the second error if I rotated it before hand.
Errors at Line 85 and 93. 85: Attempt to index nil with position 93: Model:SetPrimaryCFrame() failed because no PrimaryPart has been set, or the PrimaryPart no longer exists. Please set Model.PrimaryPart before using this.
The errors only happen after it runs once. It's like it needs to update and realize that stuff doesn't exist. I don't really know.
Also there is another script, but it works fine.
local replicatedStorage = game:GetService("ReplicatedStorage")
local placeStructure = replicatedStorage:WaitForChild("PlaceStructure")
local structures = replicatedStorage:WaitForChild("Structures")
local sillhouettes = replicatedStorage:WaitForChild("Sillhouettes")
local UIS = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
--local player = game.Player.LocalPlayer
local player = game:GetService("Players").LocalPlayer
local StructureFrame = script.Parent
local char = player.Character or player.Character:Wait()
local HumanoidRootPart = char:WaitForChild("HumanoidRootPart")
local mouse = player:GetMouse()
local yBuildingOffset = 0.5
local maxPlacingDistance = 50
local rKeyIsPressed = false
local placingStructure = false
local yOrientation=0
local goodTOPlace = false
local placedStructure
local clientStructure
local rotating = false
-- Handles start of temporary brick rotation
function handleKeyInputStarted(input)
if rotating == false then
rotating = true
rKeyIsPressed = true
local rotationSpeed = 90
while rKeyIsPressed do
wait()
if placingStructure == true then
yOrientation = yOrientation + rotationSpeed
repeat
wait()
until rKeyIsPressed == false
end
end
rotating = false
end
end
-- Handles end of temporary brick rotation
function handleKeyInputEnded(input)
if input.KeyCode == Enum.KeyCode.R then
rKeyIsPressed = false
end
end
-- Handles construction of actual Brick when user is satisfied with placement/rotation
function handleMouseInputBegan(input)
if placingStructure == true then
if goodTOPlace == true then
local StructureCFrame = clientStructure.PrimaryPart.CFrame
placedStructure = placeStructure:InvokeServer(clientStructure.Name, StructureCFrame)
if placedStructure == true then
placingStructure = false
clientStructure:Destroy()
StructureFrame.Enabled = true
end
end
end
end
-- Handles general input (mouse or keyboard) input
function handleInputStarted(input)
if input.KeyCode == Enum.KeyCode.R then
handleKeyInputStarted(input)
elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
handleMouseInputBegan(input)
end
end
-- Handles rendering the temporary Brick during placement
function handleRenderStepped()
local mouseRay = mouse.UnitRay
local castRay = Ray.new(mouseRay.Origin, mouseRay.Direction * 1000)
local ignoreList = {clientStructure, char}
local hit, position = workspace:FindPartOnRayWithIgnoreList(castRay, ignoreList)
if hit and (HumanoidRootPart.Position - clientStructure.PrimaryPart.Position).Magnitude < maxPlacingDistance then
goodTOPlace = true
else
goodTOPlace = false
end
local newAnglesCFrame = CFrame.Angles(0, math.rad(yOrientation), 0)
local newCFrame = CFrame.new(position.X, position.Y + yBuildingOffset, position.z)
clientStructure:SetPrimaryPartCFrame(newCFrame * newAnglesCFrame)
end
-- Handles constructing the temporary placement brick when the create button is pressed.
function handleBrickButtonPressed(structureName)
StructureFrame.Enabled = false
if placingStructure == false then
placingStructure = true
clientStructure = sillhouettes:FindFirstChild(structureName):Clone()
for x, v in pairs(clientStructure:GetChildren()) do
if v:IsA("Part") then
v.CanCollide = false
end
end
clientStructure.Parent = game.Workspace
local startingCFrame = CFrame.new(0, -2, -15)
clientStructure:SetPrimaryPartCFrame(HumanoidRootPart.CFrame:ToWorldSpace(startingCFrame))
RunService.RenderStepped:Connect(handleRenderStepped)
end
end
-- Iterate over all Buttons in the StructureFrame and attach a mouse listener
for _, structureButton in pairs(StructureFrame.PurchasesScreen:GetChildren()) do
if structureButton:IsA("TextButton") then
structureButton.MouseButton1Up:Connect(function()
handleBrickButtonPressed(structureButton.Name)
end)
end
end
UIS.InputBegan:Connect(handleInputStarted)
UIS.InputEnded:Connect(handleKeyInputEnded)
I know this is a really long script and I'm sorry I just didn't know where else to look. If you read this all and find an answer then I really don't know how to thank you.
