Почему этот скрипт Roblox не сохранится, если я быстро получу добычу и уйду? - PullRequest
0 голосов
/ 30 января 2019

Я сделал этот скрипт для загрузки и сохранения данных.Как я могу сохранить это, если игрок присоединяется и выходит очень быстро?Он откажется от данных, если я уйду быстро?Я попробовал несколько вещей, но ни одна из них, похоже, не работает.Было бы плохо, если бы кто-то быстро присоединился, получил много добычи и ушел, и все это было разбито.Есть ли какой-нибудь способ сказать серверу сохранить все это перед выключением?

local Database = game:GetService("DataStoreService"):GetDataStore("MAIN")
local RStorage = game:GetService("ReplicatedStorage")
local PlayerIndex = {}
local CanSaveData = true
local BFunctionF = Instance.new("Folder", RStorage)
function SaveData(Player)
    local SCS, Result = pcall(function()
        Database:SetAsync("USER"..Player.UserId, PlayerIndex[Player])
        while Database:GetAsync("USER"..Player.UserId) ~= PlayerIndex[Player] do
            Database:SetAsync("USER"..Player.UserId, PlayerIndex[Player])
            warn("Stupid")
        end
        CanSaveData = true
    end)
    if not SCS then
        warn(Result)
    end
end
BFunctionF.Name  = "DataManagerBindableFunctions"
game.Players.PlayerAdded:Connect(function(Player)
    local ChangeData = Instance.new("BindableFunction", BFunctionF)
    ChangeData.Name = Player.UserId

    local Stats = Instance.new("BoolValue", Player)
    Stats.Name = "leaderstats"  

    local LevelStat = Instance.new("IntValue", Stats)
    LevelStat.Name = "Level"

    local CrystalStat = Instance.new("IntValue", Stats)
    CrystalStat.Name = "Crystals"

    local MoneyStat = Instance.new("IntValue", Stats)
    MoneyStat.Name = "Money"

    local SCS, Data = pcall(function()
        local RawData = Database:GetAsync("USER"..Player.UserId) or {}
        local NewData = {
            ['Level'] = RawData['Level'] or 0,
            ['LvlXP'] = RawData['LvlXP'] or 0,
            ['Money'] = RawData['Money'] or 0,
            ['Crystal'] = RawData['Crystal'] or 0,
            ['Bonker'] = RawData['Bonker'] or 0,
            ['Sword'] = RawData['Sword'] or 0,
            ['Hammer'] = RawData['Hammer'] or 0,
            ['Knife'] = RawData['Knife'] or 0,
            ['Brick'] = RawData['Brick'] or 0}
        return NewData
    end)

    if SCS and Data then
        PlayerIndex[Player] = Data
    end

    MoneyStat.Value = Data.Money
    LevelStat.Value = Data.Level
    CrystalStat.Value = Data.Crystal

    ChangeData.OnInvoke = function(Type, Amount)
        print(Player, Type, Data[Type])
        if Data[Type] == nil then
            warn("Fake Playerdata Type")
        else
            local NV = Data[Type]+Amount
            if Type == "Crystal" then
                CrystalStat.Value = NV
            elseif Type == "Money" then
                MoneyStat.Value = NV
            elseif Type == "Level" then
                LevelStat.Value = NV
            end
            Data[Type] = NV
        end
        print(Data[Type])
        return Data[Type]   
    end
end)

game.Players.PlayerRemoving:Connect(function(Player)
    if CanSaveData then
        CanSaveData = false
        SaveData(Player)
    end
end)
game:BindToClose(function()
    for O, Player in pairs(game.Players:GetPlayers()) do
        if CanSaveData then
            CanSaveData = false
            SaveData(Player)
        end
    end
end)

Как я могу это исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...