来自文件的Lua字符串

时间:2013-07-12 08:51:30

标签: string lua

我正在尝试建立一个为游戏服务器备份和恢复点的系统,这样它可以安全地重启而不会丢失任何东西。 我已经制作了一个脚本来做这个,实际的备份部分工作正常,但恢复部分没有。

这是在使用“备份(读取)”时运行的脚本(备份(写入)完全按照设计的方式运行):

if (source and read) then
  System.LogAlways("[System] Restoring serverdata from file 'backup.CHK'");
    for line in source:lines() do
      Backup = {};
      Backup.Date = (Date or line:match("File Last Modified: (.-)"));
      Backup.Time = (Time or line:match("time: (.-)"));
      US = tonumber((US or line:match("us: (.-)")));
      NK = tonumber((NK or line:match("nk: (.-)")));    
      local params = {class = "Player"; 
                      position = {x = 1, y = 1, z = -1000};
                      Respawn = { bRespawn = 0; nTimer =0; bUnique = 1; }; 
                      bUsable = 0; 
                      orientation = {0, 90, 135}; 
                      name = "BackupEntity"; };
      local ent = System.SpawnEntity(params);
      g_gameRules.game:SetTeam(1, ent.id);
      g_gameRules.game:SetSynchedEntityValue(playerId, 100, (NK/3));
      g_gameRules.game:SetTeam(2, ent.id);
      g_gameRules.game:SetSynchedEntityValue(playerId, 100, (US/3));
      System.RemoveEntity(params);
    end
  source:close();
  return;
end

我不确定我做错了什么,我看过的大多数网站都没有那么多帮助。问题是它没有从文件中读取任何值。

任何帮助将不胜感激:)。

修改

我们必须将得分除以3的原因是因为服务器将所有得分乘以3.如果我们不将它除以3,则每次恢复时得分总是大3倍。 backup.CHK文件的示例内容:

The server is dependent on this file, and writes to it every hour. Please do not edit.

    File Last Modified: 11/07/2013
    This file was generated by the servers' autobackup system.

--------------------------

    time: 22:51
    us: 453445
    nk: 454567

1 个答案:

答案 0 :(得分:2)

关于可能导致问题的几点想法:

使用匹配可能的最短模式的(.-)延迟匹配 - 这可以包括空字符串。通常,您希望尽可能使模式尽可能具体,同时仍然匹配所需的可能输入。例如。 (%d+)似乎usnk是合适的。{/ p>

for line in source:lines() do一次读取一行行。这必然意味着并非所有变量都将在循环内设置。然而,从local params开始向下的所有内容都使用这些变量,就像它们一样。在我看来,代码部分甚至不应该在循环中。

最后,您是否考虑将备份文件另存为另一个lua文件?这样做意味着你可以让lua为你做繁重的工作,你不必费心去解析它。这也最大限度地减少了出错的风险。