Вопросы по fakemeta
|
|
JohnJ | Дата: Вторник, 05.12.2006, 23:02:39 | Сообщение # 1 |
Лейтенант
Группа: Скриптеры
Сообщений: 65
Статус: Не в сети
| Поскольку, как я уже где-то писал, для меня fakemeta - тёмный лес, считаю, что пора пробивать дорогу к свету ) В общем первый вопрос: Посмотрев плагин No Name Change by VEN, я увидел что в функции возвращались не стандартные PLUGIN_HANDLED и PLUGIN_CONTINUE, а FM_... константы. Посмотрев в fakemeta.ini, я обнаружил, что такого рода констант, которые могут быть возвращены фукцией - 4 #define FMRES_HANDLED 2 #define FMRES_SUPERCEDE 4 #define FMRES_IGNORED 1 #define FMRES_OVERRIDE 3 Там же написано, что их надо использовать в forward-функциях, вместо стандартных. Но что каждая из этих 4х констант означает, мне осталось непонятным... ну HANDLED по соответствию можно понять, а остальные...
|
|
| |
VEN | Дата: Среда, 06.12.2006, 13:43:05 | Сообщение # 2 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| На будущее - такие вопросы нужно задавать не в "отладке", а в "кодинге". FMRES_* - аналогичны MetaMod's MRES_*. MRES_IGNORED - "я ничего не делал" MRES_HANDLED - "я сделал что-то" MRES_OVERRIDE - позволяет изменить результат (return value) MRES_SUPERCEDE - подавляет call Для FakeMeta фактически необходимы: FMRES_SUPERCEDE - актуальна только для pre hooks, в некотором роде аналог PLUGIN_HANDLED FMRES_IGNORED - в некотором роде аналог PLUGIN_CONTINUE *MRES_HANDLED и *MRES_OVERRIDE в подавляющем большинстве случаев актуальны только для MM plugins. Например, в некоторых случаях возврат FMRES_OVERRIDE не отвечает фактическому предназначению MRES_OVERRIDE.
Сообщение отредактировал VEN - Среда, 06.12.2006, 13:52:22 |
|
| |
slogic | Дата: Среда, 06.12.2006, 23:51:49 | Сообщение # 3 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| У меня тоже вопросик созрел. Если мы вызываем функцию движка, одним из аргументов которой является строка типа sz, обязательно ли я должен создавать такую строку в Pawn с пом. engfunc(EngFunc_AllocString, string[])? И по поводу возвращаемого результата. Quote (VEN) | MRES_OVERRIDE - позволяет изменить результат (return value) | Резльтат чего?
Сообщение отредактировал AlMod - Вторник, 16.01.2007, 06:55:33 |
|
| |
VEN | Дата: Четверг, 07.12.2006, 12:06:13 | Сообщение # 4 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Quote | Если мы вызываем функцию движка, одним из аргументов которой является строка типа sz, обязательно ли я должен создавать такую строку в Pawn с пом. engfunc(EngFunc_AllocString, string[])? | Нет, native функция сама вычисляет pointer из sz. Function call return result value. Но как я уже сказал, FMRES_OVERRIDE - странная штука. Например, при попытке изменения GetGameDescription return value FMRES_OVERRIDE не применяло изменение, спасало только FMRES_SUPERCEDE.
Сообщение отредактировал VEN - Четверг, 07.12.2006, 12:07:54 |
|
| |
slogic | Дата: Четверг, 07.12.2006, 12:23:36 | Сообщение # 5 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Quote (VEN) | Нет, native функция сама вычисляет pointer из sz. | Зачем тогда KWo делает это в плагине item_mode для CSDM? Опытный же малый. Quote (VEN) | Например, при попытке изменения GetGameDescription return value FMRES_OVERRIDE не применяло изменение, спасало только FMRES_SUPERCEDE. | Если ты что-то изменил, разве не надо возвращать FMRES_HANDLED? А то каша какая-то получается. И на счет результата я опять не понял. Ты эже в return указываешь как раз одну из этих констант. О каком результате отработки фукнции может идти речь?
|
|
| |
VEN | Дата: Четверг, 07.12.2006, 12:48:33 | Сообщение # 6 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| У KWo некторый опыт есть, согласен. Но, вероятно, имеется ввиду CreateNamedEntity, которая "берет" не sz а ipsz, прототип: (int className). Quote | Если ты что-то изменил, разве не надо возвращать FMRES_HANDLED? | Что-то, за исключением return value. :] Для MetaMod'a MRES_OVERRIDE означает буквально "необходимо применить изменение return value", MRES_HANDLED - ничего конкретного для MetaModa не означает, это всего лишь нотификация для других MM plugins: "другой плагин делал тут что-то". Quote | И на счет результата я опять не понял. Ты эже в return указываешь как раз одну из этих констант. О каком результате отработки фукнции может идти речь? | Произошла путаница с "hook return" и "call return" - две разные вещи. hook - наша Pawn функция для перехвата call'a соответствующей eng/dll функции. В hook мы возращаем как бы флаг (*MRES_*) для MetaModa, на основании флагов MetaMod или его плагины будут решать, что им делать: подавлять, игнорировать, видоизменять и т.д. данный call. Но также до возвращения одного из т.н. флагов в нашем hook мы можем задать значение call result, в частности в FakeMeta это делается с помощью forward_return native.
Сообщение отредактировал VEN - Четверг, 07.12.2006, 12:58:00 |
|
| |
slogic | Дата: Понедельник, 15.01.2007, 17:15:05 | Сообщение # 7 |
Генералиссимус
Группа: Админы
Сообщений: 1941
Статус: Не в сети
| Quote (slogic) | Например, при попытке изменения GetGameDescription return value FMRES_OVERRIDE не применяло изменение, спасало только FMRES_SUPERCEDE. | Почитал как устроен METAMOD. Порядок вызова metamod плагинов становится в этом случае важным. Это учитывалось?
|
|
| |
VEN | Дата: Понедельник, 15.01.2007, 17:50:28 | Сообщение # 8 |
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Статус: Не в сети
| Т.к. GetGameDesc. вызывался только из моего плагина, не вижу смысла в "порядке".
|
|
| |