Basic Information
Improvements
Use Local Variables so that you can simply change a single line when needed rather than writing out things like script.Parent multiple times
Do not set a CFrame to a direct location unless it should always appear there. The football is supposed to be placed relative to the player so you should base the Handle's
CFrame on the player whose tool it is.
A Tool is placed in the player's Backpack so I'd suggest using a LocalScript for this as the player controls the equipment, not the server
Suggestions
Tools have properties referring to the Grip but this only relates to the player's RightHand.
Since you want to move the handle to the player's feet, I'd use a Weld to place the Tool's Handle in the expected location
Using a RemoteEvent will cause actions made by the player to tell the server to make changes that all players can see, not just the client the LocalScript is descended under.
Final Product
Make sure that the Tool's RequireHandle Property is set to false
Hierarchy
ReplicatedStorage
Handle
ServerScriptService
ServerScript
StarterPack
Tool (Football)
LocalScript
LocalScript
local remote = game:GetService("ReplicatedStorage"):WaitForChild("FootballEvent")
local tool = script.Parent
tool.Equipped:Connect(function()
remote:FireServer("Attach", tool)
end)
tool.Unequipped:Connect(function()
remote:FireServer("Remove", tool)
end)
The above functions just fire the remote when the player equips and unequips the tool.
Server Script
local repst = game:GetService("ReplicatedStorage")
local remote = Instance.new("RemoteEvent")
remote.Name = "FootballEvent"
remote.Parent = repst
remote.OnServerEvent:Connect(function(player, event, tool)
if event == "Attach" then
local char = player.Character
local root = char:WaitForChild("HumanoidRootPart")
local handle = repst:WaitForChild("Handle"):Clone()
local weld = Instance.new("Weld")
weld.Part0 = root
weld.Part1 = handle
weld.C0 = CFrame.new(0, -2.5, -1.5)
weld.Parent = handle
handle.Parent = tool
elseif event == "Remove" then
local handle = tool:FindFirstChild("Handle")
if handle then
handle:Destroy()
end
end
end)
The first section creates a new RemoteEvent in the ReplicatedStorage
The second section either adds the handle to the tool with the specified placement ["Attach"] or removes the Handle when the Tool is unequipped (so that the next time it is equipped there is only 1 "Handle" in the Tool.) ["Remove"]
Explanation
The weld.Part0 is set to the player's HumanoidRootPart since this part control's player motion and will not abruptly rotate or move like the LeftFoot might
The weld.C0 property determines the offset of Part1 from Part0 so change this line [Line
16] as necessary