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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 8: Строка 8:
 
Real Wolf, kstn, _призрак_, SkyLoader
 
Real Wolf, kstn, _призрак_, SkyLoader
 
|-
 
|-
| '''Оф. репозиторий''' || [https://github.com/KD87/xray-extensions GitHub]
+
| '''Официальный репозиторий''' || [https://github.com/KD87/xray-extensions GitHub]
 
|-
 
|-
| '''Оф. тема'''        || [http://www.amk-team.ru/forum/topic/10538-x-ray-extensions AMK форум]
+
| '''Официальная тема'''        || [http://www.amk-team.ru/forum/topic/10538-x-ray-extensions AMK форум]
 
|}
 
|}
 
</div>
 
</div>
 
Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов.
 
Этот проект представляет собой набор добавлений, расширяющих возможности движка для скриптеров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов.
  
Информация данной статьи актуальна для '''187''' ревизии [https://github.com/KD87/xray-extensions официального репозитория].
+
Информация данной статьи актуальна для '''175''' ревизии официального репозитория.
=ТЧ=
+
=Изменения=
==Скриптовый API==
+
==ТЧ==
 
===Класс 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)
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/>
Строка 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>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/>
Строка 362: Строка 358:
 
set_memory_int16(int, int)</syntaxhighlight>
 
set_memory_int16(int, int)</syntaxhighlight>
 
Методы предназначены для изменения тех значений в памяти игровых объектов, которые недоступны через стандартные средства.<br/>
 
Методы предназначены для изменения тех значений в памяти игровых объектов, которые недоступны через стандартные средства.<br/>
Применение всех функций практически одинаково, поэтому далее будет рассматриваться только пример на классе ''CGameObject''.<br/>
+
Применение всех функций практически одинаково, так что рассматриваю только пример на классе '''CGameObject'''.<br/>
  
''Смещение'' - это позиция нужной переменной в памяти относительно начала класса. Узнать смещение можно несколькими способами:<br/>
+
'''Смещение''' - это смещение адреса нашей переменной от начала класса. Узнать смещения можно несколькими способами:<br/>
# посмотреть в папке [https://github.com/KD87/xray-extensions/tree/master/help help] официального репозитория;<br/>
+
1) посмотреть в дебаговой версии движка, через какой-нибудь дизассембелер;<br/>
# при помощи движка с отладочной информацией через дизассемблер (например, в ''IDA Pro'' выбрав нужную структуру во вкладке ''Local Types'');<br/>
+
2) прогнать в цикле все значения и вывести их значения в лог, после чего шаманить, сравнивая и догадываясь, какое значение за что отвечает :)
# сканируя все смещения и выводя их значения в лог (однако, чтобы выяснить какое значение соответствует какому свойству класса, необходимо проводить дополнительные проверки).
 
  
'''Функция для сканирования значений класса CActor'''<br/>
+
'''Функция для получения значений из класса CActor'''<br/>
''mode'' - режим поиска (<code>"int"</code> - целочисленный тип, <code>"float"</code> - число с плавающей запятой)<br/>
+
'''type''' - тип значения (''integer'' или ''float'')<br/>
''range'' - диапазон сканирования (например, 2000)<br/>
+
'''cycle_length''' - диапазон поиска значений (обычно хватает от 500 до 2000)<br/>
<syntaxhighlight lang="lua">function scan_actor_values(mode, range)
+
<syntaxhighlight lang="lua">function get_actor_values(type, cycle_length)
get_console():execute("clear_log")
+
if cycle_length then
log1("~ scan "..mode.." values")
+
if type == "float" then
for i = 1, range do
+
get_console():execute("clear_log")
if mode == "int" then
+
for i = 1, cycle_length do
log1(i.." = "..db.actor:get_actor_int(nil, i))
+
local value = db.actor:get_actor_float(i)
elseif mode == "float" then
+
if value then log1("Float value = "..value.."; Position = "..i) end
log1(i.." = "..db.actor:get_actor_float(i))
+
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
flush_log()
 
 
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/>
  
{| style="background-color: #fffdee;" width="100%"
+
Также, пару слов о методах для ГГ - их существует два типа, для класса '''CActor''' и класса '''CActorCondition'''. В последнем лежит много параметров вроде сытости, алкоголизма, силы прыжка и т.п.
|<span style="color:#172172;">'''Важно!'''</span>
 
----
 
При поиске значений для ГГ необходимо учитывать тот факт, что часть из них находится в отдельном классе - ''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>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/>
 
<code>int<value> get_memory_int(int<addr>)</code> - возвращает целое число по абсолютному адресу.<br/>
 
<code>int<value> get_memory_int(int<addr>)</code> - возвращает целое число по абсолютному адресу.<br/>
 
<code>bool<check> perform_ray_pick_query()</code> - выполнит запрос на трассировку и вернет true, если она была успешна.<br/>
 
<code>float<dist> get_ray_pick_dist()</code> - если трассировка была успешна, вернет дистанцию до точки, иначе вернет ранее заданный диапазон трассировки.<br/>
 
<code>game_object*<obj> get_ray_pick_obj()</code> - если трассировка была успешна, вернет игровой объект.<br/>
 
<code>int<element> get_ray_pick_element()</code> - если луч пересек игровой объект, то вернет номер кости, иначе вернет номер полигона статической геометрии (при неудачной трассировке вернет -1).<br/>
 
 
<code>CUIDialogWnd*<inv_wnd> get_inventory_wnd()</code> - возвращает объект окна инвентаря.<br/>
 
<code>CUIDialogWnd*<pda_wnd> get_pda_wnd()</code> - возвращает объект окна КПК.<br/>
 
<code>CUIDialogWnd*<talk_wnd> get_talk_wnd()</code> - возвращает объект окна разговора.<br/>
 
<code>CUIDialogWnd*<carbody_wnd> get_car_body_wnd()</code> - возвращает объект окна обыска.<br/>
 
<code>CUIDialogWnd*<trade_wnd> get_trade_wnd()</code> - возвращает объект окна торговли.<br/>
 
 
<code>send_event_mouse_wheel(int<vol>)</code> - имитация события вращения колеса мыши.<br/>
 
<code>send_event_key_hold(int<DIK_keys>)</code> - имитация события удержания кнопки.<br/>
 
<code>send_event_key_release(int<DIK_keys>)</code> - имитация события отпускания кнопки.<br/>
 
<code>send_event_key_press(int<DIK_keys>)</code> - имитация события нажатия кнопки.<br/>
 
 
<code>set_ce_time(float<total_time>)</code> - устанавливает продолжительность эффектора шатания камеры.<br/>
 
<code>set_ce_amplitude(float<amp>)</code> - устанавливает максимальную амплитуду эффектора шатания камеры.<br/>
 
<code>set_ce_period_number(float<periods>)</code> - устанавливает количество циклов эффектора шатания камеры.<br/>
 
<code>set_ce_power(float<power>)</code> - устанавливает интенсивность эффектора шатания камеры.<br/>
 
<code>add_ce()</code> - запускает эффектор шатания камеры с ранее установленными параметрами.<br/>
 
 
<code>vector<pos> get_tri_vertex1(int<element>)</code> - возвращает первую вершину статического треугольника.<br/>
 
<code>vector<pos> get_tri_vertex2(int<element>)</code> - возвращает вторую вершину статического треугольника.<br/>
 
<code>vector<pos> get_tri_vertex3(int<element>)</code> - возвращает третью вершину статического треугольника.<br/>
 
 
<code>float<factor> get_tri_shootfactor(nil, int<element>)</code> - возвращает фактор пробиваемости материала геометрии (0.0 - непробиваемый, 1.0 - полностью пробиваемый).<br/>
 
<code>int<flags> get_tri_flags(int<element>)</code> - возвращает флаги материала геометрии ([[#mtlFlags]]).<br/>
 
 
 
===Глобальное пространство имен===
 
===Глобальное пространство имен===
 
'''Регистрация функций в движке'''
 
'''Регистрация функций в движке'''
Строка 716: Строка 684:
 
<code>AdjustWidthToText()</code> - растягивает ширину окна под размер текста.<br/>
 
<code>AdjustWidthToText()</code> - растягивает ширину окна под размер текста.<br/>
 
<code>AdjustHeightToText()</code> - растягивает высоту окна под размер текста.<br/>
 
<code>AdjustHeightToText()</code> - растягивает высоту окна под размер текста.<br/>
<code>SetVTextAlign(uint<align>)</code> - задает выравнивание текста по вертикали ([[#EVTextAlignment]]).<br/>
+
<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/>
===Скриптовые колбеки===
+
===Рекомендации===
Рекомендуется использовать таблицу с идентификаторами колбеков [[#callback]], чтобы не запутаться в их номерах.
+
При использовании правок движка из этого проекта, рекомендуется расширить некоторые таблицы новыми значениями, например таблицы с идентификаторами колбеков, идентификаторами клавиш и т.п.<br/>
{| class="wikitable"
+
Код следует поместить в главный модуль '''_g.script'''.
|-
 
! Название !! Номер !! Вызывается для !! Аргументы !! Описание
 
|-
 
| 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()
+
'''callback'''
...
 
set_extensions_flags(0)
 
object_binder.net_destroy(self)
 
end</syntaxhighlight>
 
===Дополнительная информация===
 
====Подсветка текста в консоли====
 
В связи с добавлением функции вывода произвольного текста в лог, стала доступна возможность выделять этот текст различными цветами.
 
{| class="wikitable"
 
|-
 
! Цвет !! Спец-символ цвета !! Код цвета в формате RGBA
 
|-
 
| Зеленый || "-" || (0, 255, 0, 255)
 
|-
 
| Красный || "!" || (255, 0, 0, 255)
 
|-
 
| Желтый || "~" || (255, 255, 0, 255)
 
|-
 
| Серый || "*" || (128, 128, 128, 255)
 
|-
 
| Бирюзовый || "#" || (0, 222, 205, 145)
 
|}
 
'''Пример использования'''
 
<syntaxhighlight lang="lua">log1("# Hello world!") -- текст будет отображаться бирюзовым цветом</syntaxhighlight>
 
После спец-символа цвета обязательно должен быть хотя бы один пробел, иначе строка будет выведена обрезанной.
 
====Общие рекомендации====
 
При использовании правок движка из этого проекта, рекомендуется расширить некоторые таблицы новыми значениями, например таблицы с идентификаторами колбеков, идентификаторами клавиш и т.п. Кроме того, ниже приведены некоторые функции, которые представляют из себя скриптовую обвязку для разрозненных движковых методов.<br/>
 
=====Перечисления=====
 
Код следует поместить в главный модуль '''_g.script'''.<br/>
 
 
 
{{Якорь|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
Строка 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["before_use_item"] = 156
+
callback["before_use"] = 156
callback["hud_animation_end"] = 157
+
callback["animation_end"] = 157
callback["init_addons"] = 158
 
 
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>
{{Якорь|EVTextAlignment}} '''EVTextAlignment'''
+
Также рекомендуется использовать следующие скриптовые обвязки:<br/>
<syntaxhighlight lang="lua">-- вертикальное центрирование текста
 
EVTextAlignment = {
 
valTop = 0,
 
valCenter = 1,
 
valBottom = 2
 
}</syntaxhighlight>
 
{{Якорь|mtlFlags}} '''mtlFlags'''
 
<syntaxhighlight lang="lua">-- флаги материала геометрии
 
mtlFlags = {
 
flBreakable = 1, -- 0    разрушаемый
 
flBounceable = 4, -- 2    возможность рикошета (0 - есть, 1 - нет)
 
flSkidmark = 8, -- 3    оставляет тормозной след
 
flBloodmark = 16, -- 4    оставляет кровь
 
flClimable = 32, -- 5    невидимая лестница
 
flPassable = 128, -- 7    проходимый для физических объектов
 
flDynamic = 256, -- 8    динамический объект
 
flLiquid = 512, -- 9    жидкость (вода)
 
flSuppressShadows = 1024, -- 10  заглушает тени
 
flSuppressWallmarks = 2048, -- 11  заглушает отметины от пуль
 
flActorObstacle = 4096, -- 12  препятствие (силовое поле) для ГГ
 
flInjurious = 268435456, -- 28  отбирает здоровье
 
flShootable = 536870912, -- 29  непростреливаемый
 
flTransparent = 1073741824, -- 30  непрозрачный
 
flSlowDown = 2147483648 -- 31  замедляет движение
 
}</syntaxhighlight>
 
{{Якорь|rq_target}} '''rq_target'''
 
<syntaxhighlight lang="lua">-- флаги трассировки
 
rq_target = {
 
rqtNone,
 
rqtObject = 1,
 
rqtStatic = 2,
 
rqtShape = 4,
 
rqtObstacle = 8,
 
rqtBoth = 3, -- rqtObject + rqtStatic
 
rqtDyn = 13, -- rqtObject + rqtShape + rqtObstacle
 
}</syntaxhighlight>
 
=====Функции=====
 
'''Глобальное пространство имен'''
 
<syntaxhighlight lang="lua">-- возвращает имя кости по ее индексу
 
function _G.get_bone_name_by_id(obj, bone_id)
 
set_int_arg0(bone_id)
 
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>
 
 
'''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)
set_ignore_game_state_update()
 
end
 
 
-- возвращает level_vertex_id по позиции на уровне
 
function level.vertex_id_by_pos(position)
 
db.actor:set_vector_global_arg_1(position)
 
return level.vertex_id()
 
end
 
 
-- запускает эффектор шатания камеры с заданными параметрами
 
function level.add_cam_effector3(total_time, amplitude, period_number, power)
 
level.set_ce_time(total_time)
 
level.set_ce_amplitude(amplitude)
 
level.set_ce_period_number(period_number)
 
level.set_ce_power(power)
 
level.add_ce()
 
 
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>
 
'''ray_pick'''<br/>
 
Флаги трассировки [[#rq_target]]
 
<syntaxhighlight lang="lua">-- устанавливает базовые параметры трассировки
 
function ray_pick.init(pos, dir, range, flags, obj)
 
ray_pick.set_position(pos)
 
ray_pick.set_direction(dir)
 
ray_pick.set_range(range)
 
ray_pick.set_flags(flags)
 
ray_pick.set_ignore_object(obj)
 
end
 
 
-- устанавливает стартовую точку трассировки
 
function ray_pick.set_position(pos)
 
db.actor:set_vector_global_arg_2(pos)
 
end
 
 
-- устанавливает направление трассировки
 
function ray_pick.set_direction(dir)
 
db.actor:set_vector_global_arg_1(dir)
 
end
 
 
-- устанавливает диапазон трассировки
 
function ray_pick.set_range(range)
 
set_float_args_12(range, 0)
 
end
 
 
-- устанавливает флаги трассировки (rq_target)
 
function ray_pick.set_flags(flags)
 
set_int_arg1(flags)
 
end
 
 
-- устанавливает игнорируемый игровой объект для трассировки
 
function ray_pick.set_ignore_object(obj)
 
db.actor:set_object_arg_1(obj)
 
end
 
 
-- выполняет запрос на трассировку и возвращает true, если она была успешна
 
function ray_pick.check()
 
return level.perform_ray_pick_query()
 
end
 
 
-- если трассировка была успешна, возвращает дистанцию до точки, иначе возвращает ранее заданный диапазон трассировки
 
function ray_pick.get_distance()
 
return level.get_ray_pick_dist()
 
end
 
 
-- если трассировка была успешна, возвращает игровой объект
 
function ray_pick.get_object()
 
return level.get_ray_pick_obj()
 
end
 
 
-- если луч пересек игровой объект, то возвращает номер кости, иначе возвращает номер полигона статической геометрии (при неудачной трассировке возвращает -1)
 
function ray_pick.get_element()
 
return level.get_ray_pick_element()
 
 
end</syntaxhighlight>
 
end</syntaxhighlight>
 
----
 
----
 
Автор: '''RayTwitty (aka Shadows)'''
 
Автор: '''RayTwitty (aka Shadows)'''
 
+
[[Категория:Редактирование движка]]
[[Категория:Движок]]
 

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

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

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

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