2016-05-20 3 views
1

Я пересмотрел функцию печати в LuaКак переопределить функцию LUA глобально

local myThing = PrintThing 
function PrintThing (text) 

    ... some code ... 

    return myThing(text) 

end 

Это работает для моего локального сценария

Но не в других сценариях

Как переопределить эту функцию печати во всем мире?

+0

Ничего не происходит, включая назначение глобальных переменных - до выполнения сценария. Выполнение вашего скрипта - единственный способ добиться эффекта. Предположительно, PrintThing является глобальной переменной. Ваш скрипт назначит его функции, созданной при запуске вашего скрипта. Выполняли ли вы свой сценарий перед другими сценариями, на которые вы хотите повлиять? –

+0

@TomBlodget Да, он всегда выполняется во-первых, я также назвал его '0 Script', поэтому он запускается в списке, я видел, что другие препятствовали выполнению этой функции« PrintThing »по их сценариям и только просили нас запустить их скрипты с именем 0, поэтому он запускается первым в списке. поэтому да, другие делают это, но я не могу понять, как :( – Vladimir

ответ

2

В общем, вы не можете. В лучшем случае вы можете просто переопределить функцию в глобальной среде (_G.PrintThing=...). Но даже это не всегда позволяет. Например. хост-приложение запускает ваш код в песочнице и не предоставляет доступ к глобальному env. В таком случае вы должны сделать C-модуль, чтобы получить доступ к глобальному env (но я не думаю, что sandboxed env позволяет загрузить такой модуль). Второй варианец - установите эту функцию в вашей среде. И если вы загружаете новые модули в одном и том же окружении, вам просто нужно переопределить функцию перед загрузкой библиотеки. Если вы попробуете переопределить функцию после загрузки модуля, это будет зависеть от самого модуля. например если вы используете local PrintThing = PrintThing, он не увидит вашу новую функцию после загрузки. Также C-код может напрямую использовать функции C.

+0

Спасибо, '_G.PrintThing =' работал просто отлично – Vladimir

0

Как переопределить эту функцию печати по всему миру?

Измените источник Lua и постройте собственный интерпретатор.

print определяется в источнике Lua. Единственный способ переопределить его как runtime - запустить код, похожий на то, что вы показали.

+0

Спасибо, это не функция 'print' по умолчанию для Lua, это для программного обеспечения для взлома игры, а фактическое имя функции -' PrintChat', все еще ваш ответ применяется?потому что я видел, как другие препятствовали запуску этой функции только с помощью сценария – Vladimir

0

Ваше программное обеспечение, вероятно, создает новое состояние для каждого загружаемого файла сценариев, чтобы избежать конфликта между различными «плагинами».

Средство перегрузки в глобальном масштабе невозможно, если вы не собираетесь изменять программу (и у вас, вероятно, не будет доступа к источнику, если это структура взлома/сценария, плюс она, вероятно, запутана).

Однако, что вы обычно можете сделать, это создать файл, который перегружает эту функцию и включает ее в начало каждого файла, что создает новое состояние.

Кроме того: многие из этих фреймворков с плагинами могут загружать глобальный файл lua, в этом случае вам нужно будет узнать, существует ли что-то подобное для вас.

Для чего я могу сказать, создавая файл внутри папки libs, который переопределяет эту функцию, должен работать на вас.

Если вы используете, то, что, я думаю, вы используете.

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