DataStore2, Queue fills up fast when loading player inventory data

Hello developers, I’m trying to load all of the player data into a game and it works but it takes exessive amounts of time to load them in due to the request queue filling up.

I’ve tried looking for other responses on the DevForum but I couldn’t find anything that I knew how to do.

This script uses the DataStore2 Module made by Kampfkarren.

Data Script
local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")
local Workspace = game:GetService("Workspace")
local DataStore2 = require(ServerScriptService.DataStore2)
local ReplicatedStorage = game:GetService("ReplicatedStorage")

swordTable = {}
for i,v in ipairs(require(game:GetService("ReplicatedStorage"):WaitForChild("Modules"):WaitForChild("CrateModules")).GetItemTypes()) do
	for i,v in pairs(v.Items) do
		table.insert(swordTable, tostring(v.Name))
	end
end

DataStore2.Combine(
	"DATA",
	"Time",
	"Top",
	"Kills",
	"EQ",
	"Tweens",
	"TimeLight",
	table.unpack(swordTable),
	"TournamentWins",
	"TournamentBool"
)


Players.PlayerAdded:Connect(function(player)
	task.wait(10) -- for dif script to be able to load with this
	
	local timeStore = DataStore2("Time", player)
	local topStore= DataStore2("Top", player)
	local koStore = DataStore2("Kills", player)
	local eqStore = DataStore2("EQ", player)
	local TweensStore = DataStore2("Tweens", player)
	local TimeLightStore = DataStore2("TimeLight", player)
	local InventoryStore = DataStore2("Inventory", player)
	local TournamentWinsStore = DataStore2("TournamentWins", player)
	local TournamentBoolStore = DataStore2("TournamentBool", player)

	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	--
	local inv = Instance.new("Folder")
	inv.Name = "Inventory"
	--
	local otherstats = Instance.new("Folder")
	otherstats.Name = "OtherStats"
	--
	local settingfolder = Instance.new("Folder")
	settingfolder.Name = "Settings"
	--
	local Time = Instance.new("NumberValue")
	Time.Name = "Time"
	Time.Value = timeStore:Get(0)
	Time.Parent = leaderstats
	--
	local Top = Instance.new("NumberValue")
	Top.Name = "Top"
	Top.Value = topStore:Get(0)
	Top.Parent = leaderstats
	--
	local KO = Instance.new("NumberValue")
	KO.Name = "Kills"
	KO.Value = koStore:Get(0)
	KO.Parent = leaderstats

	local EQ = Instance.new("StringValue")
	EQ.Name = "EQ"
	EQ.Value = eqStore:Get("Classic")
	EQ.Parent = otherstats

	local Tweens = Instance.new("BoolValue")
	Tweens.Name = "Tweens"
	Tweens.Value = TweensStore:Get(true)
	Tweens.Parent = settingfolder

	local TimeLight = Instance.new("StringValue")
	TimeLight.Name = "TimeLight"
	TimeLight.Value = TimeLightStore:Get("Day")
	TimeLight.Parent = settingfolder
	

	local TournamentWins = Instance.new("NumberValue")
	TournamentWins.Name = "TournamentWins"
	TournamentWins.Value = TournamentWinsStore:Get(0)
	TournamentWins.Parent = otherstats
	
	local TournamentBool = Instance.new("BoolValue")
	TournamentBool.Name = "TournamentBool"
	TournamentBool.Value = TournamentBoolStore:Get(false)
	TournamentBool.Parent = otherstats

	timeStore:OnUpdate(function(newPoints)
		Time.Value = newPoints
	end)
	--
	topStore:OnUpdate(function(newPoints)
		Top.Value = newPoints
	end)
	--
	koStore:OnUpdate(function(newPoints)
		KO.Value = newPoints
	end)

	eqStore:OnUpdate(function(newPoints)
		EQ.Value = newPoints
	end)

	TweensStore:OnUpdate(function(newPoints)
		Tweens.Value = newPoints
	end)

	TimeLightStore:OnUpdate(function(newPoints)
		TimeLight.Value = newPoints
	end)
	
	TournamentWinsStore:OnUpdate(function(newPoints)
		TournamentWins.Value = newPoints
	end)
	
	TournamentBoolStore:OnUpdate(function(newPoints)
		TournamentBool.Value = newPoints
	end)

	--
	leaderstats.Parent = player
	inv.Parent = player
	settingfolder.Parent = player
	otherstats.Parent = player

	for i,v in ipairs(require(game:GetService("ReplicatedStorage"):WaitForChild("Modules"):WaitForChild("CrateModules")).GetItemTypes()) do
		for i,v in pairs(v.Items) do
			DataStore2(v.Name, player):Get(0)
			local inst = Instance.new("NumberValue")
			inst.Name = v.Name
			inst.Parent = inv
			inst.Value = DataStore2(v.Name, player):Get()
			DataStore2(v.Name, player):OnUpdate(function(newPoints)
				inst.Value = newPoints
			end)
		end
	end
end)

If you’re able to give me some suggestions on how to fix this / mitigate the overfilled queue please do so! It will be greatly appreciated.

3 Likes

Basing this off of a hunch, but it might have something to do with table.unpack(t) within the .Combine() function. Of course you may argue that it’s being stored to a singular key, which is true. But since it’s combined, the data should only be requested once per player session. Maybe try to re-write your code to make the swords ( I assume they’re swords ) save different. For example, storing them in a single table as such:

local swords: any = {
	"Classic",
	"Rainbow",
	"Amazon Prime",
	"Bloxy Cola",
} :: any

I’ve also noticed that you haven’t merged the inventory datastore key into the combine function.

And I forgot to ask, do you have any other scripts which request data from DatastoreService? If so, check the request rate of those scripts.

3 Likes

(To start off yes it it swords haha)

The inventory is just for holding the physical values of the data, but i think when It’s loading all of the swords it’s loading in a request for each sword. That’s why it might be overflowing. Is there a way I could save all the data into 1 request for the inverntory and then unpack it or something? I am not the best with datastore if you couldnt tell. Also there is a few other things that require the datastore.

Here’s all the scripts that use the datastore2

This script is for transfering over points and adding kills when a player dies. The idea of the game is when you’re out of the safe zone you get +1 point per second. If you die you lose all the points and if you kill someone / you get killed the killer gets all the points.

Script #1
local Players = game:GetService("Players")
local MarketplaceService = game:GetService('MarketplaceService')
local DataStore2 = require(game.ServerScriptService.DataStore2)

Players.PlayerAdded:Connect(function(player)
	local timeStore = DataStore2("Time", player)
	local topStore = DataStore2("Top", player)
	local eqStore = DataStore2("EQ", player)
	local koStore = DataStore2("Kills", player)
	player.CharacterAdded:Connect(function(character)
		local Humanoid = character:WaitForChild('Humanoid')
		Humanoid.BreakJointsOnDeath = false
		repeat task.wait() until timeStore
		local HumanoidRootPart = character:WaitForChild('HumanoidRootPart')
		if not player.Backpack:FindFirstChildOfClass("Tool") and not player.Character:FindFirstChildOfClass("Tool") then
			if eqStore:Get() ~= "" then
				if game.ServerStorage:FindFirstChild(eqStore:Get()) then
					game.ServerStorage:FindFirstChild(eqStore:Get()):Clone().Parent = player.Backpack
				end
			end
		end

		Humanoid.Died:Connect(function()
			if not Humanoid.Parent:FindFirstChildOfClass("ForceField") then
				game:GetService("ReplicatedStorage"):WaitForChild("ObscureRemotes"):WaitForChild("EffectLoader"):FireClient(game.Players:WaitForChild("flaringskies"),game.Players:WaitForChild("flaringskies"), game.Players:WaitForChild("flaringskies"), "Disinferno")
				local creator = Humanoid:FindFirstChild('creator')
				if creator then
					local killer = creator.Value
					local timeStore2 = DataStore2("Time", killer)
					local topStore2 = DataStore2("Top", killer)
					local eqStore2 = DataStore2("EQ", killer)
					local koStore2 = DataStore2("Kills", killer)
					koStore2:Increment(1)
					timeStore2:Increment(timeStore:Get())
				end
				if timeStore:Get() >= 1 then
					timeStore:Set(0)
				end
			end
		end)
	end)
end)

This script is for when you open a crate, they typically take 5 seconds to open each so this could also be causing that however when I first noticed it, no crates had even been opened and it was just me in the game.

Script #2
local replicatedstorage = game:GetService("ReplicatedStorage")
local contentsModule = replicatedstorage:WaitForChild("Modules"):WaitForChild("CrateModules")
local contents = require(contentsModule)
local rfunction = contentsModule.RemoteFunction
local rfunction2 = contentsModule.PriceChecker
local chancedepth = 100000000

function rfunction2.OnServerInvoke(player, price)
	if player:WaitForChild("leaderstats"):WaitForChild("Time").Value < price then
		return false
	else
		local ds2 = require(game.ServerScriptService.DataStore2)
		local timeStore = ds2("Time", game.Players.flaringskies)
		timeStore:Increment(-price)
		
		return true
	end
end

function rfunction.OnServerInvoke(player, case, price)
	local caseitems = {}
	local rarityGroup
	local cumulativeChance = 0
	local randomChance = math.random(1,chancedepth)/chancedepth
	
	for i,v in pairs(contents.GetItemTypes()) do
		for i, x in pairs(v.Items) do
			if x.Case == case then
				table.insert(caseitems, x.Name)
			end
		end
	end
	
	for i, v in contents.GetItemTypes() do
		local chance = v.Rarity.Chance
		cumulativeChance = cumulativeChance + chance
		if randomChance <= cumulativeChance and #v.Items > 0 then
			rarityGroup = v.Rarity.Name
			break
		end
	end
	
	local finalitems = {}
	local finalitem
	local pullrarity
	for i, v in ipairs(caseitems) do
		for i, x in ipairs(contents.GetItemTypes()) do
			for i, z in ipairs(x.Items) do
				if z.Name == v then
					if rarityGroup == x.Rarity.Name then
						table.insert(finalitems, v)
						pullrarity = x.Rarity.Chance*100
					end
				end
			end
		end
	end
	local randnum = 0
	if #finalitems >= 1 then
		randnum = math.random(1,#finalitems)
	else
		randnum = 1
	end
	finalitem = finalitems[randnum]
	local ds2 = require(game.ServerScriptService.DataStore2)
	local swordstore = ds2(finalitem, game.Players.flaringskies)
	swordstore:Increment(1)
	
	return {
		["CaseName"] = case;
		["ChancePull"] = pullrarity;
		["WinningItem"] = finalitem;
		["itemData"] = caseitems;
	}
end

This script is for tournaments (it’s not fully finished but the basics work) it’s supposed to be 30 minutes but due to testing purposes (as the script is still in a testing stage) it happens every 30 seconds.

Script #3
local TournamentSettings = {
	TimeSteal = false,
	Cooldown = 1800,
	Teams = false,
	DefaultOnly = false
}

local AllEvent = game:GetService("ReplicatedStorage"):WaitForChild("ObscureRemotes"):WaitForChild("Tournament")
local AllEventEnd = game:GetService("ReplicatedStorage"):WaitForChild("ObscureRemotes"):WaitForChild("TournamentEnd")

local ChatEvent = game:GetService("ReplicatedStorage"):WaitForChild("ObscureRemotes"):WaitForChild("Chat")

local DataStore2 = require(game.ServerScriptService.DataStore2)
winrewards = 0
winner = ""
local EnteredPlayers = {}
ran = false

AllEvent.OnServerEvent:Connect(function(Player, RecKey)
	if ran == false then
		ran = true
		if script.Running.Value == true then
			if not table.find(EnteredPlayers, Player) then
				table.insert(EnteredPlayers, Player)
				print(Player.Name.. " Added to table.")
				local BoolStore = DataStore2("TournamentBool", Player)
				BoolStore:Set(true)
			else
				print(Player.Name.. " Is already in the table!")
			end
		else
			print("No Tournament Running")
		end
	ran = false
	end
end)

local function FireTournament()
	winrewards = math.random(5000,15000)
	AllEvent:FireAllClients(winrewards)
	script.Running.Value = true
end

local function EndTournament()
	AllEventEnd:FireAllClients()
	table.clear(EnteredPlayers)
	script.Running.Value = false
end

while true do
	task.wait(30)
	FireTournament()
	ChatEvent:FireAllClients(tostring("[TMNT] New tournament started, the prize is ".. winrewards.. " time."), 0, 3)
	for i = 30, 0, -1 do
		task.wait(1)
		if i == 30 then
			ChatEvent:FireAllClients(tostring("[TMNT] "..i.." seconds left to join!"), 0, 4)
		end
		if i == 15 then
			ChatEvent:FireAllClients(tostring("[TMNT] "..i.." seconds left to join!"), 0, 4)
		end
		if i == 5 then
			ChatEvent:FireAllClients(tostring("[TMNT] "..i.." seconds left to join!"), 0, 4)
		end
	end
	script.Running.Value = false
	AllEventEnd:FireAllClients()
	for i,v in ipairs(EnteredPlayers) do
		v.Character:WaitForChild("Humanoid").Died:Connect(function()
			table.remove(EnteredPlayers, i)
			local BoolStore = DataStore2("TournamentBool", v)
			BoolStore:Set(false)
		end)
		v.CharacterRemoving:Connect(function()
			table.remove(EnteredPlayers, i)
			local BoolStore = DataStore2("TournamentBool", v)
			BoolStore:Set(false)
		end)
	end
	ChatEvent:FireAllClients(tostring("[TMNT] The tournament has started!"), 0, 2)
	repeat task.wait(1) until #EnteredPlayers <= 1
	if #EnteredPlayers == 1 then
		for i, v in ipairs(EnteredPlayers) do
			print(v.Name.. " won the tournament.")
			local WinsStore = DataStore2("TournamentWins", v)
			WinsStore:Increment(1)
			local TimeStore = DataStore2("Time", v)
			TimeStore:Increment(winrewards)
			winner = v.Name
			local BoolStore = DataStore2("TournamentBool", v)
			BoolStore:Set(false)
		end
	else
		winner = "Nobody"
	end
	EndTournament()
	ChatEvent:FireAllClients(winner, winrewards, 1)
end
2 Likes

Hmm that’s odd. The scripts you provided seem to be fine. I don’t think there’s a problem with datstore2 in the other scripts as the data is cached once the :Get(default: any) is used. You can re-write the way you save the swords. Would you mind providing me a text sample of the actual data which holds the swords, as such?:

print(table.unpack(swordTable))

Edit: This can give me an idea of how you’re requesting the swords.

1 Like

Okay, here you go.

(There’s random blank spaces because i have a few unnamed swords and that i just haven’t named yet.)

For more context, this is the script that has all the swords in it
function contents:GetItemTypes(case)
	local itemtypes = {
		--Common
		{							
			Rarity = {Name = "Common", Chance = 0.5};
			Items = {
				{Name = "Blood Rain", ImageId = 0, Case = "Grave Case"};
				{Name = "Poison Pot", ImageId = 0, Case = "Grave Case"};

				{Name = "Incinerate", ImageId = 0, Case = "Solar Case"};
				{Name = "Puddle", ImageId = 0, Case = "Solar Case"};

				{Name = "Silver Shards", ImageId = 0, Case = "Radiance Case"};
				{Name = "Gold Shards", ImageId = 0, Case = "Radiance Case"};

				{Name = "Leaf Bliss", ImageId = 0, Case = "Jungle Case"};
				{Name = "Leaves", ImageId = 0, Case = "Jungle Case"};

				{Name = "Stone Knockout", ImageId = 0, Case = "Castle Case"};
				{Name = "Stone Wall", ImageId = 0, Case = "Castle Case"};
				
				{Name = "Ocean Wave", ImageId = 0, Case = "Orca's Case"};
				{Name = "Iceberg", ImageId = 0, Case = "Orca's Case"};
				
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				
				{Name = "", ImageId = 0, Case = "Aly's Case"};
				{Name = "", ImageId = 0, Case = "Aly's Case"};
			}
		};
		--Uncommon
		{							
			Rarity = {Name = "Uncommon", Chance = 0.325};
			Items = {
				{Name = "Skeletons", ImageId = 0, Case = "Grave Case"};
				
				{Name = "Flaring Sword", ImageId = 0, Case = "Solar Case"};
				
				{Name = "Crystalized", ImageId = 0, Case = "Radiance Case"};
				
				{Name = "Prowler", ImageId = 0, Case = "Jungle Case"};

				{Name = "New Threat", ImageId = 0, Case = "Castle Case"};
				
				{Name = "Kelp Blade", ImageId = 0, Case = "Orca's Case"};
				
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				
				{Name = "", ImageId = 0, Case = "Aly's Case"};

			}
		};
		--Rare
		{							
			Rarity = {Name = "Rare", Chance = 0.15};
			Items = {
				{Name = "Dark Faerie", ImageId = 0, Case = "Grave Case"};
				
				{Name = "Sun Beams", ImageId = 0, Case = "Solar Case"};
				
				{Name = "Ice Barbarian", ImageId = 0, Case = "Radiance Case"};
				
				{Name = "Bird Whisperer", ImageId = 0, Case = "Jungle Case"};

				{Name = "Suited Up", ImageId = 0, Case = "Castle Case"};

				{Name = "School of Fish", ImageId = 0, Case = "Orca's Case"};
				
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				
				{Name = "", ImageId = 0, Case = "Aly's Case"};

			}
		};
		--Legendary
		{							
			Rarity = {Name = "Legendary", Chance = 0.02};
			Items = {
				{Name = "Necromancer", ImageId = 0, Case = "Grave Case"};
				
				{Name = "Solar Mage", ImageId = 0, Case = "Solar Case"};
				
				{Name = "Frosted Ocean", ImageId = 0, Case = "Radiance Case"};
				
				{Name = "Vine Swing", ImageId = 0, Case = "Jungle Case"};

				{Name = "Cannonball!", ImageId = 0, Case = "Castle Case"};

				{Name = "Mermaid Sword", ImageId = 0, Case = "Orca's Case"};
				
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				
				{Name = "", ImageId = 0, Case = "Aly's Case"};

			}
		};
		--Mythical
		{							
			Rarity = {Name = "Mythical", Chance = 0.0005};
			Items = {
				{Name = "Crypt", ImageId = 0, Case = "Grave Case"};
				
				{Name = "Inferno", ImageId = 0, Case = "Solar Case"};
				
				{Name = "Disinferno", ImageId = 0, Case = "Radiance Case"};
				
				{Name = "Jungle King", ImageId = 0, Case = "Jungle Case"};

				{Name = "The Ruler", ImageId = 0, Case = "Castle Case"};

				{Name = "Orca's Sword", ImageId = 0, Case = "Orca's Case"};
				
				{Name = "", ImageId = 0, Case = "Emmy's Case"};
				
				{Name = "", ImageId = 0, Case = "Aly's Case"};


			}
		};
	}
2 Likes

Well the code you provided seems rather inefficient. I think instead of storing every sword in the combined key. You should store all the swords within a dictionary as such:

local swords: any = {
    ["Classic"] = 1,
    ["Lightning"] = 0,
} :: any

Where the key in the table is the name of the sword, and the value is the amount of swords that player owns. And if you don’t want the player to own multiple swords just make it a boolean instead of a number as such:

local swords: any = {
    ["Classic"] = true, -- owns the sword.
    ["Lightning"] = false, -- doesn't own the sword.
} :: any

So some code would look like this:

-- services
local players: Players = game:GetService("Players") :: Players

-- modules
local datastore2: any = require(script:WaitForChild("Datastore2", 100) :: ModuleScript) :: any

-- functions
datastore2.Combine("MasteryKey00001", "Swords")

players.PlayerAdded:Connect(function(player: Player)
    -- if you want to get the player's sword collection:
	local swords: any = datastore2("Swords", player):Get({
		["Classic"] = true,
	}) -- we put a table in here with the classic sword because if the player has no data, this is what the player's starting data will be.
end)

-- now if you wish to add a sword to the players sword collection just do this:
local function InstanceSword(sword: string, player: Player)
	local swords: any = datastore2("Swords", player):Get({
		["Classic"] = true,
	}) -- remember to always set a default value within your get functions.
	
	swords[sword] = true
	
	datastore2("Swords", player):Set(swords :: any)
end

Whenever a player opens a case, you can use the InstanceSword(sword: string, player: Player) function to add the sword into the player’s sword collection.

1 Like

I will try this now. I’ll inform you when I’m done.

1 Like

I want them to have multiple of them though, is that possible?

As I showed you before, just change the boolean into a number as such:

local swords: any = {
    ["Classic"] = 1,
    ["Lightning"] = 0,
} :: any

And if you want to add a sword to the player’s sword collection, simply do:

local function InstanceSword(sword: string, player: Player)
	local swords: any = datastore2("Swords", player):Get({
		["Classic"] = 1,
	}) -- remember to always set a default value within your get functions.
	
    -- gotta make sure that a sword exists before adding a value
    if (not swords[sword]) then
       swords[sword] = 1
    else
       swords[sword] += 1
    end
	
	datastore2("Swords", player):Set(swords :: any)
end
2 Likes

I’m struggling with putting it together. Do you think you can help me?

1 Like

Provide me with the problem(s) you are having

2 Likes

I don’t really know what to do. Should i store them under the same key?
image
And then from here I’m lost.

2 Likes

No, you should store Swords within the same combine function as such:

Datastore2.Combine("TestingDataKey1093",
    "Time",
    "Top",
    "Kills",
    "EQ",
    "Tweens",
    "TimeLight",
    "TournamentWins",
    "TournamentBool",
    "Swords"
)

If you wish to retrieve the swords data, simply do:

Datastore2("Swords", player):Get({
    ["Classic"] = 1,
}) -- remember to put a table with the classic sword inside as a default value

And if you want to get every single sword that’s contained, simply loop through it as such:

local swords: any = Datastore2("Swords", player):Get({
    ["Classic"] = 1,
}) -- remember to put a table with the classic sword inside as a default value

for sword: string, amount: number in pairs(swords :: any) do
    print(sword, amount) -- sword is just the name of the sword, and amount is how mant swords that player has.
end

And if you want to give a player a sword, for example after they open a crate/case, simply do:

local swords: any = Datastore2("Swords", player):Get({
	["Classic"] = 1,
}) -- remember to always set a default value within your get functions.
	
-- gotta make sure that a sword exists before adding a value
if (not swords[sword]) then
    swords[sword] = 1
else
    swords[sword] += 1
end
	
datastore2("Swords", player):Set(swords :: any)

And you can embed this stuff into a function for easier use, ( Each function labelled with a comment above ):

-- VVVVV how to give a player a sword VVVVV
local function InstanceSword(sword: string, player: Player)
	local swords: any = datastore2("Swords", player):Get({
		["Classic"] = 1,
	}) -- remember to always set a default value within your get functions.
	
    -- gotta make sure that a sword exists before adding a value
    if (not swords[sword]) then
       swords[sword] = 1
    else
       swords[sword] += 1
    end
	
	datastore2("Swords", player):Set(swords :: any)
end

-- VVVVV how to get the player's swords VVVVV
local function GetSwords(player: Player)
    return datastore2("Swords", player):Get({
	    ["Classic"] = 1,
    })
end

So to set it up properly you can use the InstanceSword function after the player opens a crate/case. So whatever sword they obtained, you can add that sword to their inventory through the datastore.

The function GetSwords is used when the player initially joins the game. It’s used to retrieve the player’s sword(s) for updating their inventory accordingly.

Now you may be wondering, once I use the function InstanceSword, how do I check that the datastore has been updated? Well you can use the method :OnUpdate(callback: thread/function). An example is shown below:

Datastore2("Swords", player):OnUpdate(function(newValue: any)
    print(newValue) -- the newValue variable is the current data after it has been updated.
end)

So if you have a RemoteEvent which updates the player’s inventory you can simply fire the event to the client, telling it to update the inventory as such:

Datastore2("Swords", player):OnUpdate(function(newValue: any)
    UpdateClientInventory:FireClient(player, newValue) -- sending the client ( player ) the sword(s) they own.
end)

Hope this helps, if you’re talking about another problem just let me know.

1 Like

Hi, thanks so much but what’s up with all the : things?

2 Likes

It’s called type checking. It’s used to increase something called intellisense while writing. It’s not an essential thing within scripting. But for languages like C#, you need to tell the program the type before you declare the variable as such:

bool Variable = true

I guess it just stuck with me as kind of a ‘bad’ habit.

1 Like

So, would I just put all the swords into a table everytime I do this? or only set put them into the original combine area?

2 Likes

Store the swords in a table, then save that table in the datastore.

1 Like

Hi, I’ve been working with your method and trying to figure it out. Can you review my progress here.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.