Редактирование: X-Ray extensions
Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 8: | Строка 8: | ||
Real Wolf, kstn, _призрак_, SkyLoader | Real Wolf, kstn, _призрак_, SkyLoader | ||
|- | |- | ||
− | | ''' | + | | '''Официальный репозиторий''' || [https://github.com/KD87/xray-extensions GitHub] |
|- | |- | ||
− | | ''' | + | | '''Официальная тема''' || [http://www.amk-team.ru/forum/topic/10538-x-ray-extensions AMK форум] |
|} | |} | ||
</div> | </div> | ||
Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов. | Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов. | ||
− | Информация данной статьи актуальна для ''' | + | Информация данной статьи актуальна для '''175''' ревизии официального репозитория. |
− | = | + | =Изменения= |
− | == | + | ==ТЧ== |
===Класс game_object=== | ===Класс game_object=== | ||
====Основные методы==== | ====Основные методы==== | ||
Строка 96: | Строка 96: | ||
bool is_cyclic_hud_animation() | bool is_cyclic_hud_animation() | ||
bool has_hud_animation(string) | bool has_hud_animation(string) | ||
− | |||
− | |||
uint get_hud_item_state() | uint get_hud_item_state() | ||
int get_hud_bone_id(string, int) | int get_hud_bone_id(string, int) | ||
Строка 167: | Строка 165: | ||
<code>set_actor_max_walk_weight(float<max_walk_weight>)</code> - устанавливает максимально-переносимый вес рюкзака.<br/> | <code>set_actor_max_walk_weight(float<max_walk_weight>)</code> - устанавливает максимально-переносимый вес рюкзака.<br/> | ||
<code>open_inventory_box(game_object*<box_obj>)</code> - открывает окно обыска инвентарного ящика.<br/> | <code>open_inventory_box(game_object*<box_obj>)</code> - открывает окно обыска инвентарного ящика.<br/> | ||
− | <code>set_camera_direction(vector< | + | <code>set_camera_direction(vector<x, y, z>)</code> - устанавливает направление камеры.<br/> |
<code>update_camera_direction(game_object*<target_obj>)</code> - направляет камеру в позицию объекта.<br/> | <code>update_camera_direction(game_object*<target_obj>)</code> - направляет камеру в позицию объекта.<br/> | ||
<code>enable_car_panel(bool<is_visible>)</code> - устанавливает видимость панели машины (прогресс-бар состояния).<br/> | <code>enable_car_panel(bool<is_visible>)</code> - устанавливает видимость панели машины (прогресс-бар состояния).<br/> | ||
Строка 179: | Строка 177: | ||
<code>float<dist> get_hud_fov()</code> - возвращает расстояние от камеры до худа оружия.<br/> | <code>float<dist> get_hud_fov()</code> - возвращает расстояние от камеры до худа оружия.<br/> | ||
<code>set_hud_fov(float<dist>)</code> - устанавливает расстояние от камеры до худа оружия.<br/> | <code>set_hud_fov(float<dist>)</code> - устанавливает расстояние от камеры до худа оружия.<br/> | ||
− | <code>set_hud_animation_channel(int<blend_channel>)</code> - устанавливает номер канала блендинга анимации, который будет передан в колбек на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> | + | <code>set_hud_animation_channel(int<blend_channel>)</code> -- устанавливает номер канала блендинга анимации, который будет передан в колбек на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> |
− | <code>set_hud_animation_callback_param(int<param>)</code> - устанавливает произвольный параметр, который будет передан в колбек на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> | + | <code>set_hud_animation_callback_param(int<param>)</code> -- устанавливает произвольный параметр, который будет передан в колбек на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> |
− | <code>set_use_hud_animation_callback(bool<use_callback>)</code> - включает использование колбека на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> | + | <code>set_use_hud_animation_callback(bool<use_callback>)</code> -- включает использование колбека на завершение анимации (только при проигрывании анимации через метод <code>play_hud_animation</code>).<br/> |
<code>clear_personal_record(int<id_from>, int<id_to>)</code> - очищает отношения между двумя мобами по их id.<br/> | <code>clear_personal_record(int<id_from>, int<id_to>)</code> - очищает отношения между двумя мобами по их id.<br/> | ||
<code>uint<state> actor_body_state()</code> - возвращает номер текущего стейта.<br/> | <code>uint<state> actor_body_state()</code> - возвращает номер текущего стейта.<br/> | ||
Строка 208: | Строка 206: | ||
<code>set_bone_visible(string<bone_name>, int<visible>[0 or 1])</code> - устанавливает видимость кости по имени.<br/> | <code>set_bone_visible(string<bone_name>, int<visible>[0 or 1])</code> - устанавливает видимость кости по имени.<br/> | ||
<code>int<bone_id> get_bone_id(string<bone_name>)</code> - возвращает id кости по имени.<br/> | <code>int<bone_id> get_bone_id(string<bone_name>)</code> - возвращает id кости по имени.<br/> | ||
− | <code>string<bone_name> get_bone_name()</code> - возвращает имя кости по id (для | + | <code>string<bone_name> get_bone_name()</code> - возвращает имя кости по id (для установки id кости, необходимо использовать глобальную функцию <code>set_int_arg0(int<bone_id>)</code>).<br/> |
<code>bool<visual> has_visual()</code> - возвратит true, если объект имеет визуал.<br/> | <code>bool<visual> has_visual()</code> - возвратит true, если объект имеет визуал.<br/> | ||
<code>ini_file* get_visual_ini()</code> - возвращает ссылку на внутренний конфиг модели.<br/> | <code>ini_file* get_visual_ini()</code> - возвращает ссылку на внутренний конфиг модели.<br/> | ||
Строка 227: | Строка 225: | ||
<code>bool<is_cyclic> is_cyclic_hud_animation()</code> - возвратит true, если текущая анимация зациклена.<br/> | <code>bool<is_cyclic> is_cyclic_hud_animation()</code> - возвратит true, если текущая анимация зациклена.<br/> | ||
<code>bool<has_anim> has_hud_animation(string<anim_name>)</code> - возвратит true, если анимация есть в модели.<br/> | <code>bool<has_anim> has_hud_animation(string<anim_name>)</code> - возвратит true, если анимация есть в модели.<br/> | ||
− | |||
− | |||
<code>uint<state> get_hud_item_state()</code> - возвращает номер текущего стейта.<br/> | <code>uint<state> get_hud_item_state()</code> - возвращает номер текущего стейта.<br/> | ||
<code>int<bone_id> get_hud_bone_id(string<bone_name>)</code> - возвращает id кости по имени.<br/> | <code>int<bone_id> get_hud_bone_id(string<bone_name>)</code> - возвращает id кости по имени.<br/> | ||
Строка 362: | Строка 358: | ||
set_memory_int16(int, int)</syntaxhighlight> | set_memory_int16(int, int)</syntaxhighlight> | ||
Методы предназначены для изменения тех значений в памяти игровых объектов, которые недоступны через стандартные средства.<br/> | Методы предназначены для изменения тех значений в памяти игровых объектов, которые недоступны через стандартные средства.<br/> | ||
− | Применение всех функций практически одинаково, | + | Применение всех функций практически одинаково, так что рассматриваю только пример на классе '''CGameObject'''.<br/> |
− | ''Смещение'' - это | + | '''Смещение''' - это смещение адреса нашей переменной от начала класса. Узнать смещения можно несколькими способами:<br/> |
− | + | 1) посмотреть в дебаговой версии движка, через какой-нибудь дизассембелер;<br/> | |
− | + | 2) прогнать в цикле все значения и вывести их значения в лог, после чего шаманить, сравнивая и догадываясь, какое значение за что отвечает :) | |
− | |||
− | '''Функция для | + | '''Функция для получения значений из класса CActor'''<br/> |
− | '' | + | '''type''' - тип значения (''integer'' или ''float'')<br/> |
− | '' | + | '''cycle_length''' - диапазон поиска значений (обычно хватает от 500 до 2000)<br/> |
− | <syntaxhighlight lang="lua">function | + | <syntaxhighlight lang="lua">function get_actor_values(type, cycle_length) |
− | get_console():execute("clear_log") | + | if cycle_length then |
− | + | if type == "float" then | |
− | + | get_console():execute("clear_log") | |
− | + | for i = 1, cycle_length do | |
− | + | local value = db.actor:get_actor_float(i) | |
− | + | if value then log1("Float value = "..value.."; Position = "..i) end | |
− | + | end | |
+ | flush_log() | ||
+ | elseif type == "integer" then | ||
+ | get_console():execute("clear_log") | ||
+ | for i = 1, cycle_length do | ||
+ | local value = db.actor:get_actor_int(nil, i) | ||
+ | if value then log1("Integer value = "..value.."; Position = "..i) end | ||
+ | end | ||
+ | flush_log() | ||
end | end | ||
end | end | ||
− | |||
end</syntaxhighlight> | end</syntaxhighlight> | ||
− | Результат | + | Результат записывается в лог игры. |
<code>float<value> get_go_float(int<offset>)</code> - возвращает значение с плавающей точкой по заданному смещению.<br/> | <code>float<value> get_go_float(int<offset>)</code> - возвращает значение с плавающей точкой по заданному смещению.<br/> | ||
Строка 393: | Строка 395: | ||
<code>set_go_shared_str(string<value>, int<offset>)</code> - устанавливает строковое значение по заданному смещению.<br/> | <code>set_go_shared_str(string<value>, int<offset>)</code> - устанавливает строковое значение по заданному смещению.<br/> | ||
− | + | Также, пару слов о методах для ГГ - их существует два типа, для класса '''CActor''' и класса '''CActorCondition'''. В последнем лежит много параметров вроде сытости, алкоголизма, силы прыжка и т.п. | |
− | |||
− | |||
− | |||
− | |||
====Методы для получения адреса базового объекта==== | ====Методы для получения адреса базового объекта==== | ||
Строка 551: | Строка 549: | ||
<code>advance_game_time(int<time_ms>)</code> - прокручивает игровое время вперед на заданное количество миллисекунд.<br/> | <code>advance_game_time(int<time_ms>)</code> - прокручивает игровое время вперед на заданное количество миллисекунд.<br/> | ||
<code>game_object*<obj> get_second_talker()</code> - возвращает игровой объект, с которым в данный момент открыто окно разговора.<br/> | <code>game_object*<obj> get_second_talker()</code> - возвращает игровой объект, с которым в данный момент открыто окно разговора.<br/> | ||
− | <code>int<lvid> vertex_id()</code> - возвращает level_vertex_id по позиции на уровне (для | + | <code>int<lvid> vertex_id()</code> - возвращает level_vertex_id по позиции на уровне (для установки позиции, необходимо использовать функцию игрового объекта <code>obj:set_vector_global_arg_1(vector<pos>)</code>).<br/> |
<code>float<value> get_memory_float(nil, int<addr>)</code> - возвращает число с плавающей точкой по абсолютному адресу.<br/> | <code>float<value> get_memory_float(nil, int<addr>)</code> - возвращает число с плавающей точкой по абсолютному адресу.<br/> | ||
<code>int<value> get_memory_int(int<addr>)</code> - возвращает целое число по абсолютному адресу.<br/> | <code>int<value> get_memory_int(int<addr>)</code> - возвращает целое число по абсолютному адресу.<br/> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Глобальное пространство имен=== | ===Глобальное пространство имен=== | ||
'''Регистрация функций в движке''' | '''Регистрация функций в движке''' | ||
Строка 716: | Строка 684: | ||
<code>AdjustWidthToText()</code> - растягивает ширину окна под размер текста.<br/> | <code>AdjustWidthToText()</code> - растягивает ширину окна под размер текста.<br/> | ||
<code>AdjustHeightToText()</code> - растягивает высоту окна под размер текста.<br/> | <code>AdjustHeightToText()</code> - растягивает высоту окна под размер текста.<br/> | ||
− | <code>SetVTextAlign(uint<align>)</code> - задает выравнивание текста по вертикали | + | <code>SetVTextAlign(uint<align>[0-2])</code> - задает выравнивание текста по вертикали.<br/> |
<code>SetTextPos(float<x>, float<y>)</code> - задает положение текста внутри окна.<br/> | <code>SetTextPos(float<x>, float<y>)</code> - задает положение текста внутри окна.<br/> | ||
<code>CanRotate(bool)</code> - устанавливает возможность вращения текстуры окна.<br/> | <code>CanRotate(bool)</code> - устанавливает возможность вращения текстуры окна.<br/> | ||
Строка 735: | Строка 703: | ||
<code>float<value> GetFValue()</code> - возвращает текущее значение ползунка.<br/> | <code>float<value> GetFValue()</code> - возвращает текущее значение ползунка.<br/> | ||
<code>bool<changed> IsChanged()</code> - возвратит true, если значение было изменено с момента последнего сохранения окна опций.<br/> | <code>bool<changed> IsChanged()</code> - возвратит true, если значение было изменено с момента последнего сохранения окна опций.<br/> | ||
− | === | + | ===Рекомендации=== |
− | + | При использовании правок движка из этого проекта, рекомендуется расширить некоторые таблицы новыми значениями, например таблицы с идентификаторами колбеков, идентификаторами клавиш и т.п.<br/> | |
− | + | Код следует поместить в главный модуль '''_g.script'''. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | '''callback''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<syntaxhighlight lang="lua">callback["on_key_press"] = 123 | <syntaxhighlight lang="lua">callback["on_key_press"] = 123 | ||
callback["on_key_release"] = 124 | callback["on_key_release"] = 124 | ||
Строка 875: | Строка 737: | ||
callback["update_addons_visibility"] = 154 | callback["update_addons_visibility"] = 154 | ||
callback["update_hud_addons_visibility"] = 155 | callback["update_hud_addons_visibility"] = 155 | ||
− | callback[" | + | callback["before_use"] = 156 |
− | callback[" | + | callback["animation_end"] = 157 |
− | |||
callback["select_pda_contact"] = 180</syntaxhighlight> | callback["select_pda_contact"] = 180</syntaxhighlight> | ||
'''DIK_keys''' | '''DIK_keys''' | ||
Строка 906: | Строка 767: | ||
key_bindings["kQUICK_SAVE"] = 75 | key_bindings["kQUICK_SAVE"] = 75 | ||
key_bindings["kQUICK_LOAD"] = 76</syntaxhighlight> | key_bindings["kQUICK_LOAD"] = 76</syntaxhighlight> | ||
− | + | Также рекомендуется использовать следующие скриптовые обвязки:<br/> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''level''' | '''level''' | ||
− | <syntaxhighlight lang="lua"> | + | <syntaxhighlight lang="lua">function level.change_game_time(m, h, d) |
− | function level.change_game_time(m, h, d) | ||
level.advance_game_time((m or 0) * 60000 + (h or 0) * 3600000 + (d or 0) * 86400000) | level.advance_game_time((m or 0) * 60000 + (h or 0) * 3600000 + (d or 0) * 86400000) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end</syntaxhighlight> | end</syntaxhighlight> | ||
'''relation_registry''' | '''relation_registry''' | ||
Строка 994: | Строка 783: | ||
function relation_registry.change_goodwill(who_id, to_whom_id, goodwill_change) | function relation_registry.change_goodwill(who_id, to_whom_id, goodwill_change) | ||
return db.actor:change_goodwill_ex(who_id, to_whom_id, goodwill_change) | return db.actor:change_goodwill_ex(who_id, to_whom_id, goodwill_change) | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end</syntaxhighlight> | end</syntaxhighlight> | ||
---- | ---- | ||
Автор: '''RayTwitty (aka Shadows)''' | Автор: '''RayTwitty (aka Shadows)''' | ||
− | + | [[Категория:Редактирование движка]] | |
− | [[Категория: |