如何使用 file.Write 和 file.Read 来保存玩家数据

我正在尝试制作一款经验脚本。唯一我似乎无法理解的是数据保存。我正在使用 file.Write ,每当我的脚本从数据中读取玩家的等级和经验时,它都不能显示出来。我有我的变量 xp 等于 0 和 level 等于 1。如果我想使用 file.Write 将我分配的数字或添加到此数字的任何数字保存为新数字并将其读取为玩家刷新,我该如何做到这一点?

local xp = 0
local level = 1

local players = player.GetAll()

for k ,v in pairs(players) do
    file.Write("xpdata.txt", xp)
    file.Write("leveldata.txt", level)
end

hook.Add("PlayerSpawn", "leveldata", function()
    file.Read("xpdata.txt", "DATA")
    file.Read("leveldata.txt", "DATA")
end)
点赞
用户870125
用户870125

我认为你需要使用 JSON。

我现在不能提供一个完整的例子,但是你可以查看这个页面 https://wiki.gideros.rocks/index.php/Start_Here#Save.2Fread_data_persistently ,或许可以帮助你理解这个概念。

2021-02-14 03:48:30
用户2858170
用户2858170

如果您只是将文件读取到虚空中,您希望发生什么?

hook.Add("PlayerSpawn", "leveldata", function()
    file.Read("xpdata.txt", "DATA")
    file.Read("leveldata.txt", "DATA")
end)

这里您读取了两个文件,但是您没有对返回值做任何操作。 如果成功,则file.Read返回一个字符串,其中包含文件的内容。 您需要对返回值做些什么。

local xpData = file.Read("xpdata.txt", "DATA")
if not xpData then
  print("Reading data/xpdata.txt failed!")
else
  print("XP: ", xpData)
end

当然,您应该为每个玩家存储那些数据,并确保每个玩家都获得其自己的经验值分配。

local xp = 0
local level = 1
local players = player.GetAll()

for k ,v in pairs(players) do
    file.Write("xpdata.txt", xp)
    file.Write("leveldata.txt", level)
end

这也没有太多意义。 您正在为每个玩家写入相同的文件。 每个循环周期都将覆盖之前的循环的文件。

而且,使用相同的经验值和等级对每个玩家也没有太大帮助。

因此,您要么为每个玩家都有一个文件,要么在常见文件中具有某种类似结构,以便您可以编写和读取特定于玩家的数据。

在将数据写入文件之前,您需要“序列化”您的数据,并在稍后对其进行反序列化。

这可以通过使用两个实用程序函数来实现

https://wiki.facepunch.com/gmod/util.TableToJSON

https://wiki.facepunch.com/gmod/util.JSONToTable

然后您可以这样做

local playerData = {}
-- 对于每个玩家
for k, player in pairs(players) do
  -- 添加一个带有xp和lvl的表,以便稍后可以通过AccountID访问它
  playerData[player.AccountID] = {xp = player.xp, lvl = player.lvl}
end
local jsonStr = util.TableToJSON(playerData)
file.Write("playerdata.xp", jsonStr")

我会让剩下的给您学习。

2021-02-14 07:20:15