Наприклад, припустимо, що ви хочете використовувати цю функцію:
void PM_Move (struct playermove_s * ppmove. qboolean server)
Вона отримує один аргумент типу «playermove_s» і інший типу «qboolean». Значення ця функція не повертає.
Поки типи, необхідні функції, використовуються в модулі, ви можете використовувати її. Якщо один з типів не використовується, то Ви можете підключити його безпосередньо, і все одно продовжувати працювати з функцією, наприклад підключати її, так як при підключенні функції Вам не треба піклуватися про всі її аргументах.
Існує кілька способів пошуку функцій в бібліотеках:
- шляхом пошуку офсет функцій в бібліотеці. Цей метод використовується для швидкого тестування і на нього не слід покладатися, так як знайдені офсет можуть виявитися неправильними при оновленні або зміна бібліотеки.
- шляхом знаходження покажчика функції у віртуальній таблиці функцій класу. Цей спосіб дозволяє використовувати безліч функцій, шляхом виявлення всього лише покажчика. Метод був узятий з Hamsandwich і перероблений для використання в Orpheu. Він дає можливість захоплення віртуальної функції ентіті і об'єкта, наприклад, CGameRules. На відміну від версії Hamsandwich додано наступне: тепер набір кодованих безпосередньо функцій не обмежений, а також Ви можете захоплювати деякі залежні від мода функції, які не могли бути захоплені раніше.
Щоб передати модулю інформацію про функції, ви повинні створити файл, відформатований у відповідність стандарту JSON і помістити в папку «configs / orpheu / functions».
Для функції:
CMBaseMonster * spawn_monster (int monster_type. Vector origin. float angle. int respawn_index)
Вміст файлу буде таким:
- поля «info» не обов'язкові;
- поле «name» має збігатися з ім'ям фала;
- ім'я бібліотеки «mod» для модів, як cstrike, і "engine" для dll движка. Для бібліотек MetaMod вам необхідно створити файл, як той, що Ви можете знайти в директорії «configs \ orpheu \ libraries», що містить пару libraryname / libraryCvar, таким чином модуль розпізнається, як один з модулів Cvar.
- "Identidiers" - це список гуртів «os» / »value» для ідентифікації функції. У разі, якщо бібліотека - "mod", необхідно додати додаткове поле "mod". Нехай сенс цього поля виключно формальний, проте саме поле обов'язково. Воно повинно виглядати так:
"Mod". "Cstrike"
В цьому випадку для посилання на функцію використовується метод визначення імені. У разі використання сигнатур, поле "value" буде представлено послідовністю байтів, «*» або «?», Наприклад:
"Value". [0x1, "*", "?"]
«*» Необхідно використовувати в тому випадку, якщо значення цих байтів не важливо.
Тобто значення
"Value". [0x1, "*"]
рівносильно
[0x1,0x0]. [0x1,0x1]. [0x1,0xFF].
«?» Необхідно використовувати, якщо не важливо не тільки значення цих байтів, а й саме їхнє існування.
Тобто
"Value". [0x1, "?"]
передбачає значення
[0x1]. [0x1,0x0]. [0x1,0x1]. [0x1,0xFF].
JSON - це широко поширений тип файлів. Щоб переконатися в тому, що файл коректно відформатований, ви можете використовувати валідатор. У цьому проекті я трохи змінив бібліотеку для того, щоб JSON міг прочитати байти. Це робиться для перевірки файлів, що не містять сигнатури.
Окремо, варто згадати про функції, які належать до класу, наприклад:
void CMController. HandleAnimEvent (MonsterEvent_t * pEvent)
В даному випадку необхідно створити папку під ім'ям «CMController», а в ній файл «HandleAnimEvent». Це обов'язково і необхідно для більш зрозумілою організації. Вам також необхідно додати в файл поле "class". В результаті файл буде виглядати так:
OrpheuMemorySet ( "awpCost". 1. 1000)
Примітка: якщо необхідно замінити рядки, безпосередньо розміщені в пам'яті (таких більшість), вам слід використовувати тип «string» замість «char *».
Ще у нас є:
- Orpheu: Пошук функцій в бібліотеках
- Як зробити меню з 10+ пунктами
- Взаємодія MOTD і AMXX через PHP
- Динамічні стану (state)
- Зміна HUD у зброї (Weapon Custom Hud)
- [Модуль Amxx] Curl (Windows # 038; Linux)