this script works perfectly for parts all you got to do is place a ClickDetector inside it named “Grab”
i want to make it so that it can also work for models but i cant properly make them move
Global Script
--Place in ServerScriptService
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local moveObjectEvent = ReplicatedStorage:WaitForChild("MoveObjectEvent")
-- Ensure ObjectOwnership is a RemoteFunction
local objectOwnership = ReplicatedStorage:FindFirstChild("ObjectOwnership")
if not objectOwnership then
objectOwnership = Instance.new("RemoteFunction")
objectOwnership.Name = "ObjectOwnership"
objectOwnership.Parent = ReplicatedStorage
end
local objectOwners = {} -- Dictionary to track object ownership
-- Function to handle moving the object on the server
local function onMoveObject(player, object, newPosition, release)
if object and object:IsA("BasePart") then
if release then
-- Release the object
objectOwners[object] = nil
object.Position = newPosition
object.Anchored = false
object.CanCollide = true
else
-- Move the object
object.Position = newPosition
object.Anchored = true
object.CanCollide = false
end
end
end
-- Function to check and set object ownership
local function onObjectOwnership(player, object)
if objectOwners[object] == nil then
objectOwners[object] = player
return true
else
return false
end
end
-- Connect RemoteEvent
moveObjectEvent.OnServerEvent:Connect(onMoveObject)
objectOwnership.OnServerInvoke = onObjectOwnership
local script
--Place in StarterPlayerScripts
local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local grabbedObject = nil
local bodyPosition = nil
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local moveObjectEvent = ReplicatedStorage:WaitForChild("MoveObjectEvent")
local objectOwnership = ReplicatedStorage:WaitForChild("ObjectOwnership") -- Ensure this is a RemoteFunction
local cooldown = false
local cooldownTime = 0.1 -- Cooldown time in seconds
-- Function to handle releasing the object
local function releaseObject()
if grabbedObject then
-- Release the object
moveObjectEvent:FireServer(grabbedObject, grabbedObject.Position, true)
grabbedObject.CanCollide = true
grabbedObject.Anchored = false
if bodyPosition then
bodyPosition:Destroy()
end
mouse.TargetFilter = nil
grabbedObject = nil
bodyPosition = nil
-- Set cooldown
cooldown = true
wait(cooldownTime)
cooldown = false
end
end
-- Function to handle grabbing the object
local function grabObject(object)
if not cooldown then
-- Check ownership before grabbing the object
local canGrab = objectOwnership:InvokeServer(object)
if canGrab then
-- Grab the object
grabbedObject = object
grabbedObject.CanCollide = false
grabbedObject.Anchored = false
bodyPosition = Instance.new("BodyPosition")
bodyPosition.MaxForce = Vector3.new(4000, 4000, 4000)
bodyPosition.P = 10000
bodyPosition.D = 1000
bodyPosition.Position = object.Position -- Set initial position
bodyPosition.Parent = grabbedObject
mouse.TargetFilter = grabbedObject
end
end
end
-- Connect ClickDetector events
local function setupClickDetector(object)
local clickDetector = object:FindFirstChildOfClass("ClickDetector")
if clickDetector then
clickDetector.MouseClick:Connect(function()
script.Click:Play()
grabObject(object)
end)
end
end
-- Connect ClickDetector events for existing objects
for _, object in ipairs(workspace:GetChildren()) do
setupClickDetector(object)
end
-- Listen for new objects added to workspace
workspace.ChildAdded:Connect(function(child)
setupClickDetector(child)
end)
-- Handle mouse click to release the object
mouse.Button1Down:Connect(function()
if grabbedObject then
releaseObject()
end
end)
-- Update the object's position
game:GetService("RunService").RenderStepped:Connect(function()
if grabbedObject and bodyPosition then
local mousePosition = mouse.Hit.Position
bodyPosition.Position = mousePosition
moveObjectEvent:FireServer(grabbedObject, mousePosition, false)
end
end)