0

我刚刚开始了名为 InfinityX 的 Crysis Wars 服务器端修改的新版本。为了更好地管理,我将函数放在表格中,因为它看起来更整洁,并且可以将函数组合在一起(如 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 在表事件中,并且您使用“:”进行调用,因此将 self 作为第一个参数添加到函数中,例如:

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

显然,在第一个代码块中的代码与在第二个代码块中的player不一样。player问题一定是调用者Event.PlayerConnect没有传递相同的值。

要测试您的Event.PlayerConnect函数是否有效,请在与第二个代码块相同的位置尝试此操作:

Event.PlayerConnect(player)

这应该可以按您的预期工作。

因此,问题归结为Event.PlayerConnect在没有第二个代码块的情况下如何调用。我不熟悉那个游戏引擎,所以我不知道它是如何完成的。也许查看文档和/或调试该区域会有所帮助。如果您print(player)或在这两种情况下调用等效的日志函数,您应该会看到它们是不同的。如果您无法在调试器中运行,您仍然可以使用print(debug.traceback("Accessing player, who's value is: "..player)). 如果在这两种情况下确实存在某种基于表的player对象,您可以尝试比较它们的字段以了解它们有何不同。您可能需要编写一个简单的转储函数来帮助解决这个问题。

于 2013-08-11T14:33:46.303 回答