Использование FakeMeta (AMX Mod X)

Сообщения
1,668
Реакции
1,494
Помог
24 раз(а)
Перевод: https://wiki.alliedmods.net/FakeMeta_General_Usage_(AMX_Mod_X)

Текущий и старый FakeMeta
Раньше FakeMeta был внутренним мини-метамодом внутри AMX Mod X, который был удален в версии 1.50 и теперь остался только модуль. Модуль представляет собой совершенно другую концепцию, которая расширяет возможности программирования Metamod HL1 для скриптов.

Описание
FakeMeta - чрезвычайно мощный модуль для AMX Mod X, который позволяет эффективно писать плагины на Pawn.
В отличие от Engine, FakeMeta не использует процессор, если ему не сказано что-то делать (кроме как существовать). По этой причине рекомендуется использовать FakeMeta вместо Engine. В Engine нет ничего, чего нет в FakeMeta, хотя некоторые функциональные возможности могут быть менее абстрактными, они все же достижимы и, как правило, более гибки.

Engine против FakeMeta
Сравнение между Engine и FakeMeta модулями:
Engine:
Код:
#include <amxmodx>
#include <engine>
 
public plugin_init()
{
    register_plugin("Engine Test","1.0","Hawk552");
}
 
public client_PreThink(id)
{
    // Тут бы вы вставили какой-то код
 
    return;
}
FakeMeta:
Код:
#include <amxmodx>
#include <fakemeta>

public plugin_init()
{
    register_plugin("FakeMeta Test","1.0","Hawk552");
 
    register_forward(FM_PlayerPreThink,"PreThink");
}
 
public PreThink(id)
{
    // Тут бы вы вставили какой-то код
 
    return FMRES_IGNORED;
}
"return FMRES_IGNORED" будет рассмотрен в конце страницы.

Функциональность
FakeMeta также позволяет вам делать другие вещи, такие как получение private data (используя pev, set_pev / get_pdata_int, get_pdata_float, get_pdata_string, set_pdata_int, set_pdata_float, set_pdata_string), заставляя выполняться DLL-функции, а также вызывать функции движка.

Entvars
В FakeMeta легко читать entvars, если не все сделано правильно, то это может привести к проблемам (именно поэтому Engine используется чаще). Entvars - это переменные в структуре игрока, которая является основой для объекта.
Пример того, как получить броню из объекта в FakeMeta:
Код:
#include <amxmodx>
#include <fakemeta>
 
public plugin_init()
{
    register_plugin("FakeMeta Test","1.0","Hawk552");
 
    register_forward(FM_PlayerPreThink, "PreThink");
}
 
public PreThink(id)
{
    new value = pev(id,pev_armorvalue); // получаем броню у клиента/объекта
 
    client_print(id,print_chat,"%i",value); // выводим значение брони клиенту
 
    return FMRES_IGNORED;
}

Использование функций DLL / движка
В DLL и движке есть функции, которые вызываются, когда происходят определенные события. Их можно принудительно вызвать через FakeMeta. Например:
Код:
#include <amxmodx>
#include <fakemeta>
 
public plugin_init()
{
    register_plugin("FakeMeta Test","1.0","Hawk552");
 
    register_forward(FM_PlayerPreThink,"PreThink");
}
 
public PreThink(id)
{
    dllfunc(DLLFunc_RegisterEncoders);
 
    return FMRES_IGNORED;
}
При просмотре секций DLLFunc и EngFunc обращайтесь к концу строки, так как обычно там есть описание параметров, например edict_t *p_Entity или void. void обычно ссылается на отсутствие параметров, тогда как edict_t *p_Entity означает объект, поэтому первым параметром в функции будет объект, для которого вызывается функция.

Возвращаемые значения
В FakeMeta есть 4 возвращаемых значения:
  • FMRES_HANDLED --> Что-то было сделано в этой функции, но в любом случае вызовется функция в DLL / движке.
  • FMRES_SUPERCEDE --> Предотвратить вызов функции в DLL / движке.
  • FMRES_IGNORED --> Вызов оригинальной функции.
  • FMRES_OVERRIDE --> Вызов оригинальной функции, изменив возвращаемое значение.

Константы
Список констант и их использование можно найти на этой странице: https://dev-cs.ru/amxx/fakemeta_const/inc
 
Сообщения
287
Реакции
223
Помог
6 раз(а)
Спасибо за статью, было интересно прочесть все равно, хоть уже и не ново для меня. Побольше бы таких статей, новичкам будет хорошим мануалом
ADD: Однако до сих пор существуют разногласия по поводу того, что лучше использовать: энджин или фейкмета. Похоже, этот вопрос никогда не станет закрытым
 
Сообщения
1,668
Реакции
1,494
Помог
24 раз(а)
Статья старая как говно мамонта, но почему-то некоторые до сих пор использовуют энжин.

В отличие от Engine, FakeMeta не использует процессор, если ему не сказано что-то делать (кроме как существовать). По этой причине рекомендуется использовать FakeMeta вместо Engine. В Engine нет ничего, чего нет в FakeMeta, хотя некоторые функциональные возможности могут быть менее абстрактными, они все же достижимы и, как правило, более гибки.
Переводилась ради этих строк, в которых и написано почему использование FakeMeta лучше.

Теперь пару пруфов в подтверждение почему эжин жрет проц.
https://github.com/alliedmodders/amxmodx/blob/master/modules/engine/amxxapi.cpp#L78-L90
Думаю объяснять не стоит что почти все функции часто вызываются (особенно момент с камерой от третьего лица (О_о, что она там забыла) и использование аддтуфуллпака).
А так же сравнение классов в таче и синках через класснеймы https://github.com/alliedmodders/amxmodx/blob/master/modules/engine/forwards.cpp#L271
https://github.com/alliedmodders/amxmodx/blob/master/modules/engine/forwards.cpp#L311
Скорее всего из-за того, что модуль очень старый и тогда не было hamsandwich или reapi для таких хуков.
Нет функций, которые есть в фейкмете для вызова движковых функций.
Плюс к этому абстракции над работой с трейсами. Зачем?
 
Сообщения
934
Реакции
186
Помог
4 раз(а)
Так все таки, что будет лучше engine или fakemeta?
Или в данное время лучше упираться на современное типа reapi или сэндвича?
Или зависит от того какая цель поставлена и способа правильной реализация
 
Сообщения
1,668
Реакции
1,494
Помог
24 раз(а)
BiZaJe, полностью исключить энжин и остальное по ситуации.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу