I'm completely stumped right now. I have a DataStore script but it saves weapons at times but after playing 2 or more times the weapon eventually does not spawn anymore. Can someone please take a look at this script for me.

Also if you know of any other DataStore scripts that may be better I would be more than willing to replace this one with a more stable script.

Thanks in advance.

wait(3)
local RunService = game:GetService("RunService")
local ToolData = game:GetService("DataStoreService"):GetDataStore("ToolData")

local ToolLocation = game.ServerStorage.Tools -- The location where all your tools are saved

function GetToolByName(toolName)
	for _, tool in pairs(ToolLocation:GetChildren()) do
		if tool.Name == toolName then return tool end
	end
end

function IsRegisteredTool(tool)
	for _, playerTool in pairs(ToolLocation:GetChildren()) do
		if playerTool.Name == tool.Name then return true end
	end
end

game.Players.PlayerAdded:Connect(function(player)
	repeat wait() until player.Character
	local dataKey = "tool-data_"..player.UserId
	if ToolData:GetAsync(dataKey) then
		for i, toolName in pairs(ToolData:GetAsync(dataKey)) do
			local newStarterTool = GetToolByName(ToolData:GetAsync(dataKey)[i]):Clone()
			local newTempTool = GetToolByName(ToolData:GetAsync(dataKey)[i]):Clone()
			newStarterTool.Parent = player.StarterGear
			newTempTool.Parent = player.Backpack
		end
		ToolData:SetAsync(dataKey, {})
	end
end)

game.Players.PlayerRemoving:Connect(function(player)
	local dataKey = "tool-data_"..player.UserId
	local playerTools = {}
	for _, tool in pairs(player.StarterGear:GetChildren()) do
		if tool:IsA("Tool") and IsRegisteredTool(tool) then table.insert(playerTools, 1, tool.Name) end
	end
	if RunService:IsStudio() or #playerTools < 1 then return end
	ToolData:SetAsync(dataKey, playerTools)
end)