-- Pobieranie obiektu "Players" z gry, który zawiera informacje o wszystkich graczach w danej sesji. local players = game:GetService("Players") -- Pobieranie obiektu "PlayerData" z obiektu "script", który przechowuje dane dla wszystkich graczy. local playerData = script.PlayerData -- Definiujemy zmienną 'dataStoreService' i przypisujemy jej serwis DataStoreService local dataStoreService = game:GetService("DataStoreService") -- Definiujemy zmienną 'dataStore' i pobieramy z niej dane o nazwie 'Data' local dataStore = dataStoreService:GetDataStore("Data") -- Definiujemy zmienną 'key' i przypisujemy jej wartość 'TestKey1' local key = "TestKey2" -- Definiujemy zmienne 'remotes', 'bank' i 'area' i -- przypisujemy im odpowiednie wartości z ReplicatedStorage local remotes = game.ReplicatedStorage.Remotes local bank = remotes.Bank local area = remotes.Area -- odwołanie do zdarzenia CreateTemplate local createTemplate = remotes.CreateTemplate -- Definiowanie funkcji "LoadData" przyjmującej jako argument "player". -- Funkcja ta jest odpowiedzialna za wczytanie danych dla gracza, który dołączył do gry. local function LoadData(player) -- Przeszukiwanie wszystkich dzieci obiektu "playerData" za pomocą pary "i, v" (indeks, wartość). for i, v in pairs(playerData:GetChildren()) do -- Klonowanie obiektu "v" (dane dla gracza) i ustawianie go jako dziecko obiektu "player". -- Dzięki temu gracz otrzymuje dane z "playerData" po dołączeniu do gry. v:Clone().Parent = player end -- Definiujemy zmienną 'data' local data -- Wywołujemy funkcję 'GetAsync' na obiekcie 'dataStore' i przypisujemy wynik do zmiennej 'data' local success, errorMsg = pcall(function() data = dataStore:GetAsync(player.UserId .. key) -- Przeglądamy dane i aktualizujemy wartości leaderstats gracza if not data then return end for key, folder in pairs(data) do if key == "leaderstats" then for item, amount in pairs(folder) do if item == "Coins" then player.leaderstats.Coins.Value = amount elseif item == "Diamonds" then player.leaderstats.Diamonds.Value = amount elseif item == "Shards" then player.leaderstats.Shards.Value = amount end end end -- Sprawdzamy, czy gracz posiada dostęp do określonych obszarów if key == "Areas" then for item, amount in pairs(folder) do if not player.Areas:FindFirstChild(item) then local value = Instance.new("StringValue", player.Areas) value.Name = item area:FireClient(player, workspace.Areas[value.Name].Barrier) end end end -- jeśli klucz (key) równa się "Pets" if key == "Pets" then -- pętla for przechodzi przez każdy element "folder" for id, petName in pairs(folder) do -- tworzy nowy obiekt "StringValue" o nazwie -- "pet" i umieszcza go w folderze "Pets" gracza. local pet = Instance.new("StringValue", player.Pets) -- nadaje nazwę zwierzaka jako nazwę obiektu pet.Name = petName -- przypisuje wartość id do obiektu pet.Value = id -- wywołuje zdarzenie przekazując do niego -- gracza, nazwę zwierzaka oraz jego id createTemplate:FireClient(player, petName, id) end end -- Sprawdzenie warunku, czy zmienna 'key' jest równa "Codes". if key == "Codes" then -- Przejście po parach (kod, wartość) w tabeli 'folder' za pomocą pętli 'pairs'. for code, value in pairs(folder) do -- Utworzenie nowego elementu typu 'StringValue' i przypisanie jego do zmiennej local usedCode = Instance.new("StringValue", player.Codes) -- Ustawienie właściwości 'Name' utworzonego obiektu na wartość 'code'. usedCode.Name = code end end -- =================================Nowy kod================================== if key == "Values" then player.Values.Damage.Value = data.Values.Damage end -- =================================Koniec nowego kodu================================== end print("Loaded data") print(data) end) -- Jeżeli wykonanie zadania nie udało się, wyświetlamy błąd i ponownie ładujemy dane if not success then warn(errorMsg) wait(5) LoadData(player) end end -- Funkcja 'SaveData', która zapisuje dane gracza na serwerze local function SaveData(player) -- Definiujemy zmienną 'data' i -- przeglądamy wszystkie dzieci gracza, zapisując ich wartości do zmiennej 'data' local data = {} local success, errorMsg = pcall(function() for i, folder in pairs(player:GetChildren()) do if folder:IsA("Folder") then data[folder.Name] = {} for i, item in pairs(folder:GetChildren()) do if item.Value then -- jeśli nazwa folderu to "Pets" if folder.Name == "Pets" then -- przypisuje id zwierzaka do słownika -- z wartością odpowiadającą jego nazwie -- item.Value -> id zwierzaka -- item.Name -> nazwa zwierzaka -- modyfikacja jest wymagana, ponieważ, -- nazwy zwierzaków są powtarzalne, a -- id zwierzaków unikalne, -- bez tej modyfikacji nie można byłoby zapisać -- kilka zwierzaków o tej samej nazwie. data[folder.Name][item.Value] = item.Name else data[folder.Name][item.Name] = item.Value end end end end end -- Wywołujemy funkcję 'SetAsync' na obiekcie 'dataStore', zapisując dane gracza dataStore:SetAsync(player.UserId .. key, data) end) -- Jeżeli wykonanie zadania nie udało się, wyświetlamy błąd i ponownie zapisujemy dane if not success then warn(errorMsg) wait(5) SaveData(player) end print("Saved data") print(data) end -- Podpinamy funkcje 'LoadData' i 'SaveData' do eventów 'PlayerAdded' i 'PlayerRemoving' players.PlayerAdded:Connect(LoadData) players.PlayerRemoving:Connect(SaveData) -- Podpinamy funkcję do eventu 'OnServerEvent' na obiekcie 'bank', -- umożliwiającej graczom dodawanie środków do konta bank.OnServerEvent:Connect(function(player, action, currency, amount) if action == "+" then if currency == "Coins" then player.leaderstats.Coins.Value += amount elseif currency == "Diamonds" then player.leaderstats.Diamonds.Value += amount elseif currency == "Shards" then player.leaderstats.Shards.Value += amount end end end) local shards = remotes.Shards shards.OnServerEvent:Connect(function(player, drop) player.leaderstats.Shards.Value += drop end)