Редактирование: X-Ray extensions

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 15: Строка 15:
 
Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов.
 
Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов.
  
Информация данной статьи актуальна для '''187''' ревизии [https://github.com/KD87/xray-extensions официального репозитория].
+
Информация данной статьи актуальна для '''185''' ревизии [https://github.com/KD87/xray-extensions официального репозитория].
 
=ТЧ=
 
=ТЧ=
 
==Скриптовый API==
 
==Скриптовый API==
Строка 96: Строка 96:
 
bool is_cyclic_hud_animation()
 
bool is_cyclic_hud_animation()
 
bool has_hud_animation(string)
 
bool has_hud_animation(string)
set_hud_animation_end_time(int)
 
stop_hud_sounds()
 
 
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<yaw, pitch, roll>)</code> - устанавливает повороты камеры.<br/>
+
<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/>
Строка 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>get_bone_name_by_id</code> [[#Функции]]).<br/>
+
<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>set_hud_animation_end_time(int<end_time>)</code> - устанавливает время конца текущей анимации.<br/>
 
<code>stop_hud_sounds()</code> - останавливает все звуки худа.<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/>
Строка 365: Строка 361:
  
 
''Смещение'' - это позиция нужной переменной в памяти относительно начала класса. Узнать смещение можно несколькими способами:<br/>
 
''Смещение'' - это позиция нужной переменной в памяти относительно начала класса. Узнать смещение можно несколькими способами:<br/>
# посмотреть в папке [https://github.com/KD87/xray-extensions/tree/master/help help] официального репозитория;<br/>
 
 
# при помощи движка с отладочной информацией через дизассемблер (например, в ''IDA Pro'' выбрав нужную структуру во вкладке ''Local Types'');<br/>
 
# при помощи движка с отладочной информацией через дизассемблер (например, в ''IDA Pro'' выбрав нужную структуру во вкладке ''Local Types'');<br/>
 
# сканируя все смещения и выводя их значения в лог (однако, чтобы выяснить какое значение соответствует какому свойству класса, необходимо проводить дополнительные проверки).
 
# сканируя все смещения и выводя их значения в лог (однако, чтобы выяснить какое значение соответствует какому свойству класса, необходимо проводить дополнительные проверки).
Строка 551: Строка 546:
 
<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>level.vertex_id_by_pos</code> [[#Функции]]).<br/>
+
<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/>
Строка 735: Строка 730:
 
<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/>
===Скриптовые колбеки===
 
Рекомендуется использовать таблицу с идентификаторами колбеков [[#callback]], чтобы не запутаться в их номерах.
 
{| class="wikitable"
 
|-
 
! Название !! Номер !! Вызывается для !! Аргументы !! Описание
 
|-
 
| on_key_press || 123 || CActor || int<dik>[DIK_keys] || нажатие клавиши ([[#Активация колбеков ввода]])
 
|-
 
| on_key_release || 124 || CActor || int<dik>[DIK_keys] || отпускание клавиши ([[#Активация колбеков ввода]])
 
|-
 
| on_key_hold || 125 || CActor || int<dik>[DIK_keys] || удерживание клавиши ([[#Активация колбеков ввода]])
 
|-
 
| on_mouse_wheel || 126 || CActor || int<vol> || движение мыши ([[#Активация колбеков ввода]])
 
|-
 
| on_mouse_move || 127 || CActor || int<x>, int<y> || вращение колеса мыши ([[#Активация колбеков ввода]])
 
|-
 
| anomaly_hit || 128 || CCustomZone || game_object*<obj> || хит объекта аномалией
 
|-
 
| drop_item_from_inventory || 129 || CActor || game_object*<obj> || выкидывание предмета через интерфейс инвентаря (контекстное меню и клавиша G)
 
|-
 
| on_item_belt || 130 || CActor || game_object*<obj> || перемещение предмета на пояс
 
|-
 
| on_item_ruck || 131 || CActor || game_object*<obj> || перемещение предмета в рюкзак
 
|-
 
| on_item_slot || 132 || CActor || game_object*<obj> || перемещение предмета в слот
 
|-
 
| select_inventory_item || 133 || CActor || game_object*<obj> || выделение предмета в инвентаре
 
|-
 
| switch_torch || 134 || CTorch || int<light_on>[0 or 1] || переключение активности фонарика
 
|-
 
| set_dest_lvid || 135 || CAI_Stalker || int<level_vertex_id> || вызов после вызова метода <code>set_dest_level_vertex_id</code>
 
|-
 
| create_cell_item || 136 || CActor || game_object*<obj> || создание объекта ''CUICellItem'' в инвентаре (получить статик в этот момент можно при помощи вызова <code>CUIFrameWindow():GetTitleStatic()</code>)
 
|-
 
| attach_vehicle || 137 || CActor || game_object*<car> || посадка в машину
 
|-
 
| use_vehicle || 138 || CActor || game_object*<car> || использование машины (проверку на дистанцию необходимо организовать вручную)
 
|-
 
| detach_vehicle || 139 || CActor || game_object*<car> || выход из машины
 
|-
 
| after_save || 140 || CActor |||| вызов после сохранения игры
 
|-
 
| cell_item_focus_start || 141 || CActor || game_object*<obj> || получение фокуса объектом ''CUICellItem'' в инвентаре (получить статик в этот момент можно при помощи вызова <code>CUIFrameWindow():GetTitleStatic()</code>)
 
|-
 
| cell_item_focus_end || 142 || CActor || game_object*<obj> || потеря фокуса объектом ''CUICellItem'' в инвентаре (получить статик в этот момент можно при помощи вызова <code>CUIFrameWindow():GetTitleStatic()</code>)
 
|-
 
| group_cell_item || 143 || CActor || game_object*<obj1> || сравнение объектов для группировки в инвентаре (получить второй объект можно при помощи вызова <code>db.actor:get_object_arg_1()</code>, запретить группировку для текущего сравнения при помощи вызова <code>db.actor:set_object_arg_1(nil)</code>)
 
|-
 
| hit_effector || 144 || CActor || int<mob_type>[0 or 1], int<side> || появление хит-эффектора на экране (mob_type: 0 - stalker, 1 - monster)
 
|-
 
| set_goodwill || 145 || CActor || int<id_from>, int<id_to> || изменение отношений
 
|-
 
| before_update || 150 || CActor |||| вызов перед первым апдейтом
 
|-
 
| drop_item_in_box || 151 || CInventoryBox || game_object*<obj> || перемещение предмета в инвентарный ящик
 
|-
 
| before_hit || 152 || CEntityAlive || int<hit_data>, int<ignore_flags> || вызов перед получением хита (позволяет модифицировать параметры хита перед тем, как он произошел, однако требует дополнительных функций для работы с памятью)
 
|-
 
| npc_hit || 153 || CEntityAlive || game_object*<who> || вызов перед получением хита (позволяет установить игнорирование хита при помощи вызова <code>set_int_arg0(1)</code>, по смыслу частично повторяет функционал колбека ''before_hit'', однако не требует дополнительных функций)
 
|-
 
| update_addons_visibility || 154 || CWeapon |||| обновление видимости костей аддонов оружия (для активации колбека необходимо использовать скриптовую обвязку <code>activate_visibility_updates</code> [[#Функции]])
 
|-
 
| update_hud_addons_visibility || 155 || CWeapon |||| обновление видимости костей аддонов худа оружия (для активации колбека необходимо использовать скриптовую обвязку <code>activate_visibility_updates</code> [[#Функции]])
 
|-
 
| before_use_item || 156 || CActor || game_object*<obj> || вызов перед использованием предмета
 
|-
 
| hud_animation_end || 157 || CActor || int<param>, int<blend_channel> || завершение проигрывания анимации худа через метод <code>play_hud_animation</code> (для активации колбека, а также для передачи параметров используются методы <code>set_use_hud_animation_callback</code>, <code>set_hud_animation_callback_param</code>, <code>set_hud_animation_channel</code>)
 
|-
 
| init_addons || 158 || CWeapon || int<wpn_type>[1 or 2] || смена аддонов оружия (1 - CWeaponMagazined, 2 - CWeaponMagazinedWGrenade)
 
|-
 
| select_pda_contact || 180 || CActor || int<id> || выбор контакта во вкладке КПК "Контакты"
 
|}
 
====Активация колбеков ввода====
 
Для активации колбеков клавиатуры и мыши необходимо вызвать глобальную функцию <code>set_extensions_flags</code> и передать в нее флаги колбеков (1 - key_press, 2 - key_release, 4 - key_hold, 8 - mouse_wheel, 16 - mouse_move). Это нужно сделать на событии '''net_spawn''', а в '''net_destroy''' обнулить ранее установленные флаги.
 
<syntaxhighlight lang="lua">function actor_binder:net_spawn(data)
 
...
 
set_extensions_flags(31) -- активирует все пять колбеков
 
return true
 
end
 
 
function actor_binder:net_destroy()
 
...
 
set_extensions_flags(0)
 
object_binder.net_destroy(self)
 
end</syntaxhighlight>
 
 
===Дополнительная информация===
 
===Дополнительная информация===
 
====Подсветка текста в консоли====
 
====Подсветка текста в консоли====
Строка 841: Строка 751:
 
После спец-символа цвета обязательно должен быть хотя бы один пробел, иначе строка будет выведена обрезанной.
 
После спец-символа цвета обязательно должен быть хотя бы один пробел, иначе строка будет выведена обрезанной.
 
====Общие рекомендации====
 
====Общие рекомендации====
При использовании правок движка из этого проекта, рекомендуется расширить некоторые таблицы новыми значениями, например таблицы с идентификаторами колбеков, идентификаторами клавиш и т.п. Кроме того, ниже приведены некоторые функции, которые представляют из себя скриптовую обвязку для разрозненных движковых методов.<br/>
+
При использовании правок движка из этого проекта, рекомендуется расширить некоторые таблицы новыми значениями, например таблицы с идентификаторами колбеков, идентификаторами клавиш и т.п.<br/>
=====Перечисления=====
+
Код следует поместить в главный модуль '''_g.script'''.
Код следует поместить в главный модуль '''_g.script'''.<br/>
 
  
{{Якорь|callback}} '''callback'''
+
'''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
Строка 943: Строка 852:
 
rqtDyn = 13, -- rqtObject + rqtShape + rqtObstacle
 
rqtDyn = 13, -- rqtObject + rqtShape + rqtObstacle
 
}</syntaxhighlight>
 
}</syntaxhighlight>
=====Функции=====
+
Также рекомендуется использовать следующие скриптовые обвязки:<br/>
 +
 
 
'''Глобальное пространство имен'''
 
'''Глобальное пространство имен'''
 
<syntaxhighlight lang="lua">-- возвращает имя кости по ее индексу
 
<syntaxhighlight lang="lua">-- возвращает имя кости по ее индексу
Строка 949: Строка 859:
 
set_int_arg0(bone_id)
 
set_int_arg0(bone_id)
 
return obj:get_bone_name()
 
return obj:get_bone_name()
end
 
 
-- возвращает true, если колбеки видимости аддонов оружия активированы
 
function _G.get_visibility_updates_activated(wpn)
 
return bit_and(wpn:get_wpn_int(nil, 936), 64) ~= 0
 
end
 
 
-- активирует колбеки видимости аддонов оружия
 
function _G.activate_visibility_updates(wpn, activate)
 
local flags = wpn:get_wpn_int8(nil, 936)
 
local new_flags = activate and bit_or(flags, 64) or bit_and(flags, 191)
 
wpn:set_wpn_int8(936, new_flags)
 
 
end</syntaxhighlight>
 
end</syntaxhighlight>
 
'''level'''
 
'''level'''

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии GNU Free Documentation License 1.3 или более поздняя (см. xrWiki:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)

Шаблон, используемый на этой странице: