Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --// Services
- local Players = game:GetService("Players")
- local ReplicatedStorage = game:GetService("ReplicatedStorage")
- local RunService = game:GetService("RunService")
- local DSS = game:GetService("DataStoreService")
- --// Assets
- local Remotes = ReplicatedStorage:WaitForChild("Remotes")
- local DataEvent = Remotes:WaitForChild("Data")
- local Buy = Remotes:WaitForChild("Buy")
- local Modules = ReplicatedStorage:WaitForChild("Modules")
- local ClassInfo = require(Modules:WaitForChild("Class Info"))
- --// Variables
- local MaxTries = 5
- local Version = 1
- local DataStore = DSS:GetDataStore("Player's Datastore: "..Version)
- --// Settings
- local StartingData = {
- Data = {
- Stats = {
- Level = 1,
- Exp = 0,
- MaxExp = 100,
- Cash = 0
- },
- Characters = {
- ["Naruto"] = {
- Naruto = "Locked",
- Sasuke = "Locked",
- Kakashi = "Locked",
- },
- ["One Piece"] = {
- Luffy = "Locked",
- Zoro = "Locked",
- Sanji = "Locked",
- },
- }
- }
- }
- local ServerData = {}
- --// Functions
- local function DataRetry(Player, DataFunction, Argument)
- local success, errormsg, Tries, Data = false, nil, 0, nil
- while Tries < MaxTries and not success do
- Tries = Tries +1
- success, errormsg = pcall(function()
- Data = DataFunction(Player, Argument)
- end)
- if success then
- print("Data rety successfull for: "..Player.Name)
- else
- warn("DATABASE ERROR: "..errormsg.."For : "..Player.Name)
- wait(1)
- end
- end
- return Data
- end
- local function Save(Player, DataToSave)
- DataStore:SetAsync(Player.UserId, DataToSave)
- end
- local function Get(Player)
- local Data = DataStore:GetAsync(Player.UserId)
- return Data
- end
- local function UpdateClient(Player)
- while ServerData[Player].Data == nil do
- wait(1)
- end
- DataEvent:FireClient(Player, ServerData[Player].Data)
- end
- --// Module
- local module = {
- NewPlayer = function(Player)
- if RunService:IsStudio() then
- ServerData[Player].Data = StartingData.Data
- else
- local Data = DataRetry(Player, Get)
- if Data == nil then
- ServerData[Player].Data = StartingData.Data
- print(Player.Name.." has no Data")
- else
- ServerData[Player].Data = Data
- print(Player.Name.."'s Data has been loaded")
- end
- end
- UpdateClient(Player)
- end,
- returnData = function(Player)
- while ServerData[Player].Data == nil do
- wait(1)
- end
- return ServerData[Player].Data
- end,
- updateClient = function(Player)
- while ServerData[Player].Data == nil do
- wait(1)
- end
- DataEvent:FireClient(Player, ServerData[Player].Data)
- end,
- changeData = function(Player, DataTree, Stat, NewStat)
- ServerData[Player].Data[DataTree][Stat] = NewStat
- UpdateClient(Player)
- end,
- updateData = function(Player, DataTree, Stat, Type, Amount)
- if Type == "Add" then
- ServerData[Player].Data[DataTree][Stat] = ServerData[Player].Data[DataTree][Stat] +Amount
- elseif Type == "Subtract" then
- ServerData[Player].Data[DataTree][Stat] = ServerData[Player].Data[DataTree][Stat] -Amount
- elseif Type == "Divide" then
- ServerData[Player].Data[DataTree][Stat] = ServerData[Player].Data[DataTree][Stat] / Amount
- elseif Type == "Multiply" then
- ServerData[Player].Data[DataTree][Stat] = ServerData[Player].Data[DataTree][Stat] *Amount
- end
- UpdateClient(Player)
- end
- }
- --// Main
- Players.PlayerAdded:Connect(function(Player)
- ServerData[Player] = {}
- module.NewPlayer(Player)
- end)
- Players.PlayerRemoving:Connect(function(Player)
- if RunService:IsStudio() then return end
- DataRetry(Player, Save, ServerData[Player].Data)
- end)
- game:BindToClose(function()
- if RunService:IsStudio() then return end
- local List = Players:GetPlayers()
- for index = 1,#List do
- local Player = List[index]
- DataRetry(Players, Save, ServerData[Player].Data)
- print("Safe Saving: "..Player.Name.."'s Data")
- end
- end)
- -- Remotes
- DataEvent.OnServerEvent:Connect(function(Player, Arguments, Task)
- if Task == "update Data" then
- end
- end)
- Buy.OnServerInvoke = function(Player, Arguments)
- if ClassInfo[Arguments.Anime][Arguments.Character].Price == "Free" then
- ServerData[Player].Data.Characters[Arguments.Anime][Arguments.Character] = "Unlocked"
- UpdateClient(Player)
- return true
- else
- if ServerData[Player].Data.Stats.Cash >= ClassInfo[Arguments.Anime][Arguments.Character].Price then
- ServerData[Player].Data.Stats.Cash = ServerData[Player].Data.Stats.Cash - ClassInfo[Arguments.Anime][Arguments.Character].Price
- ServerData[Player].Data.Characters[Arguments.Anime][Arguments.Character] = "Unlocked"
- UpdateClient(Player)
- return true
- else
- UpdateClient(Player)
- return false
- end
- end
- end
- return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement