IXR Framework (LUA Фреймворк)
IMPORTANT
Статус: Поддерживается
Минимальная версия: 1.4.0
Модуль сигналов IXR SIGNALS
Система централизованной рассылки игровых событий в реальном времени, позволяет значительно упросить опыт разработки гемплейных фитч в модификациий структурируя хаос в одном компактном лаконичном решении.
- Имеет переопределяемые опции интерцептеров для аддон системы
- Контролирует подключения событий по списку разрешенных интерцепторов
- Поддерживает редактирование интерцепторов в реальном времени
- Подписка на события
- Рассылка событий
- Отписка от событий
- Доступна подписка на замыкания как функторы
- Возможность легко имплементировать собственные события для своего проекта
- Синергирует с модулем автозагрузки позволяя подключать события для скриптов безпроводным способом (достаточно просто положить файл скрипта в папку игры и все).
Внешние перезаписываемые настройки хранятся в файле __ixr_override_signals_intercepts.script совместимо с системой аддонов для переопределения перехватчиков событий
--// пример конфигурирования перехватчика события для файла __ixr_override_signals_intercepts.script
function configure(_ref_ixr_signals)
--// пример регистрации перехватчика событий
_ref_ixr_signals.add_intercept("on_item_take", {"item_game_object", "is_actor_exists_bool"}) -- actor
...
end
--// сигнатура метода регистрации перехватчика _ref_ixr_signals.add_intercept
args:
event_name (string)(required) - название события
args_table (table)(required) - перечень аргументов в удобочитаемом формате (используется как документация)
retval: (void)События для которых не установлен перехватчик по названию будут игнорироваться это сделано специально чтобы механизм перехватчиков служил в качестве механизма отключения обработки ненужных событий в системе
При вызове события по имени методом SendScriptCallback происходит широковещательная рассылка этого действия всем подписчикам этого события которые установили обратный вызов методом RegisterScriptCallback
--// Добавить перехватчик коллбэка
AddIntercept(name, args_map)
args:
name (string)(required) - имя коллбэка для перехвата.
args_map (table)(required) - таблица преобразования аргументов.
retval: (bool) - успешность добавления перехватчика.
--// Удалить перехватчик коллбэка
RemoveIntercept(name)
args:
name (string)(required) - имя коллбэка.
retval: (bool) - успешность удаления перехватчика.
--// Зарегистрировать скриптовый коллбэк
RegisterScriptCallback(name, func_or_userdata)
args:
name (string)(required) - имя коллбэка.
func_or_userdata (function|userdata)(required) - функция или объект для вызова.
retval: (bool) - успешность регистрации.
--// Отменить регистрацию скриптового коллбэка
UnregisterScriptCallback(name, func_or_userdata)
args:
name (string)(required) - имя коллбэка.
func_or_userdata (function|userdata)(required) - функция или объект для удаления.
retval: (bool) - успешность отмены регистрации.
--// Вызвать скриптовый коллбэк
SendScriptCallback(name, ...)
args:
name (string)(required) - имя коллбэка.
... (variadic list) - аргументы для передачи в коллбэк.
retval: (mixed) - результат выполнения коллбэка.Примеры:
--// Добавить перехватчик коллбэка
AddIntercept("my-event-name", {"game_object"})
--// Удалить перехватчик коллбэка
RemoveIntercept("my-event-name")
--// Зарегистрировать скриптовый коллбэк
RegisterScriptCallback("my-event-name", test_event)
--// Отменить регистрацию скриптового коллбэка
UnregisterScriptCallback("my-event-name", test_event)
--// Вызвать скриптовый коллбэк с произвольными аргументами
SendScriptCallback("my-event-name", ...)
--// Пример имплементации совместно с автозагрузчиком
function on_game_start()
--// подписываемся на событие и устанавливаем функцию замыкание 1-й способ напрямую прописать код метода в замыкании
RegisterScriptCallback("my-event-name",
function (obj)
...
end
)
--// подписываемся на событие и устанавливаем функцию замыкание 2-й способ указать метод по ссылке
RegisterScriptCallback("my-event-name", this.test_event)
end
function test_event(obj)
--// будет вызван когда в системе произойдет вызов SendScriptCallback("my-event-name", ...)
endПеречень событий с аргументами
("level_input_on_key_press", {})
("on_key_press", {"dik_key_number"})
("on_key_release", {"dik_key_number"})
("on_key_hold", {"dik_key_number"})
("on_mouse_move", {"dx_number", "dy_number"})
("on_mouse_wheel", {"direction_number"})
("on_actor_wnd_mode_switch", {"wnd_mode_number"}) -- 0 (Undefined) | 1 (Inventory) | 2 (Trade) | 3 (Upgrade) | 4 (DeadBodySearch) | 10 (Talk dialog show) | 11 (Talk dialog hide)
("on_actor_wnd_closed", {"wnd_mode_number"})
("on_actor_wnd_opened", {"wnd_mode_number"})
("on_actor_inventory_wnd_opened", {"wnd_mode_number"})
("on_actor_inventory_wnd_closed", {"wnd_mode_number"})
("on_actor_trade_wnd_opened", {"wnd_mode_number"})
("on_actor_trade_wnd_closed", {"wnd_mode_number"})
("on_actor_upgrade_wnd_opened", {"wnd_mode_number"})
("on_actor_upgrade_wnd_closed", {"wnd_mode_number"})
("on_actor_dead_body_search_wnd_opened", {"wnd_mode_number"})
("on_actor_dead_body_search_wnd_closed", {"wnd_mode_number"})
("on_actor_dialog_wnd_showed", {"wnd_mode_number", "npc_id_number_or_nil"})
("on_actor_dialog_wnd_closed", {"wnd_mode_number", "npc_id_number_or_nil"})
("on_before_level_changing", {"net_packet"}) -- engine
("on_level_changing", {}) -- actor binder
("on_item_take", {"item_game_object", "is_actor_exists_bool"}) -- actor
("on_item_drop", {"item_game_object", "is_actor_exists_bool"}) -- actor
("actor_on_spawn", {})
("actor_on_init", {"binder_ref"})
("actor_on_reinit", {"binder_ref"})
("actor_on_save", {"net_packet"})
("actor_on_load", {"net_packet"})
("actor_on_level_changing", {})
("actor_on_before_death", {"who_id_number", "flags_table"}) -- { ret_value = true } switch to false for ignore death
("actor_on_death", {"victim_game_object", "who_game_object"})
("actor_on_net_destroy", {"binder_ref"})
("actor_on_first_update", {"binder_ref", "delta_number"})
("actor_on_update", {"binder_ref", "delta_number"})
("actor_on_weapon_fired", {"npc_game_object", "wpn_game_object", "iAmmoElapsed_bool", "ammo_type_number"})
("actor_on_weapon_jammed", {"wpn_game_object"})
("actor_on_weapon_no_ammo", {"wpn_game_object", "ammo_total_number"})
("actor_on_weapon_no_avialable_ammo", {"wpn_game_object", "suitable_ammo_total_number"}) -- eWeaponNoAmmoAvailable
("actor_on_weapon_reload", {"wpn_game_object", "suitable_ammo_total_number"}) -- eWeaponNoAmmoAvailable копия вызова actor_on_weapon_no_avialable_ammo отсутствие патронов не означает что это перезарядка
("actor_on_weapon_zoom_in", {"wpn_game_object"})
("actor_on_weapon_zoom_out", {"wpn_game_object"})
("actor_on_item_take", {"item_game_object", "before_transfer_parent_id_number", "is_take_from_ground_bool"})
("actor_on_item_take_from_box", {"box_game_object", "item_game_object"})
("actor_on_item_take_from_ground", {"item_game_object"})
("actor_on_item_drop", {"item_game_object"})
("on_before_item_use", {"npc_game_object", "item_game_object", "table"}) -- { ret_value = true }
("actor_on_item_before_use", {"npc_game_object", "item_game_object", "table"}) -- { ret_value = true }
("actor_on_item_use", {"item_game_object", "item_section_string"})
("actor_item_to_belt", {"item_game_object"})
("actor_item_to_ruck", {"item_game_object"})
("actor_item_to_slot", {"item_game_object"})
("actor_on_trade", {"item_game_object", "sell_bye_bool", "money_number"})
("actor_on_info_callback", {"npc_game_object", "info_id_number"})
("actor_on_before_hit", {"sHit_struct", "bone_id_number", "flags_table"}) -- { ret_value = true } switch to false for ignore hit
("actor_on_hit_callback", {"game_object", "number", "vector", "game_object", "number"})
("actor_on_torch_enabled", {"nil_or_device_torch_game_object"})
("actor_on_torch_disabled", {"nil_or_device_torch_game_object"})
("actor_on_attach_vehicle", {"vechicle_game_object"})
("actor_on_detach_vehicle", {"vechicle_game_object"})
("actor_on_use_vehicle", {"vechicle_game_object"})
("actor_on_hud_animation_end", {"item_game_object", "hud_section_string", "m_current_motion_string", "state_number", "animation_slot_number"}) -- не полностью соответствует варианту из anomaly-coc ("game_object", "string", "bool", "bool", "number")
("actor_on_before_sleep", {"hours_number"})
("actor_on_sleep", {"hours_number"})
("actor_on_interaction", {"string", "game_object", "string"})
("actor_on_leave_dialog", {"npc_id_number"})
("actor_on_foot_step", {"alife_game_object", "power_number", "play_bool", "on_ground_bool", "hud_view_bool"})
("actor_on_footstep", {"alife_game_object", "power_number", "play_bool", "on_ground_bool", "hud_view_bool"})
("npc_on_use", {"target_game_object", "initiator_game_object"})
("npc_on_item_take", {"npc_game_object", "item_game_object"})
("npc_on_item_take_from_box", {"npc_game_object", "box_game_object", "item_game_object"})
("npc_on_item_drop", {"npc_game_object", "item_game_object"})
("npc_on_net_spawn", {"npc_game_object", "npc_server_object"})
("npc_on_net_destroy", {"npc_game_object"})
("npc_on_update", {"npc_game_object", "db_storage_table"})
("npc_on_hit_callback", {"npc_game_object", "power_number", "hit_direction_vector", "who_game_object", "bone_index_number"})
("npc_on_death_callback", {"npc_game_object", "who_game_object"})
("npc_on_fighting_actor", {"npc_game_object"})
("npc_on_weapon_strapped", {"npc_game_object", "wpn_game_object"})
("npc_on_weapon_unstrapped", {"npc_game_object", "wpn_game_object"})
("npc_on_weapon_drop", {"npc_game_object", "wpn_game_object"})
("npc_on_hear_callback", {"npc_game_object", "who_npc_id_number", "sound_type_number_or_string", "sound_distance_number", "sound_power_number", "sound_position_vector", "raw_sound_type_number"})
("npc_on_get_all_from_corpse", {"npc_game_object", "corpse_game_object", "item_game_object", "is_in_loot_table_bool"})
("npc_on_eval_danger", {"npc_game_object", "flags_table"}) -- {ret_value = true} switch to false for npc ignore danger
("monster_on_update", {"monster_game_object", "self_st_table"})
("monster_on_hit_callback", {"monster_game_object", "power_number", "hit_direction_vector", "who_game_object", "bone_index_number"})
("monster_on_net_spawn", {"monster_game_object", "monster_server_object"})
("monster_on_net_destroy", {"monster_game_object"})
("monster_on_death_callback", {"monster_game_object", "who_game_object"}) -- without poltergeist
("monster_on_death", {"monster_game_object", "who_game_object"})
("monster_on_actor_use_callback", {"monster_game_object", "who_game_object"})
("monster_on_use", {"monster_game_object", "who_game_object", "is_alive_bool"})
("physic_object_on_death", {"game_object", "game_object"})
("physic_object_on_use", {"physic_game_object", "who_game_object"})
("physic_object_on_use_callback", {"physic_game_object", "who_game_object"})
("physic_object_on_hit", {"physic_game_object", "power_number", "hit_direction_vector", "who_game_object", "bone_index_number"})
("physic_object_on_hit_callback", {"physic_game_object", "power_number", "hit_direction_vector", "who_game_object", "bone_index_number"})
("heli_on_hit_callback", {"heli_game_object", "power_number", "nil", "who_game_object", "nil"})
("squad_on_npc_creation", {"squad_server_object", "npc_server_object", "spawn_smart_server_object"})
("squad_on_enter_smart", {"squad_server_object", "smart_server_object"})
("squad_on_leave_smart", {"squad_server_object", "old_smart_server_object"})
("squad_on_npc_death", {"squad_server_object", "npc_server_object", "killer_server_object"})
("squad_on_update", {"squad_server_object"})
("squad_on_first_update", {"squad_server_object"})
("squad_on_add_npc", {"squad_server_object", "npc_server_object", "spawn_section_string", "spawn_position_vector", "lv_id_number", "gv_id_number"})
("squad_on_register", {"squad_server_object"})
("squad_on_unregister", {"squad_server_object"})
("squad_on_after_game_vertex_change", {"squad_server_object", "last_gvid_number", "m_game_vertex_id_number", "is_level_changed_bool"})
("squad_on_after_level_change", {"squad_server_object", "level_name_string", "cur_lvl_string"})
("smart_terrain_on_update", {"smart_terrain_server_object"})
("on_try_respawn", {"smart_terrain_server_object", "table"}) -- {disabled = false} switch to true for break
("server_entity_on_register", {"server_object", "string"}) -- se_actor, se_artefact, se_car, se_heli, se_outfit, se_helmet, se_weapon, se_weapon_shotgun, se_weapon_automatic_shotgun, se_weapon_magazined, se_weapon_magazined_w_gl, se_item, se_item_torch, se_physic, se_lamp, se_ammo, se_grenade, se_eatable, se_invbox, se_explosive, se_pda, se_detector, se_mgun, se_level_changer, se_monster, se_smart_cover, se_stalker, se_trader, se_zone_anom, se_zone_torrid, se_zone_visual, se_restrictor, sim_squad_scripted, se_smart_terrain
("server_entity_on_unregister", {"server_object", "string"}) -- se_actor", se_artefact, se_car, se_heli, se_outfit, se_helmet, se_weapon, se_weapon_shotgun, se_weapon_automatic_shotgun, se_weapon_magazined, se_weapon_magazined_w_gl, se_item, se_item_torch, se_physic, se_lamp, se_ammo, se_grenade, se_eatable, se_invbox, se_explosive, se_pda, se_detector, se_mgun, se_level_changer, se_monster, se_smart_cover, se_stalker, se_trader, se_zone_anom , se_zone_torrid, se_zone_visual, se_restrictor, sim_squad_scripted, se_smart_terrain
("fill_start_position", {})
("se_stalker_on_spawn", {"server_object"})
("se_actor_on_register", {"server_object"})
("se_actor_on_unregister", {"server_object"})
("se_actor_on_STATE_Write", {"server_object", "net_packet"})
("se_actor_on_STATE_Read", {"server_object", "net_packet", "size_number"})
("map_spot_menu_add_property", {"property_CUIWindow", "id_number", "level_name_string", "hint_string"}) -- возможно есть дуликат вызова
("map_spot_menu_property_clicked", {"property_CUIWindow", "map_spot_property_id_number", "map_spot_property_level_name_string", "prop_string"}) -- возможно есть дуликат вызова
("main_menu_on_keyboard", {"dik_number", "keyboard_action_number", "CUIScriptWnd", "is_level_present_bool"})
("main_menu_on_init", {"CUIScriptWnd"}) -- 1
("main_menu_on_init_controlls", {"CUIScriptWnd"}) -- 2
("main_menu_on_init_callbacks", {"CUIScriptWnd"}) -- 3
("main_menu_on_quit", {"CUIScriptWnd"}) -- 4
("on_game_load", {"binder"}) -- actor net_spawn
("on_console_execute", {"string", "string", "string", "..."})
("on_before_save_input", {"number", "number", "table"})
("on_before_load_input", {"number", "number", "table"})
("save_state", {"table"})
("load_state", {"table"})
("on_pstor_save_all", {"obj_game_object", "net_packet"}) -- is USE_MARSHAL
("on_pstor_load_all", {"obj_game_object", "reader"}) -- is USE_MARSHAL
("on_enemy_eval", {"game_object", "game_object", "table"})
("on_before_surge", {"table"}) -- {allow = true} switch to false to scip surge
("on_before_psi_storm", {"table"}) -- {allow = true} switch to false to scip surge
("opt_menu_on_init", {"CUIScriptWnd"})
("opt_menu_on_accept", {"CUIScriptWnd", "opt", "console"})
("opt_menu_on_set_values", {"CUIScriptWnd", "opt"})
("CUIActorMenu_OnItemDropped", {"first_item_game_object", "second_item_game_object", "from_slot_number", "to_slot_number"}) -- replicated ActorMenu_on_item_drag_drop
("ActorMenu_on_item_drag_drop", {"first_item_game_object", "second_item_game_object", "from_slot_number", "to_slot_number"})
("actor_on_nil_drag_drop_item_on_item", {"first_item_game_object", "second_item_game_object", "from_slot_number", "to_slot_number"})
("actor_on_npc_drag_drop_item_on_item", {"first_item_game_object", "second_item_game_object", "from_slot_number", "to_slot_number"})
("actor_on_actor_drag_drop_item_on_item", {"first_item_game_object", "second_item_game_object", "from_slot_number", "to_slot_number"})
("on_pda_set_active_subdialog", {"ref_pda_script", "section_string", "ui_table"}) -- {ui=nil} is need draw new tab ui set it on variavle ui {ui = ui_pda_encyclopedia_tab.get_ui()}
("ActorMenu_on_item_focus_receive", {"item_game_object"})
("CUIActorMenu_OnItemFocusReceive", {"item_game_object"})
("ActorMenu_on_item_focus_lost", {"item_game_object"})
("CUIActorMenu_OnItemFocusLost", {"item_game_object"})
("CInventory_ItemAvailableToTrade", {"npc_game_object", "item_game_object", "flags_table"}) -- { ret_value = true }
("CInventoryBox_CanTake", {"box_game_object", "item_game_object", "flags_table"}) -- { ret_value = true } -- !!! not use !!! bugs in ingine - not all events processed
("CUIActorMenu_CanMoveToPartner", {"npc_gobj", "item_gobj", "itmWeight", "partner_inv_weight", "partner_max_weight", "flags"}) -- { ret_value = true } -- диолог с нпс
("CInventoryBox_OnInvBoxCanTakeItem", {"box_game_object", "item_game_object", "flags_table"}) -- { ret_value = true }
("CInventoryBox_OnInvBoxCanPlaceItem", {"box_game_object", "item_game_object", "flags_table"}) -- { ret_value = true }
("main_menu_update", {"main_menu_update"})
("on_ixr_autoloader_initialized", {"ref_ixr_autoloader"}) -- IXR AUTOLOADER
("on_init_ixr_options", {"ref_ixr_options"}) -- IXR OPTIONS
("on_item_draw_description", {"item_game_object", "item_game_object_id", "item_game_object_section", "extend_description_table"}) -- IXR Extend description