2013-07-12 61 views
3

我试图做一个备份和恢复游戏服务器点的系统,因此它可以安全地重新启动而不会丢失任何东西。 我已经做了一个脚本来做到这一点,实际备份部分工作正常,但恢复部分没有。来自文件的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 
+2

我假设你的意思是这是'备份(读取)'的代码(其中读取是一个正确设置的变量,是真实的。你能发布你的备份文件内容的样本以及你期望的内容吗?这个代码看起来不像是我期望的那样:) –

+0

具体来说,你不需要在分配给它的'Backup'表中创建一个新的'Backup'表对于每一行,然后用缺省值填充,如果在该行没有找到特定的值,则从文件中读取'US'和'NK'将被全局修改。 –

+0

请参阅已编辑的问题以获取文件内容的示例系统需要获取备份文件的时间和日期,以及美国和NK队的得分,然后将得分给玩家,我们刚刚在服务器中产生t为了恢复球队的分数而进行的。 – cybermonkey

回答

2

一对夫妇的什么可能导致问题的思路:

使用(.-)懒惰匹配相匹配的最短模式成为可能 - 这可以包括空字符串。通常,您希望尽可能使模式尽可能具体,同时仍然匹配所需的可能输入。例如。它看起来像(%d+)对于usnk是合适的。

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

最后,你有没有考虑将备份文件另存为另一个lua文件?这样做意味着你可以让lua为你做重要的事情,而且你不必自己去解析它。这也最大限度地减少了错误的风险。

+2

我最终决定将它保存为LUA脚本,现在可以正常工作。谢谢你的帮助 :)。 – cybermonkey