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