2013-08-11 3 views
0

Я только что начал новую версию моей модификации Side Server Wars Crysis под названием InfinityX. Для лучшего управления я помещал функции внутри таблиц, поскольку он выглядит аккуратно, и я могу группировать функции вместе (например, Core.PlayerHandle: GetIp (плеер)), но у меня возникла проблема. Проблема заключается в том, что указанный метод для получения имени игрока, 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()); 

Ошибка:

[Warning] [Lua Error] infinityx /main/core.events.lua:23: попытка вызвать метод 'GetName' (нилъ значение)

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)

Любое уточнение было бы оценено. Спасибо :)

ответ

2

Ну, как PlayerConnect находится внутри таблицы событий, и вы звоните с «:», добавить себя в качестве первого аргумента в функции, как:

PlayerConnect = function(self, player) 
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, вы можете попробовать сравнить их поля, чтобы увидеть, как они отличаются. Возможно, вам понадобится написать простую функцию демпинга, чтобы помочь в этом.

+0

Два значения «игрок» являются одинаковыми , Они называются главной функцией и не должны иметь никаких различий. Я только что провел дополнительное тестирование, и кажется, что у «игрока» нет ничего. Однако, если «игрок» пуст, клиент не будет иметь никакого имени. Я попробую еще раз, используя чистый набор файлов, чтобы увидеть, произошло ли что-то в этом месте. – cybermonkey

Смежные вопросы