How can I add a data store function?(pls help)

This is a support category for asking questions about how to get something done on the Roblox websites or how to do something on Roblox applications such as Roblox Studio.

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!

i want it to save the tool I got from a trade when I die

  1. What is the issue? Include screenshots / videos if possible!

When I trade with someone a tool and the guy I traded with dies the tool disappears and it doesn’t save the tool(It’s not rlly an issue(I just don’t know the code for that (pls help)

  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

Yes I did I tried to find a solution in dev forum and other platforms

After that, you should include more details if you have any. Try to make your topic as descriptive as possible, so that it’s easier for people to help you!
This is the script:

–VARIABLES
local rs = game.ReplicatedStorage:WaitForChild(“TradeReplicatedStorage”)
local re = rs:WaitForChild(“RemoteEvent”)
local config = require(rs:WaitForChild(“CONFIGURATION”))

local tradeRequestsFolder = Instance.new(“Folder”)
tradeRequestsFolder.Name = “TRADE REQUESTS”
tradeRequestsFolder.Parent = rs

local ongoingTradesFolder = Instance.new(“Folder”)
ongoingTradesFolder.Name = “ONGOING TRADES”
ongoingTradesFolder.Parent = rs

–REMOVE TRADES FOR THIS PLAYER
function removeTrades(plr)
for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
trade:Destroy()
end
end

for i, request in pairs(tradeRequestsFolder:GetChildren()) do
	if request.Name == plr.Name or request.Value == plr.Name then
		request:Destroy()
	end
end

end

–REMOVE TRADES WHEN PLAYER DIES
game.Players.PlayerAdded:Connect(function(plr)
plr.CharacterAdded:Connect(function(char)

	char:WaitForChild("Humanoid").Died:Connect(function()
		removeTrades(plr)
	end)
end)

end)

–REMOVE TRADES WHEN PLAYER LEAVES
game.Players.PlayerRemoving:Connect(removeTrades)

–RECEIVE CLIENT INFORMATION
re.OnServerEvent:Connect(function(plr, instruction, data)

--Send a request
if instruction == "send trade request" then
	
	local playerSent = data[1]
	
	if playerSent and playerSent ~= plr then
		local inTrade = false
		
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == playerSent.Name or trade.Sender.Value == plr.Name or trade.Receiever.Value == playerSent.Name or trade.Receiver.Value == plr.Name then
				inTrade = true
				break
			end
		end
		
		for i, request in pairs(tradeRequestsFolder:GetChildren()) do
			if request.Name == playerSent.Name or request.Name == plr.Name or request.Value == playerSent.Name or request.Value == plr.Name then
				inTrade = true
				break
			end
		end
		
		if not inTrade then
			
			local newRequest = Instance.new("StringValue")
			newRequest.Name = plr.Name
			newRequest.Value = playerSent.Name
			newRequest.Parent = tradeRequestsFolder
		end
	end
	
	
--Reject a request
elseif instruction == "reject trade request" then
	
	local requestValue = nil
	for i, request in pairs(tradeRequestsFolder:GetChildren()) do
		if request.Name == plr.Name or request.Value == plr.Name then
			requestValue = request
			break
		end
	end
	
	if requestValue.Parent == tradeRequestsFolder and requestValue.Name == plr.Name or requestValue.Value == plr.Name then
		requestValue:Destroy()
	end
	
	
--Accept a request
elseif instruction == "accept trade request" then
	
	local requestValue = nil
	for i, request in pairs(tradeRequestsFolder:GetChildren()) do
		if request.Name == plr.Name or request.Value == plr.Name then
			requestValue = request
			break
		end
	end
	
	if requestValue.Parent == tradeRequestsFolder and requestValue.Value == plr.Name then
		
		local senderPlr = game.Players[requestValue.Name]
		local receiverPlr = game.Players[requestValue.Value]
		
		
		requestValue:Destroy()
		
		local tradeFolder = Instance.new("Folder")
		
		local senderValue = Instance.new("StringValue")
		senderValue.Name = "Sender"
		senderValue.Value = senderPlr.Name
		senderValue.Parent = tradeFolder
		
		local receiverValue = Instance.new("StringValue")
		receiverValue.Name = "Receiver"
		receiverValue.Value = receiverPlr.Name
		receiverValue.Parent = tradeFolder
		
		local senderOffer = Instance.new("Folder")
		senderOffer.Name = senderPlr.Name .. "'s offer"
		senderOffer.Parent = tradeFolder
		
		local receiverOffer = Instance.new("Folder")
		receiverOffer.Name = receiverPlr.Name .. "'s offer"
		receiverOffer.Parent = tradeFolder
		
		tradeFolder.Parent = ongoingTradesFolder
		
		
		local toolIds = {}
		
		local senderTools = config.GetTools(senderPlr)
		for i, tool in pairs(senderTools) do
			tool.CanBeDropped = false
			
			local toolId = tool:FindFirstChild("TRADING ID") or Instance.new("NumberValue")
			toolId.Name = "TRADING ID"
			
			while string.len(tostring(toolId.Value)) < 1 or table.find(toolIds, toolId.Value) do
				toolId.Value = Random.new():NextNumber(0, 1000000)
			end
			table.insert(toolIds, toolId.Value)
			
			toolId.Parent = tool
		end
		
		local receiverTools = config.GetTools(receiverPlr)
		for i, tool in pairs(receiverTools) do
			tool.CanBeDropped = false

			local toolId = tool:FindFirstChild("TRADING ID") or Instance.new("NumberValue")
			toolId.Name = "TRADING ID"

			while string.len(tostring(toolId.Value)) < 1 or table.find(toolIds, toolId.Value) do
				toolId.Value = Random.new():NextNumber(0, 1000000)
			end
			table.insert(toolIds, toolId.Value)

			toolId.Parent = tool
		end
	end
	
	
--Add an item to the trade
elseif instruction == "add item to trade" then
	
	local item = data[1]
	
	if item.Parent == plr.Backpack or item.Parent == plr.Character then
		
		local currentTrade = nil
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
				currentTrade = trade
				break
			end
		end
		
		if currentTrade then
			
			local plrSlots = currentTrade[plr.Name .. "'s offer"]
			local numItems = #plrSlots:GetChildren()
			
			if numItems < config.MaxSlots then
				
				local itemInTrade = false
				
				for i, plrItem in pairs(plrSlots:GetChildren()) do
					if plrItem["TRADING ID"].Value == item["TRADING ID"].Value then
						itemInTrade = true
						break
					end
				end
				
				if not itemInTrade then
					
					if currentTrade.Receiver:FindFirstChild("ACCEPTED") then
						currentTrade.Receiver.ACCEPTED:Destroy()
					end
					if currentTrade.Sender:FindFirstChild("ACCEPTED") then
						currentTrade.Sender.ACCEPTED:Destroy()
					end
					
					item:Clone().Parent = plrSlots
				end
			end
		end
	end
	
	
--Remove an item from the trade
elseif instruction == "remove item from trade" then
	
	local item = data[1]
	
	if item.Parent == plr.Backpack or item.Parent == plr.Character then
		
		local currentTrade = nil
		for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
			if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
				currentTrade = trade
				break
			end
		end
		
		if currentTrade then
			
			local plrSlots = currentTrade[plr.Name .. "'s offer"]
			
			for i, plrItem in pairs(plrSlots:GetChildren()) do
				if plrItem["TRADING ID"].Value == item["TRADING ID"].Value then
					
					if currentTrade.Receiver:FindFirstChild("ACCEPTED") then
						currentTrade.Receiver.ACCEPTED:Destroy()
					end
					if currentTrade.Sender:FindFirstChild("ACCEPTED") then
						currentTrade.Sender.ACCEPTED:Destroy()
					end
					
					plrItem:Destroy()
					break
				end
			end
		end
	end
	
	
--Accept a trade
elseif instruction == "accept trade" then
	
	local currentTrade = nil
	for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
		if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then
			currentTrade = trade
			break
		end
	end
	
	if currentTrade then
		local plrValue = currentTrade.Sender.Value == plr.Name and currentTrade.Sender or currentTrade.Receiver.Value == plr.Name and currentTrade.Receiver
		
		if plrValue then
			
			if not plrValue:FindFirstChild("ACCEPTED") then
				local acceptedValue = Instance.new("StringValue")
				acceptedValue.Name = "ACCEPTED"
				acceptedValue.Parent = plrValue
				
			else
				plrValue.ACCEPTED:Destroy()
			end
		end
		
		if currentTrade.Sender:FindFirstChild("ACCEPTED") and currentTrade.Receiver:FindFirstChild("ACCEPTED") then
			
			task.wait(config.TimeBeforeTradeConfirmed)
			
			if currentTrade.Sender:FindFirstChild("ACCEPTED") and currentTrade.Receiver:FindFirstChild("ACCEPTED") then
				
				local senderPlr = game.Players[currentTrade.Sender.Value]
				local senderSlots = currentTrade[senderPlr.Name .. "'s offer"]
				
				local receiverPlr = game.Players[currentTrade.Receiver.Value]
				local receiverSlots = currentTrade[receiverPlr.Name .. "'s offer"]
				
				local senderTools = config.GetTools(senderPlr)
				local receiverTools = config.GetTools(receiverPlr)
				
				for i, senderTool in pairs(senderTools) do
					for x, senderSlot in pairs(senderSlots:GetChildren()) do
						if senderTool["TRADING ID"].Value == senderSlot["TRADING ID"].Value then
							senderTool.Parent = receiverPlr.Backpack
						end
					end
				end
				
				for i, receiverTool in pairs(receiverTools) do
					for x, receiverSlot in pairs(receiverSlots:GetChildren()) do
						if receiverTool["TRADING ID"].Value == receiverSlot["TRADING ID"].Value then
							receiverTool.Parent = senderPlr.Backpack
						end
					end
				end
				
				currentTrade:Destroy()
			end
		end
	end
	
	
--Reject a trade
elseif instruction == "reject trade" then

	for i, trade in pairs(ongoingTradesFolder:GetChildren()) do
		
		if trade.Sender.Value == plr.Name or trade.Receiver.Value == plr.Name then		
			trade:Destroy()
			
			break
		end
	end
end

end)

1 Like