Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- --[ Datastore Service ]--
- [+] Manages data for the servers!
- --]]
- --// Services
- local playerService = game:GetService("Players")
- local serverStorage = game:GetService("ServerStorage")
- local replicatedStorage = game:GetService("ReplicatedStorage")
- local dataStoreService = game:GetService("DataStoreService")
- local marketplace = game:GetService("MarketplaceService")
- local messageService = game:GetService("MessagingService")
- local chatService = require(game.ServerScriptService:WaitForChild("ChatServiceRunner").ChatService)
- local teleportService = game:GetService("TeleportService")
- local httpService = game:GetService("HttpService")
- --// Modules
- local modules = serverStorage:WaitForChild("Modules")
- local valmod = require(modules.CoreModules.ValueModule)
- local items = require(modules.Services.MarketService.ItemStorage)
- --// Storages
- local playerdatastore = dataStoreService:GetDataStore("BallOutPlayerData v.0.0.17")
- local admindatastore = dataStoreService:GetDataStore("BallOutAdminData v.0.0.02")
- local youtubedatastore = dataStoreService:GetDataStore("BallOutYoutube v.0.0.02")
- local bandatastore = dataStoreService:GetDataStore("BallOutBanData v.0.0.01")
- --// Default
- local defalut = require(script.DataManager)
- --// Data
- local adminData = admindatastore:GetAsync("Admins v.0.0.01")
- local youtubeData = youtubedatastore:GetAsync("YoutubeData v.0.0.01")
- local banData = bandatastore:GetAsync("Bans v.0.0.01")
- --// Checking data stores!
- if not (adminData) then
- admindatastore:SetAsync("Admins v.0.0.01", defalut.AdminData)
- adminData = admindatastore:GetAsync("Admins v.0.0.01")
- end
- if not (youtubeData) then
- youtubedatastore:SetAsync("YoutubeData v.0.0.01", {})
- youtubeData = youtubedatastore:GetAsync("YoutubeData v.0.0.01")
- end
- if not (banData) then
- bandatastore:SetAsync("Bans v.0.0.01", {})
- banData = bandatastore:GetAsync("Bans v.0.0.01")
- end
- --[ CLIENT ]--
- local client = replicatedStorage:WaitForChild("Communication").Client
- --// Game ID's
- local park = 4699691339
- local mobileOnlyPark = 5335220878
- --// Keys
- local dataStoreKeys = {
- ["AdminData"] = "Admins v.0.0.01",
- ["BansData"] = "Bans v.0.0.01",
- ["YoutubeData"] = "YoutubeData v.0.0.01",
- }
- local dataTable = {
- youtubeData = youtubeData,
- adminData = adminData,
- }
- local dataStores = {
- ["PlayerData"] = playerdatastore,
- ["AdminData"] = admindatastore,
- ["BansData"] = bandatastore,
- ["YoutubeData"] = youtubedatastore,
- }
- local gamepasses = {
- DoubleExp = 7111021,
- QuadExp = 7111036,
- NewDoubleExp = 10465070,
- NewQuadExp = 10465075,
- }
- --// Structures
- local values = {
- string = "StringValue",
- number = "NumberValue",
- boolean = "BoolValue"
- }
- --// Load Player Values
- local function LoadValues(player)
- local vals = Instance.new("Configuration", player)
- vals.Name = "values"
- for VN, VV in pairs(defalut.Default.PlayerValues) do
- local values = Instance.new(values[type(VV)], vals)
- values.Value = VV
- values.Name = VN
- end
- end
- --// Load Player Stats
- local function LoadStats(player, data)
- local statsfolder = Instance.new("Configuration", player)
- statsfolder.Name = "stats"
- --[ Build ]--
- for statname, statvalue in pairs(data.stats) do
- if (typeof(statvalue) ~= "table") then
- local object = Instance.new(values[type(statvalue)], statsfolder)
- object.Name = statname
- object.Value = statvalue
- end
- end
- --// Check
- if (game.PlaceId == park) then
- local parkRecord = data.stats.park
- --// Load
- for statname, statvalue in pairs(parkRecord) do
- local object = Instance.new(values[type(statvalue)], statsfolder)
- object.Name = statname
- object.Value = statvalue
- end
- else
- local recRecord = data.stats.rec
- --// Load
- for statname, statvalue in pairs(recRecord) do
- local object = Instance.new(values[type(statvalue)], statsfolder)
- object.Name = statname
- object.Value = statvalue
- end
- end
- end
- local function GetBoost(player, stats)
- --[ CHECK ]--
- local doubleExp = marketplace:UserOwnsGamePassAsync(player.userId, gamepasses.DoubleExp)
- local quadExp = marketplace:UserOwnsGamePassAsync(player.userId, gamepasses.QuadExp)
- local newDoubleExp = marketplace:UserOwnsGamePassAsync(player.userId, gamepasses.NewDoubleExp)
- local newQuadExp = marketplace:UserOwnsGamePassAsync(player.userId, gamepasses.NewQuadExp)
- local boost = Instance.new("NumberValue", stats)
- boost.Name = "boost"
- boost.Value = 0
- if (doubleExp) or (newDoubleExp) then
- boost.Value = boost.Value + 2
- end
- if (quadExp) or (newQuadExp) then
- boost.Value = boost.Value + 4
- end
- --// Check Boost
- if (boost.Value < 1) then
- boost.Value = 1
- end
- end
- local function IsActive(COURT)
- local _settings = COURT.Court.Settings
- --[ CHECK ]--
- return _settings.active.Value
- end
- local function GetCourt(courtName)
- for _, obj in pairs(workspace:GetChildren()) do
- if (obj:IsA("Model")) and (obj.Name == courtName) then
- return obj
- end
- end
- end
- local function LoadExtraValues(player, data)
- local playerDataKey = tostring(player.userId)
- local isAdmin = adminData[playerDataKey]
- local isYoutuber = youtubeData[playerDataKey]
- local isBanned = banData[playerDataKey]
- --// Check ban
- if (isBanned) then
- return player:Kick("You're banned!")
- end
- --// Check Admin
- if (isAdmin) then
- local playerGui = player:WaitForChild("PlayerGui")
- local character = player.Character
- local youtubeAdderUi = serverStorage.ServerPlayerAssets.YoutuberAdder:Clone()
- local banPanelUI = serverStorage.ServerPlayerAssets.BanPanel:Clone()
- youtubeAdderUi.Parent = playerGui
- banPanelUI.Parent = playerGui
- --// Check
- if (character) then
- local tag = character.Tag.Tag
- tag.TextColor3 = Color3.fromRGB(255, 255, 60)
- else
- player.CharacterAdded:Connect(function(char)
- local tag = char.Tag.Tag
- tag.TextColor3 = Color3.fromRGB(255, 255, 60)
- end)
- end
- coroutine.resume(coroutine.create(function()
- local speaker = chatService:GetSpeaker(player.Name)
- --// Wait For Speaker
- while not (speaker) do
- speaker = chatService:GetSpeaker(player.Name)
- wait(0.01)
- end
- if not (isYoutuber) then
- speaker:SetExtraData("Tags", {
- {
- TagText = "Owner",
- TagColor = Color3.fromRGB(255, 255, 60)
- }
- })
- else
- speaker:SetExtraData("Tags", {
- {
- TagText = "Owner",
- TagColor = Color3.fromRGB(255, 255, 60)
- },
- {
- TagText = "Youtuber",
- TagColor = Color3.fromRGB(147, 0, 0)
- }
- })
- end
- speaker:SetExtraData("ChatColor", Color3.fromRGB(255, 255, 60))
- speaker:SetExtraData("NameColor", BrickColor.new("Pastel yellow").Color)
- end))
- end
- --// Check Youtube
- if (isYoutuber) then
- if (isAdmin) then
- local character = player.Character
- local youtubeLogo = serverStorage.ServerPlayerAssets.YoutubeLogo:Clone()
- --// Check
- if (character) then
- local tag = character.Tag.Tag
- youtubeLogo.Parent = tag
- else
- player.CharacterAdded:Connect(function(char)
- local tag = char.Tag.Tag
- youtubeLogo.Parent = tag
- end)
- end
- else
- local character = player.Character
- local youtubeLogo = serverStorage.ServerPlayerAssets.YoutubeLogo:Clone()
- --// Check
- if (character) then
- local tag = character.Tag.Tag
- tag.TextColor3 = Color3.fromRGB(147, 0, 0)
- youtubeLogo.Parent = tag
- else
- player.CharacterAdded:Connect(function(char)
- local tag = char.Tag.Tag
- tag.TextColor3 = Color3.fromRGB(147, 0, 0)
- youtubeLogo.Parent = tag
- end)
- end
- coroutine.resume(coroutine.create(function()
- local speaker = chatService:GetSpeaker(player.Name)
- --// Wait For Speaker
- while not (speaker) do
- speaker = chatService:GetSpeaker(player.Name)
- wait(0.01)
- end
- speaker:SetExtraData("Tags", {
- {
- TagText = "Youtuber",
- TagColor = Color3.fromRGB(147, 0, 0)
- }
- })
- speaker:SetExtraData("ChatColor", Color3.fromRGB(147, 0, 0))
- speaker:SetExtraData("NameColor", BrickColor.new("Persimmon").Color)
- end))
- end
- --// Check
- local inventory = data.assets.inventory
- local trails = inventory.trails
- local ballTextures = inventory.balltextures
- --// Check
- if not (trails["Youtuber"]) then
- print("ADDING YOUTUBER TRAIL")
- trails["Youtuber"] = "Youtuber"
- end
- if not (ballTextures["Youtuber"]) then
- print("ADDING YOUTUBER TRAIL")
- ballTextures["Youtuber"] = "Youtuber"
- end
- end
- return isYoutuber
- end
- --[ DATASTORE_SERVICE ]--
- local DS = {}
- --[ Load Data ]--
- function DS:LoadAsync(player)
- print("LOADING PLAYER")
- local rawdata = playerdatastore:GetAsync(player.userId) or defalut:NewData()
- local data = defalut:CheckForUpdates(rawdata)
- --[ Load Values
- LoadExtraValues(player, data)
- LoadStats(player, data)
- LoadValues(player)
- --[ Store ]--
- client.Player.getdata:FireClient(player, data)
- _G.DS[player.Name] = data
- --// Create
- coroutine.resume(coroutine.create(function()
- --[ CONTROL_EXP ]--
- local stats = player:WaitForChild("stats")
- local char = player.Character
- local levelbadge = char.Level.LevelBadge
- local tag = char:FindFirstChild("Tag")
- --// Boost
- GetBoost(player, stats)
- valmod:Connect(levelbadge, stats)
- end))
- warn(httpService:JSONEncode(data):len())
- end
- --[ Save Player Data ]--
- function DS:SaveAsync(player, isShutDown)
- local data = _G.DS[player.Name]
- local vals = player:FindFirstChild("values")
- local stats = player:FindFirstChild("stats")
- --[ Check ]--
- if not (data) then
- warn(string.format("%s's data could not found in the container!", player.Name))
- --[ Data Exists ]--
- else
- --[ Save Data ]--
- playerdatastore:UpdateAsync(player.userId, function(oldData)
- local currentData = oldData or defalut:NewData()
- local cachedData = data
- --// Check
- if not (isShutDown) then
- local courtdata = _G[vals.Court.Value]
- --[ Check ]--
- if (courtdata) then
- local court = courtdata.court
- local getteam = courtdata.winningteam
- --// Check for activity
- if (courtdata.active.Value) then
- stats.loses.Value = stats.loses.Value + 1
- stats.streak.Value = 0
- elseif (getteam) then
- local hasWon
- --// Find
- for _, character in pairs(getteam) do
- if (character.Name == player.Name) then
- hasWon = character.Name
- break
- end
- end
- --// Check
- if not (hasWon) then
- stats.loses.Value = stats.loses.Value + 1
- stats.streak.Value = 0
- end
- end
- end
- end
- --[ Load ]--
- for name, stat in pairs(currentData.stats) do
- if (stats:FindFirstChild(name)) then
- currentData.stats[name] = stats:FindFirstChild(name).Value
- end
- end
- --// Check
- if (game.PlaceId == park) or (game.PlaceId == mobileOnlyPark) then
- local parkRecord = currentData.stats.park
- for statName, statValue in pairs(parkRecord) do
- parkRecord[statName] = stats:FindFirstChild(statName).Value
- end
- end
- --// Assets
- local cachedAssets = cachedData.assets
- local cachedInventory = cachedAssets.inventory
- local cachedGuiLayout = cachedAssets.guilayout
- --// Update Equipped
- for assetName, assetValue in pairs(cachedAssets) do
- currentData.assets[assetName] = assetValue
- end
- --// Update Inventory
- for className, classData in pairs(cachedInventory) do
- currentData.assets.inventory[className] = classData
- end
- --// Update Layout
- for guiName, guiPositionData in pairs(cachedGuiLayout) do
- currentData.assets.guilayout[guiName] = guiPositionData
- end
- print("UPDATING DATA")
- return currentData
- end)
- end
- --[ Remove ]--
- _G.DS[player.Name] = nil
- end
- --[ Update Custom Datastore ]--
- function DS:UpdateDatastoreAsync(DATASTORE, KEY, VALUE)
- local data = self:GetDatastoreAsync(DATASTORE)
- local dataStore = dataStores[DATASTORE]
- data[KEY] = VALUE
- dataStores[DATASTORE]:SetAsync(dataStoreKeys[DATASTORE], data)
- --// Check
- if (dataStore == youtubedatastore) then
- youtubeData = dataStores[DATASTORE]:GetAsync(dataStoreKeys[DATASTORE], data)
- dataTable["youtubeData"] = youtubeData
- elseif (dataStore == admindatastore) then
- adminData = dataStores[DATASTORE]:GetAsync(dataStoreKeys[DATASTORE], data)
- dataTable["adminData"] = adminData
- elseif (dataStore == bandatastore) then
- banData = dataStores[DATASTORE]:GetAsync(dataStoreKeys[DATASTORE], data)
- dataTable["banData"] = banData
- end
- end
- function DS:GetDatastoreAsync(DATASTORE)
- return dataStores[DATASTORE]:GetAsync(dataStoreKeys[DATASTORE]) or {}
- end
- function DS:GetDataTable(tableName)
- return dataTable[tableName]
- end
- client.Player.save.OnServerEvent:Connect(function(player, layoutData)
- for i, v in pairs(layoutData) do
- print(i, unpack(v))
- end
- _G.DS[player.Name].assets.guilayout = layoutData
- end)
- return DS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement