2013-07-12 69 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