I have this equiptool system to replace the backpack for my custom inventory system
because I personally just generally dislike how it works and it’s functionality, I struggled a lot trying to make it not put stuff in the backpack cause the backpack is hidden, but couldn’t get a system going to make it make sure there wasnt a item in the player being held and remove its leftover instance in the backpack, but couldn’t do it
so I tried to make a manual replacement system, but for some reason
I when I try to weld the tool to the hand it just makes it glitch out like this:
(SORRY FOR THE BAD IMAGE, the tool was only showing when using an anim cause it is like connected to it underground or smth)
for some reason the handle is actually in the hand, although I do thin this is reversed. and not how its supposed to be held.
-- Manual tool system to replace Backpack
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ToolHandler = {}
local equippedTools = {}
-- Utility: weld two parts
local function weld(part0, part1) -- part 0 is handle part 1 is hand
local weld = Instance.new("WeldConstraint")
weld.Part0 = part0
weld.Part1 = part1
weld.Parent = part0
return weld
end
-- Unequip current tool
function ToolHandler.Unequip(player)
local char = player.Character
if not char then return end
local current = equippedTools[player]
if current then
current.Model:Destroy()
equippedTools[player] = nil
end
end
-- Activate tool manually
function ToolHandler.Activate(player)
local tool = equippedTools[player]
if tool and not tool.Active then
tool.Active = true
-- Custom attack/activation logic
print(player.Name .. " activated " .. tool.Model.Name)
task.delay(0.5, function()
if equippedTools[player] then
equippedTools[player].Active = false
end
end)
end
end
-- Equip a tool model
function ToolHandler.Equip(player, toolModel)
local char = player.Character
if not char then return end
ToolHandler.Unequip(player)
local toolClone : Tool = toolModel:Clone()
toolClone.Parent = char
local rightHand = char:FindFirstChild("RightHand") or char:FindFirstChild("Right Arm")
local rightHandGrip : Attachment = rightHand:FindFirstChild("RightGripAttachment")
for i,v in pairs(toolClone:GetDescendants()) do
if v:IsA("MeshPart") or v:IsA("Part") then
weld(v, rightHand)
end
end
equippedTools[player] = {
Model = toolClone,
Active = false,
}
if player == Players.LocalPlayer then
if player:GetMouse() then
local mouse = player:GetMouse()
mouse.Button1Down:Connect(function()
ToolHandler.Activate(player)
end)
end
UserInputService.TouchStarted:Connect(function(input, gameProcessed)
if gameProcessed then return end
ToolHandler.Activate(player)
end)
end
end
return ToolHandler
the tools hierarchy looks like this, and also ingame it holds together on play, it also works fine when equipped regularly as a tool
online I saw people reccomend their own tool equip fake scripts but importing those didn’t fix it either, so im just confused rn, why is this even happening??


