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)