3

ゲームサーバーのポイントをバックアップおよび復元するシステムを作成しようとしています。これにより、何も失うことなく安全に再起動できます。これを行うためのスクリプトを作成しましたが、実際のバックアップ部分は正常に機能しますが、復元部分は機能しません。

これは、'Backup(read)' が使用された場合に実行されるスクリプトです (Backup(write) は設計どおりに完全に機能します)。

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
4

1 に答える 1

2

問題を引き起こしている可能性のあるもののいくつかのアイデア:

(.-)可能な限り短いパターンに一致する遅延一致の使用-- これには空の文字列を含めることができます。通常、可能な限り必要な入力に一致させながら、パターンをできるだけ具体的にする必要があります。例えば。(%d+)のように見えusnk適切にフィットします。

は一度に1行ずつfor line in source:lines() do読み取ります。これは必ずしも、すべての変数がループ内で設定されるわけではないことを意味します。それでも、で始まるすべてのものは、それらの変数をあたかもそうであるかのように使用します。コードのセクションがループに入ってはいけないように思えます。local params

最後に、バックアップ ファイルを別の lua ファイルとして保存することを検討しましたか? そうすることで、面倒な作業を lua に任せることができ、わざわざ自分で解析する必要がなくなります。これにより、エラーのリスクも最小限に抑えられます。

于 2013-07-12T10:10:22.727 に答える