local playerStatManager = {}
local dataStoreService = game:GetService("DataStoreService")
local playerData = dataStoreService:GetDataStore("PlayerData_v4_2.2.6")-- 1.8.6 used in playable version
local AUTOSAVE_INTERVAL = 120
local DATASTORE_RETRIES = 3
local sessionData = {}
-- Function to Update the Leaderboard
local function updateBoard(player)
for i, e in pairs(sessionData[player])do
player.leaderstats[i].Value = e
end
end
function playerStatManager:ChangeStat(player,statName,changeValue)
sessionData[player][statName] = sessionData[player][statName]+ changeValue
updateBoard(player)
end
local function dataStoreRetry(dataStoreFunction)
local tries = 0
local success = true
local data = nil
repeat
tries = tries + 1
success = pcall(function()
data = dataStoreFunction()
end)
if not success then
wait(1)
end
until
tries == DATASTORE_RETRIES or success
if not success then
error("Could not access DataStore! Data might not save!")
end
return success,data
end
-- Function to retrieve players data from the DataStore
local function getPlayerData(player)
return dataStoreRetry(function()
return playerData:GetAsync(player.UserId)
end)
end
-- Function to save players data to DataStore
local function savePlayerData(player)
if sessionData[player] then
return dataStoreRetry(function()
return playerData:SetAsync(player.UserId,sessionData[player])
end)
end
end
local function setupPlayerData(player)
local success,data = getPlayerData(player)
if not success then
-- Could not access DataStore, set session data for player to false
sessionData[player] = false
else
if not data then
-- DataStores are working, but no data for this player
sessionData[player] = {MummyCount = 0, TotalEggs = 0, TotalTiles = 0, TotalPurple = 0, TotalOrange = 0, TotalGreen = 0, TotalYellow = 0, TotalBlue = 0, TotalRed = 0, BuyClothes = 0, TotalGems = 0, ChainDomeName = 0, TesterPass = 0, VipGamePass = 0, TotalGold = 0, RedBonus = 0, BlueBonus = 0, YellowBonus = 0, GreenBonus = 0, OrangeBonus = 0, PurpleBonus = 0, GoldBonus = 0, RainbowCatPants = 0, RainbowCatShirt = 0, RainbowButterflyPants = 0, RainbowButterflyShirt = 0, RobotPants = 0, RobotShirt = 0, RainbowBirdPants = 0, RainbowBirdShirt = 0, RainbowUnicornPants = 0, RainbowUnicornShirt = 0, BlueSpacePants = 0, BlueSpaceShirt = 0, JunglePants = 0, JungleShirt = 0, SandPants = 0, SandShirt = 0, PurpleHeartPants = 0, PurpleHeartShirt = 0, RainbowBeePants = 0, RainbowBeeShirt = 0, RedLavaPants = 0, RedLavaShirt = 0, PinkLeopardPants = 0, PinkLeopardShirt = 0, GlitterPants = 0, GlitterShirt = 0, BlackWhiteCirclesPants = 0, BlackWhiteCirclesShirt = 0, RainbowHeartsPants = 0, RainbowHeartsShirt = 0, MultiColoursPants = 0, MultiColoursShirt = 0, PurpleBlueTrianglePants = 0, PurpleBlueTriangleShirt = 0, BlueShardPants = 0, BlueShardShirt = 0, GreyCubesPants = 0, GreyCubesShirt = 0, MettalicGreyStripesPants = 0, MettalicGreyStripesShirt = 0, PinkSpacePants = 0, PinkSpaceShirt = 0, RedSpacePants = 0, RedSpaceShirt = 0, GreenTrianglesPants = 0, GreenTrianglesShirt = 0, ColourBubblesPants = 0, ColourBubblesShirt = 0, WaterPants = 0, WaterShirt = 0, YellowButterflyPants = 0, YellowButterflyShirt = 0, PenguinSpacePants = 0, PenguinSpaceShirt = 0, RainbowStripesPants = 0, RainbowStripesShirt = 0, ColorSpotsPants = 0, ColorSpotsShirt = 0, BlueZigsPants = 0, BlueZigsShirt = 0, BlueAndGreenCheckPants = 0, BlueAndGreenCheckShirt = 0, BlackAndWhitePants = 0, BlackAndWhiteShirt = 0, SpaceStrawberryPants = 0, SpaceStrawberryShirt = 0, GoldLovePants = 0, GoldLoveShirt = 0, MettalicGreyPants = 0, MettalicGreyShirt = 0, PurpleButterflyPants = 0, PurpleButterflyShirt = 0, SpaceLovePants = 0, SpaceLoveShirt = 0, SpaceBatPants = 0, SpaceBatShirt = 0, ColorCubesPants = 0, ColorCubesShirt = 0, MultiSpacePants = 0, MultiSpaceShirt = 0, BlueStarsPants = 0, BlueStarsShirt = 0,PinkSpaceSwirlPants = 0, PinkSpaceSwirlShirt = 0,PinkCubePants = 0, PinkCubeShirt = 0, PurpleGalaxyPants = 0, PurpleGalaxyShirt = 0, BestChain = 0, BirdPet = 0, BunnyPet = 0, ButterflyPet = 0, DragonPet = 0, FishPet = 0, MousePet = 0, SkunkPet = 0, UnicornPet = 0, DoggerPet = 0, CatPet = 0, SpawnedPets = 0, GoldSpent = 0, TotalGoldStat = 0, GoldFromRewards = 0,GoldFromWorking = 0, GoldFromBoard = 0, PlayerDistance = 0, GreenComplete = 0, GreenGoal = 5, Green = 0, RedComplete = 0, BlueComplete = 0, YellowComplete = 0, BoardPart = 0, Boards = 0, Yellow = 0, YelGoal = 5, Red = 0, RedGoal = 5, Blue = 0, BlueGoal = 5, Orange = 0, OrangeGoal = 5, OrangeComplete = 0, Purple = 0, PurpleGoal = 5, PurpleComplete = 0, Gold = 0, Claimed = 0}
savePlayerData(player)
else
-- DataStores are working and we got data for this player
sessionData[player] = data
end
end
updateBoard(player)
end
-- Function to run in the background to periodically save players data.
local function autoSave()
print("Autosaveed!")
while wait(AUTOSAVE_INTERVAL) do
for player, data in pairs(sessionData) do
savePlayerData(player)
end
end
end
-- Bind setupPlayerData to PlayerAdded to call it when player joins.
game.Players.PlayerAdded:Connect(setupPlayerData)
-- Call savePlayerData on PlayerRemoving to save player data when they leave.
-- Also delete the player from the sessionData, as the player isnt in-game anymore.
game.Players.PlayerRemoving:Connect(function(player)
savePlayerData(player)
sessionData[player] = nil
print("Data Saved!")
end)
-- Start running autosave function in the background
spawn(autoSave)
-- Return the PlayerStatManager table so external scripts can access it.
return playerStatManager