0

InfinityX と呼ばれる Crysis Wars Server Side Modification の新しいバージョンを開始しました。管理を改善するために、見栄えが良く、関数をグループ化できるように関数をテーブル内に配置しました (Core.PlayerHandle:GetIp(player) のように) が、問題が発生しました。問題は、プレーヤーの名前を取得するために指定されたメソッドが、player:GetName()実際には完全に有効であるにもかかわらず、無効なメソッドと見なされていることです。

以下の構造を使用すると問題が発生するかどうか、問題が発生する場合は修正方法を教えてください。この構造を関数に使用するのはこれが初めてですが、使用していた古い方法よりも簡単であることが既に証明されています。

コード:

Event = 
{
    PlayerConnect = function(player)
        Msg.All:CenteredConsole("$4Event$8 (Connect)$9: $3"..player:GetName().." on channel "..player.actor:GetChannel());
        System.LogAlways(Default.Tag.."Incoming Connect on Channel "..player.actor:GetChannel());
        Event:Log("Connect", player);
    end;
};

以下のコードは、関数をバイパスしてコードを必要な場所に直接配置すると機能します。

Msg.All:CenteredConsole("$4Event$8 (Connect)$9: $3"..player:GetName().." on channel "..player.actor:GetChannel());

System.LogAlways(Default.Tag.."Incoming Connect on Channel "..player.actor:GetChannel());

エラー:

[警告] [Lua エラー] infinityx/main/core.events.lua:23: メソッド 'GetName' を呼び出そうとしています (nil 値)

PlayerConnect、(infinityx/main/core.events.lua: 23) ConnectScript、(infinityx/main/core.main.lua: 52) OnClientEnteredGame、(scripts/gamerules/instantaction.lua: 511) (null) (scripts/gamerules /teaminstantaction.lua: 520)

明確化をいただければ幸いです。ありがとう :)

4

2 に答える 2

2

さて、PlayerConnect はテーブル Event 内にあり、「:」で呼び出しているため、次のように関数の最初の引数として self を追加します。

PlayerConnect = function(self, player)
于 2013-08-11T19:11:56.987 に答える
0

明らかに、playerコードの最初のブロックは、コードの 2 番目のブロックと同じではありませんplayer。問題は、の呼び出し元がEvent.PlayerConnect同じ値を渡していないことです。

関数が機能することをテストするEvent.PlayerConnectには、コードの 2 番目のブロックと同じ場所でこれを試してください。

Event.PlayerConnect(player)

期待どおりに動作するはずです。

したがって、問題はEvent.PlayerConnect、2 番目のコード ブロックなしで を呼び出す方法に帰着します。私はそのゲームエンジンに詳しくないので、それがどのように行われるのかわかりません。おそらく、ドキュメントを確認したり、その領域をデバッグしたりすると役立つでしょう。どちらの場合print(player)も同等のログ関数を呼び出したり呼び出したりすると、それらが異なることがわかります。デバッガーで実行できない場合でも、でスタック トレースを取得できますprint(debug.traceback("Accessing player, who's value is: "..player))。どちらの場合にも何らかのテーブルベースのplayerオブジェクトが実際にある場合は、それらのフィールドを比較して、それらがどのように異なるかを確認できます。それを支援するために、単純なダンプ関数を作成する必要があるかもしれません。

于 2013-08-11T14:33:46.303 に答える