为什么我在快速获得战利品后离开,这个 roblox 脚本就不能保存?
2019-1-30 2:12:52
收藏:0
阅读:128
评论:2
我制作了这个用于加载和保存数据的脚本。如果玩家很快就加入并退出,如何使它保存?如果我快速离开,它会丢弃数据?我尝试了几种方法,但似乎都不起作用。如果有人很快地加入,获得了很多赃物,然后退出,这将非常糟糕。有没有办法在关闭之前告诉服务器先保存所有东西呢?
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 = "等级"
local CrystalStat = Instance.new("IntValue", Stats)
CrystalStat.Name = "水晶"
local MoneyStat = Instance.new("IntValue", Stats)
MoneyStat.Name = "金钱"
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)
我该如何解决这个问题呢?
点赞
用户15498710
你应该在 game:BindToClose() 函数的末尾添加 wait(10),以使游戏在停止前等待更长的时间,从而使其能够保存数据。(game:BindToClose() 的最大等待时间为30秒)
game:BindToClose(function()
for O, Player in pairs(game.Players:GetPlayers()) do
if CanSaveData then
CanSaveData = false
SaveData(Player)
end
end
wait(10)
end)
2022-08-09 19:39:19
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我的建议是停止使用 Async 来保存玩家数据。比如,如果
GetAsync()失败,那么玩家的数据可能会被设置为 false 或 nil。如果这个值被写入数据存储,那么玩家的数据将完全被覆盖。如果玩家在不同的服务器之间快速切换,GetAsync()还可能检索到不正确的先前数据。为了防止这种情况,我们使用UpdateAsync()。