Daily Shop Not working

Not sure why, but my daily (server-wide sync) shop doesn’t want to cooperate. Here’s the code, no errors in the output.

local game = game
local serverStorage = game:GetService("ServerStorage")
local workspace = game:GetService("Workspace")
local HttpService = game:GetService("HttpService")
local DataStoreService = game:GetService("DataStoreService")

local syncedtime = require(serverStorage.SyncedTime)

local currentDay
local currentShopItems = {}
local hourOffset = 0
local offset = 60 * 60 * hourOffset

local NUM_SHIRTS_AND_PANTS = 18

local ShopDataStore = DataStoreService:GetDataStore("Shop")
local MannequinDataStore = DataStoreService:GetDataStore("MannequinData")

local function toHMS(s)
	return string.format("%02i:%02i:%02i", s / 60^2, s / 60 % 60, s % 60)
end

local function getAvailableItems(day, numberOfItems)
	local rng = Random.new(day)
	local shopItems = {}

	local shirtsFolder = serverStorage:FindFirstChild("Shirts")
	local pantsFolder = serverStorage:FindFirstChild("Pants")

	if shirtsFolder and pantsFolder then
		local shirts = shirtsFolder:GetChildren()
		local pants = pantsFolder:GetChildren()

		local function generateItem()
			local shirt = shirts[rng:NextInteger(1, #shirts)]
			local pant = pants[rng:NextInteger(1, #pants)]
			table.insert(shopItems, {shirt = shirt, pant = pant})
		end

		repeat
			generateItem()
		until #shopItems >= numberOfItems
	else
		warn("Shirts or Pants folder not found in ServerStorage.")
	end

	return shopItems
end

local function saveShopData(seed, shopItems)
	local success, error = pcall(function()
		local serializedShopItems = HttpService:JSONEncode(shopItems)
		ShopDataStore:SetAsync("Seed", seed)
		ShopDataStore:SetAsync("ShopItems", serializedShopItems)
	end)
	if not success then
		warn("Failed to save shop data:", error)
	end
end

local function loadShopData()
	local success, shopData = pcall(function()
		local seed = ShopDataStore:GetAsync("Seed")
		local serializedShopItems = ShopDataStore:GetAsync("ShopItems")
		if serializedShopItems then
			local shopItems = HttpService:JSONDecode(serializedShopItems)
			return seed, shopItems
		else
			return seed, nil
		end
	end)
	if success then
		if type(shopData) == "table" then
			return shopData[1], shopData[2]
		else
			return shopData, nil
		end
	else
		warn("Failed to load shop data:", shopData)
		return nil, nil
	end
end

local function saveMannequinData(mannequinsData)
	local success, error = pcall(function()
		MannequinDataStore:SetAsync("Mannequins", mannequinsData)
	end)
	if not success then
		warn("Failed to save mannequin data:", error)
	end
end

local function loadMannequinData()
	local success, mannequinsData = pcall(function()
		return MannequinDataStore:GetAsync("Mannequins")
	end)
	if success then
		return mannequinsData
	else
		warn("Failed to load mannequin data:", mannequinsData)
		return nil
	end
end

local function saveAllMannequinStates()
	local mannequinsFolder = workspace:FindFirstChild("Mannequins")
	if mannequinsFolder then
		local mannequinsData = {}
		for _, mannequin in ipairs(mannequinsFolder:GetChildren()) do
			local selectedShirt = mannequin:FindFirstChild("Shirt") and mannequin.Shirt.ShirtTemplate or nil
			local selectedPants = mannequin:FindFirstChild("Pants") and mannequin.Pants.PantsTemplate or nil
			mannequinsData[mannequin.Name] = {
				selectedShirt = selectedShirt,
				selectedPants = selectedPants
			}
		end
		local serializedMannequinsData = HttpService:JSONEncode(mannequinsData)
		saveMannequinData(serializedMannequinsData)
	end
end

-- Function to load all mannequin states
local function loadAllMannequinStates()
	local serializedMannequinsData = loadMannequinData()
	if serializedMannequinsData then
		local mannequinsData = HttpService:JSONDecode(serializedMannequinsData)
		if mannequinsData then
			local mannequinsFolder = workspace:FindFirstChild("Mannequins")
			if mannequinsFolder then
				for mannequinName, mannequinData in pairs(mannequinsData) do
					local mannequin = mannequinsFolder:FindFirstChild(mannequinName)
					if mannequin then
						mannequin.Shirt.ShirtTemplate = mannequinData.selectedShirt
						mannequin.Pants.PantsTemplate = mannequinData.selectedPants
					end
				end
			end
		end
	end
end

local function randomizeDailyShop(shopItems)
	local shirtsFolder = serverStorage:FindFirstChild("Shirts")
	local pantsFolder = serverStorage:FindFirstChild("Pants")

	if shirtsFolder and pantsFolder then
		local shirts = shirtsFolder:GetChildren()
		local pants = pantsFolder:GetChildren()

		if #shirts >= NUM_SHIRTS_AND_PANTS and #pants >= NUM_SHIRTS_AND_PANTS then
			local selectedShirtsIndexes = {}
			local selectedPantsIndexes = {}

			for i = 1, NUM_SHIRTS_AND_PANTS do
				local randomShirtIndex
				repeat
					randomShirtIndex = math.random(1, #shirts)
				until not selectedShirtsIndexes[randomShirtIndex]
				selectedShirtsIndexes[randomShirtIndex] = true

				local randomPantsIndex
				repeat
					randomPantsIndex = math.random(1, #pants)
				until not selectedPantsIndexes[randomPantsIndex]
				selectedPantsIndexes[randomPantsIndex] = true
			end

			local mannequinsFolder = workspace:FindFirstChild("Mannequins")
			if mannequinsFolder then
				local mannequins = mannequinsFolder:GetChildren()
				local mannequinsData = {}

				for i, mannequin in ipairs(mannequins) do
					local randomShirtIndex = math.random(1, #shirts)
					local randomPantsIndex = math.random(1, #pants)
					local selectedShirt = shirts[randomShirtIndex]
					local selectedPants = pants[randomPantsIndex]

					local shirtObject = mannequin:FindFirstChild("Shirt")
					local pantsObject = mannequin:FindFirstChild("Pants")

					if shirtObject and pantsObject then
						mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
						mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
						print("Mannequin " .. i .. " - Shirt: " .. selectedShirt.Name .. " | Pants: " .. selectedPants.Name)

						mannequinsData[i] = {
							selectedShirt = selectedShirt.Name,
							selectedPants = selectedPants.Name
						}
					elseif shirtObject then
						mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
						print("Mannequin " .. i .. " - Shirt: " .. selectedShirt.Name .. " | Added random Pants")

						mannequinsData[i] = {
							selectedShirt = selectedShirt.Name,
							selectedPants = "Random Pants"
						}
					elseif pantsObject then
						mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
						print("Mannequin " .. i .. " - Pants: " .. selectedPants.Name .. " | Added random Shirt")

						mannequinsData[i] = {
							selectedShirt = "Random Shirt",
							selectedPants = selectedPants.Name
						}
					else
						local randomItemType = math.random(1, 2)
						if randomItemType == 1 then
							mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
							print("Mannequin " .. i .. " - Added random Shirt")

							mannequinsData[i] = {
								selectedShirt = selectedShirt.Name,
								selectedPants = "Random Pants"
							}
						else
							mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
							print("Mannequin " .. i .. " - Added random Pants")

							mannequinsData[i] = {
								selectedShirt = "Random Shirt",
								selectedPants = selectedPants.Name
							}
						end
					end
				end

				saveMannequinData(mannequinsData)
			end
		end
	end
end

-- Load savedSeed and savedShopItems from DataStore
local savedSeed, savedShopItems = loadShopData()

-- Main loop
while true do
	local currentTime = syncedtime.time()
	local day = math.floor((currentTime + offset) / (60 * 60 * 24))

	if day ~= currentDay then
		currentDay = day
		local seed = savedSeed or day
		local currentShopItems = savedShopItems or getAvailableItems(seed, 24)
		randomizeDailyShop(currentShopItems)
		saveShopData(seed, currentShopItems)
		print("Updated shop items.")

		-- Save mannequin data when shop items are updated
		local mannequinsData = loadMannequinData()
		saveMannequinData(mannequinsData)
	end
	wait(1)
end

-- Function to handle player join
local function onPlayerJoin(player)
	-- Load saved shop data from DataStore
	local savedSeed, savedShopItems = loadShopData()

	-- Load saved mannequin data from DataStore
	local savedMannequinData = loadMannequinData()

	-- Check if saved data exists
	if savedSeed and savedShopItems then
		local currentTime = syncedtime.time()
		local day = math.floor((currentTime + offset) / (60 * 60 * 24))

		-- If it's a new day, update the shop data and mannequin data
		if day ~= savedSeed then
			-- Generate new seed for the day
			local seed = day

			-- Generate new shop items based on the seed
			local newShopItems = getAvailableItems(seed, 24)

			-- Randomize the shop items
			randomizeDailyShop(newShopItems)

			-- Save the new seed and shop items in DataStore
			saveShopData(seed, newShopItems)

			saveMannequinData(savedMannequinData)

		else

			loadAllMannequinStates()

		end
	else
		-- If saved data doesn't exist, generate new shop data
		local currentTime = syncedtime.time()
		local day = math.floor((currentTime + offset) / (60 * 60 * 24))

		-- Generate new seed for the day
		local seed = day

		-- Generate new shop items based on the seed
		local newShopItems = getAvailableItems(seed, 24)

		-- Randomize the shop items
		randomizeDailyShop(newShopItems)

		-- Save the new seed and shop items in DataStore
		saveShopData(seed, newShopItems)

		loadAllMannequinStates()

	end
end

game.Players.PlayerAdded:Connect(onPlayerJoin)

1 Like

what exactly that is not working here? is data not loaded in or something?

1 Like

It’s not resetting every 24 hours, it’s just resetting everytime I were to rejoin

1 Like

The shop itself don’t reset but it seem that you forget to utilize seed when random items in daily shop?

I have added math.randomseed in randomizeDailyShop


local function randomizeDailyShop(shopItems, seed)
	
	math.randomseed(seed or 0)
	
	local shirtsFolder = serverStorage:FindFirstChild("Shirts")
	local pantsFolder = serverStorage:FindFirstChild("Pants")

	if shirtsFolder and pantsFolder then
		local shirts = shirtsFolder:GetChildren()
		local pants = pantsFolder:GetChildren()

		if #shirts >= NUM_SHIRTS_AND_PANTS and #pants >= NUM_SHIRTS_AND_PANTS then
			local selectedShirtsIndexes = {}
			local selectedPantsIndexes = {}

			for i = 1, NUM_SHIRTS_AND_PANTS do
				local randomShirtIndex
				repeat
					randomShirtIndex = math.random(1, #shirts)
				until not selectedShirtsIndexes[randomShirtIndex]
				selectedShirtsIndexes[randomShirtIndex] = true

				local randomPantsIndex
				repeat
					randomPantsIndex = math.random(1, #pants)
				until not selectedPantsIndexes[randomPantsIndex]
				selectedPantsIndexes[randomPantsIndex] = true
			end

			local mannequinsFolder = workspace:FindFirstChild("Mannequins")
			if mannequinsFolder then
				local mannequins = mannequinsFolder:GetChildren()
				local mannequinsData = {}

				for i, mannequin in ipairs(mannequins) do
					local randomShirtIndex = math.random(1, #shirts)
					local randomPantsIndex = math.random(1, #pants)
					local selectedShirt = shirts[randomShirtIndex]
					local selectedPants = pants[randomPantsIndex]

					local shirtObject = mannequin:FindFirstChild("Shirt")
					local pantsObject = mannequin:FindFirstChild("Pants")

					if shirtObject and pantsObject then
						mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
						mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
						print("Mannequin " .. i .. " - Shirt: " .. selectedShirt.Name .. " | Pants: " .. selectedPants.Name)

						mannequinsData[i] = {
							selectedShirt = selectedShirt.Name,
							selectedPants = selectedPants.Name
						}
					elseif shirtObject then
						mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
						print("Mannequin " .. i .. " - Shirt: " .. selectedShirt.Name .. " | Added random Pants")

						mannequinsData[i] = {
							selectedShirt = selectedShirt.Name,
							selectedPants = "Random Pants"
						}
					elseif pantsObject then
						mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
						print("Mannequin " .. i .. " - Pants: " .. selectedPants.Name .. " | Added random Shirt")

						mannequinsData[i] = {
							selectedShirt = "Random Shirt",
							selectedPants = selectedPants.Name
						}
					else
						local randomItemType = math.random(1, 2)
						if randomItemType == 1 then
							mannequin.Shirt.ShirtTemplate = selectedShirt.ShirtTemplate
							print("Mannequin " .. i .. " - Added random Shirt")

							mannequinsData[i] = {
								selectedShirt = selectedShirt.Name,
								selectedPants = "Random Pants"
							}
						else
							mannequin.Pants.PantsTemplate = selectedPants.PantsTemplate
							print("Mannequin " .. i .. " - Added random Pants")

							mannequinsData[i] = {
								selectedShirt = "Random Shirt",
								selectedPants = selectedPants.Name
							}
						end
					end
				end

				saveMannequinData(mannequinsData)
			end
		end
	end
end

and pass saved seed to the function


-- Main loop
while true do
	local currentTime = syncedtime.time()
	local day = math.floor((currentTime + offset) / (60 * 60 * 24))

	if day ~= currentDay then
		currentDay = day
		local seed = savedSeed or day
		local currentShopItems = savedShopItems or getAvailableItems(seed, 24)
		
		randomizeDailyShop(currentShopItems,seed) --Passed seed to function
		saveShopData(seed, currentShopItems)
		print("Updated shop items.")

		-- Save mannequin data when shop items are updated
		local mannequinsData = loadMannequinData()
		saveMannequinData(mannequinsData)
	end
	wait(1)
end

and this is the result

is this intended behavior? if not feel free to correct me again.

1 Like