Это популярное сообщение. Malandrinus 615 Опубликовано 22 Ноября 2010 Это популярное сообщение. Поделиться Опубликовано 22 Ноября 2010 Проект X-Ray extensions Скрытый текст Представляет собой набор добавлений, расширяющих возможности движка для скриптёров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов. Адрес проекта на Google Code Адрес проекта на GitHub (новый репозиторий) Документация одним файлом в chm формате по состоянию на 15 августа 2013 г. (собрана, отформатирована и скомпилирована @Kontro-zzz). Версии игры, поддерживаемые на данный момент: ТЧ (патч 1.0006): xrGame.dll, XR_3DA.exe, xrRender_R1/2 ЧН (патч 10): xrGame.dll, xrRender_R1/2/3 ЗП (патч 1.6.02): xrGame.dll, xrRender_R1/2/3/4 Скрытый текст svn хранилище не содержит оригинальных файлов игры. Не забывайте делать резервные копии перед заменой файлов игры! 12 12 1 8 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/
Labadal 68 Опубликовано 17 Декабря 2020 Поделиться Опубликовано 17 Декабря 2020 (изменено) пишу так: Скрытый текст if db.actor:is_on_belt("af_medusa") then скрипт вешаю на апдейт Как итог - ничего не происходит, а всё остальное тупо перестаёт работать: (оружие не достаётся, другие скрипты, висящие на апдейте, тоже не функционируют. следовательно вопрос, что я делаю не так? спасибоньки Убрал кавычки: Скрытый текст if db.actor:is_on_belt(af_medusa) then функция по-прежнему не работает, но всё другое больше не ломается. Что подскажете? Изменено 17 Декабря 2020 пользователем Labadal God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359113
Romann 623 Опубликовано 18 Декабря 2020 Поделиться Опубликовано 18 Декабря 2020 5 часов назад, Labadal сказал: Что подскажете? Ну во первых - это в тему скриптования. Во вторых - ты либо нам показал неполную функцию - либо непонятно, что ты хочешь сделать!? Ну написал ты условие-проверку, "находится ли медуза на поясе" - а дальше то что? Сейчас оно выглядит так: "если на поясе медуза - тогда......." - Что тогда? Ну и конец функции где? Т.е. "end". 2 Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz). Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб). Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359119
Купер 3 464 Опубликовано 18 Декабря 2020 Поделиться Опубликовано 18 Декабря 2020 @Labadal, 1. Приблизительно так: local obj = db.actor:object("af_medusa") if obj and db.actor:is_on_belt(obj) then -- что-то делаем end 2. Не совсем понятно желание использования многострадального actor_update вместо специально добавленного в XRE коллбека on_item_belt. 1 Сталкерский архив Петровича (BFG) Филиал Костра Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359120
Zander_driver 10 348 Опубликовано 18 Декабря 2020 Поделиться Опубликовано 18 Декабря 2020 @Купер, @Labadal, Не надежное решение. Получение объекта по секции, вернет любой один объект с такой секцией, если таковые есть у актора. А затем этот один объект проверяете на нахождение на поясе. А если у актора, к примеру, две медузы. Одна на поясе, а другая нет. То результат такой проверки непредсказуем. Использовать on_item_belt будет правильнее, с проверкой секции предмета в нем. Или, если по каким-то соображениям все таки надо это делать на апдейте, то надежное решение потребует итерации инвентаря/пояса в цикле. 2 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359125
Labadal 68 Опубликовано 18 Декабря 2020 Поделиться Опубликовано 18 Декабря 2020 8 часов назад, Romann сказал: Ну во первых - это в тему скриптования. Почему в тему скриптования? функция db.actor:is_on_belt - это функция, добавленная проектом Xray extensions, так что логичней спрашивать об этом здесь. А что дальше, не важно, проблема заключалась именно с этой новой функцией проверки нахождения предмета на поясе. God save Hatsune Miku! Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359145
Купер 3 464 Опубликовано 19 Декабря 2020 Поделиться Опубликовано 19 Декабря 2020 @Zander_driver, так вводные изначально туманные, поэтому 18.12.2020 в 08:44, Купер сказал: Приблизительно так Медуза выше, разумеется, вполне себе конкретная и определённая Медуза. Никак не "расходник" и множественности в инвентаре не предусматривает. Иначе, естественно. @Labadal, судя по направленности вопросов, интересует "артефактный" переносимый вес, похоже? Можно подглядеть у @RayTwitty в Shadows Addon. Самый, пожалуй, изящный вариант реализации с минимумом "подсебяшных прокладок". 1 Сталкерский архив Петровича (BFG) Филиал Костра Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1359187
Это популярное сообщение. macron 1 905 Опубликовано 28 Февраля 2021 Это популярное сообщение. Поделиться Опубликовано 28 Февраля 2021 (изменено) X-Ray extensions portable r232a. r232a - обновление ссылок - правка опечатки в CAI_Stalker__feel_touch_new_fix https://disk.yandex.ru/d/42vz2C7pzM_35A ЗЫ: в общем, это чуть поправленная версия с движковыми правками за 2015. Изменено 28 Февраля 2021 пользователем macron 1 5 Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1372361
UriZzz 1 004 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 (изменено) Блин, не могу активировать скриптовой келлбэк на выделения контакта в пда... Пробовал подсмотреть в ОГСЕ, там в таблице кэллбэк называется вроде - pda_contact. self.object:set_callback(callback.pda_contact, nil) self.object:set_callback(callback.pda_contact, self.pda_contact, self) Функция: function actor_binder:pda_contact(id) end Получаю вылет с таким логом: Скрытый текст * Detected CPU: GenuineIntel Pentium-III, F6/M7/S10, 3005.00 mhz, 32-clk 'rdtsc' * CPU Features: RDTSC, MMX, SSE, SSE2 Initializing File System... using fs-ltx fsgame.ltx FS: 29499 files cached, 4052Kb memory used. Init FileSystem 0.997419 sec 'xrCore' build 3312, Feb 27 2008 Initializing Engine... Executing config-script "user.ltx"... [d:\s.t.a.l.k.e.r\stalker-shoc\user.ltx] successfully loaded. Starting INPUT device... Loading DLL: xrRender_R2.dll Loading DLL: xrGame.dll xrGame.dll Start adress: 3fe0000 * [win32]: free[4065184 K], reserved[47652 K], committed[81404 K] * [ D3D ]: textures[0 K] * [x-ray]: crt heap[6346 K], process heap[669 K], game lua[0 K], engine lua[0 K], render[0 K] * [x-ray]: economy: strings[1619 K], smem[0 K] Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx"... ! cant convert dik_name for dik[144], prop=[ [d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx] successfully loaded. Executing config-script "user.ltx"... Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\rspec_default.ltx"... [d:\s.t.a.l.k.e.r\gamedata\config\rspec_default.ltx] successfully loaded. Executing config-script "d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx"... [d:\s.t.a.l.k.e.r\gamedata\config\default_controls.ltx] successfully loaded. [d:\s.t.a.l.k.e.r\stalker-shoc\user.ltx] successfully loaded. SOUND: OpenAL: enumerate devices... SOUND: OpenAL: EnumerationExtension Present devices Generic Hardware SOUND: OpenAL: system default SndDevice name is Generic Hardware SOUND: OpenAL: default SndDevice name set to Generic Software SOUND: OpenAL: All available devices: 1. Generic Software, Spec Version 1.1 (default) 2. Generic Software, Spec Version 1.1 (default) SOUND: OpenAL: SelectBestDevice is Generic Software 1.1 SOUND: OpenAL: Required device: Generic Software. Created device: Generic Software. * sound: EAX 2.0 extension: absent * sound: EAX 2.0 deferred: absent * sound : cache: 65538 kb, 7609 lines, 8820 bpl Starting RENDER device... * GPU [vendor:10DE]-[device:622]: NVIDIA GeForce 9600 GT (Microsoft Corporation - WDDM v1.1) * GPU driver: 8.15.11.8593 * CREATE: DeviceREF: 1 * Vertex Processor: PURE HARDWARE * Texture memory: 2784 M * DDI-level: 9.0 * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: recognized, 24 * DVB created: 6144K * DIB created: 512K ! Version conflict in shader 'def_shaders\def_aref' ! Version conflict in shader 'def_shaders\def_aref_v' ! Version conflict in shader 'def_shaders\def_trans' ! Version conflict in shader 'def_shaders\def_trans_v' ! Version conflict in shader 'def_shaders\def_trans_v_tuchi' ! Version conflict in shader 'def_shaders\lod_old' ! Renderer doesn't support blender 'effects\shadow_world' ! Version conflict in shader 'effects\watertest-1' count of .thm files=16 load time=99 ms * NULLRT supported * ...and used * HWDST/PCF supported and used * NV-DBT supported and used - r__tf_aniso 4 - r2_tf_mipbias 0. Starting engine... Loading DLL: xrGameSpy.dll * DVB created: 6144K * DIB created: 512K - r__tf_aniso 4 - r2_tf_mipbias 0. * GPU shading: vs(fffe0300/3.0/30), ps(ffff0300/3.0/30) * GPU vertex cache: recognized, 24 *** RESET [615 ms] "d:\s.t.a.l.k.e.r\bin\xr_3da.exe" * phase time: 0 ms * phase cmem: 103570 K Кэширование объектов... Loading objects... Loading models... * [prefetch] time: 7369 ms * [prefetch] memory: 82461Kb * phase time: 7408 ms * phase cmem: 175164 K Сервер: Старт... * phase time: 54 ms * phase cmem: 175387 K Сервер: Загрузка симуляции жизни... * phase time: 7 ms * phase cmem: 175387 K Создание новой игры... * Creating new game... * Loading spawn registry... * 8642 spawn points are successfully loaded * Saving spawns... * Saving objects... * 17343 objects are successfully saved * Game all.sav is successfully saved to file 'd:\s.t.a.l.k.e.r\stalker-shoc\savedgames\all.sav' * New game is successfully created! * phase time: 3719 ms * phase cmem: 219150 K Сервер: Соединяемся... MaxPlayers = 32 * phase time: 39 ms * phase cmem: 219167 K Клиент: Соединение с localhost... # Player not found. New player created. * client : connection accepted - <> * phase time: 8 ms * phase cmem: 219191 K Открытие потока... * phase time: 16 ms * phase cmem: 223190 K Загрузка формы объектов... * phase time: 3274 ms * phase cmem: 295858 K Загрузка шейдеров... * phase time: 312 ms * phase cmem: 297850 K Загрузка геометрии... * phase time: 63 ms * phase cmem: 298210 K Загрузка базы пространств... * phase time: 563 ms * phase cmem: 302526 K Загрузка детальных объектов... * [DETAILS] VertexConsts(256), Batch(61) * [DETAILS] 40687 v(20), 26352 p * [DETAILS] Batch(61), VB(794K), IB(154K) * phase time: 67 ms * phase cmem: 310764 K Загрузка секторов и порталов... * Loading HOM: d:\s.t.a.l.k.e.r\gamedata\levels\l01_escape\level.hom * phase time: 14 ms * phase cmem: 310938 K Загрузка ИИ объектов... - Loading music tracks from 'l01_escape_musics'... * phase time: 79 ms * phase cmem: 306978 K Клиент: Создание... - Game configuring : Started - Game configuring : Finished * phase time: 310 ms * phase cmem: 315189 K Загрузка текстур... * t-report - base: 1472, 532800 K * t-report - lmap: 5, 5120 K * phase time: 4922 ms * phase cmem: 315189 K Клиент: Синхронизация... * phase time: 35 ms * phase cmem: 315189 K * [win32]: free[2794284 K], reserved[102296 K], committed[1297660 K] * [ D3D ]: textures[537921 K] * [x-ray]: crt heap[315189 K], process heap[7977 K], game lua[26496 K], engine lua[237 K], render[0 K] * [x-ray]: economy: strings[4332 K], smem[28197 K] FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...\s.t.a.l.k.e.r\gamedata\scripts\ogsm_function.script:101: attempt to index field 'actor' (a nil value) stack trace: Пытался сделать по аналогии с shadows addon 0.8, такая же фигня в логе, ЧЯДНТ? Изменено 7 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374154
Zander_driver 10 348 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 Только что, UriZzz сказал(а): scripts\ogsm_function.script:101: attempt to index field 'actor' (a nil value) Ну явно что не колбеки тому причиной... Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374167
UriZzz 1 004 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 @Zander_driver да в том то и дело что в нём самом. Вылет пропал когда я закомментировал выше мной написанные строки 1 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374187
Zander_driver 10 348 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 Полного кода ты нигде не показывал. В том, что показывал, переменная actor даже не упоминается - т.е. на наличие/отсутствие того вылета, влиять не может. И настаиваешь на всякой чертовщине... Извиняй, Кашпировские в отпуске. И похоже что ты не хочешь, чтоб кто-то кроме них, лез к тебе с ненужной помощью. Буду иметь это в виду. 1 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374220
UriZzz 1 004 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 (изменено) @Zander_driver я знаю что сборка работала стабильно, до того как я попытался активировать кэллбэк. После добавления соответствующих строк в function actor_binder:net_destroy() и function actor_binder:reinit(), а также прописания соответствующей функции: function actor_binder:pda_contact(id) end Сборка и начала вылетать с таким логом. Мне ни нужны Кашпировские и разные Аланы Чумаки, я хочу понять как активировать кэллбэк на выделение контакта в ПДА. Я не знаю что ещё показать... Если ты считаешь меня совсем глупым то вот содержание bind_stalker.script Скрытый текст function init (obj) xr_motivator.AddToMotivator(obj) end function actor_init (npc) npc:bind_object(actor_binder(npc)) end local game_difficulty_by_num = { [0] = "gd_novice", [1] = "gd_stalker", [2] = "gd_veteran", [3] = "gd_master" } lasthealth = 0 lasttime = 0 post_process = 0 local weapon_hide = false ---------------------------------------------------------------------------------------------------------------------- class "actor_binder" (object_binder) ---------------------------------------------------------------------------------------------------------------------- function actor_binder:__init (obj) super(obj) self.bCheckStart = false self.weather_manager = level_weathers.WeatherManager() self.actor_detector = xr_detector.actor_detector() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_spawn(data) level.show_indicators() self.bCheckStart = true self.weapon_hide = false -- спрятано или нет оружие при разговоре. weapon_hide = false -- устанавливаем глобальный дефолтовый флаг. if object_binder.net_spawn(self,data) == false then return false end db.add_actor(self.object) if self.st.disable_input_time == nil then level.enable_input() end self.weather_manager:reset() -- game_stats.initialize () if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end --' Загружаем настройки дропа death_manager.init_drop_settings() amk.on_game_load() -- Очищаем уровни от бесхозного оружия remove_weapons.off_weapons() if xrs_ai then xrs_ai.actor_net_spawn(self) end return true end -- ------------------------------------------------------------------ -- схема за 05.07.2015 от makdm с правками от Zander_driver -- В начале игры удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID -- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в талицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then table.insert(remove_sobj, sobj.id) end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do local sobj_for_remove = alife():object(_v) if sobj_for_remove then alife():release(sobj_for_remove, true) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy() if(actor_stats.remove_from_ranking~=nil)then actor_stats.remove_from_ranking(self.object:id()) end -- game_stats.shutdown () db.del_actor(self.object) sr_light.clean_up () self.object:set_callback(callback.inventory_info, nil) self.object:set_callback(callback.article_info, nil) self.object:set_callback(callback.on_item_take, nil) self.object:set_callback(callback.on_item_drop, nil) --self.object:set_callback(callback.actor_sleep, nil) self.object:set_callback(callback.task_state, nil) self.object:set_callback(callback.level_border_enter, nil) self.object:set_callback(callback.level_border_exit, nil) self.object:set_callback(callback.take_item_from_box, nil) self.object:set_callback(callback.use_object, nil) self.object:set_callback(callback.select_pda_contact, nil) if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:destroy() sr_psy_antenna.psy_antenna = false end xr_sound.stop_all_sound_object() object_binder.net_destroy(self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:reinit() object_binder.reinit(self) local npc_id = self.object:id() db.storage[npc_id] = { } self.st = db.storage[npc_id] self.st.pstor = nil self.next_restrictors_update_time = -10000 self.object:set_callback(callback.inventory_info, self.info_callback, self) self.object:set_callback(callback.article_info, self.article_callback, self) self.object:set_callback(callback.on_item_take, self.on_item_take, self) self.object:set_callback(callback.on_item_drop, self.on_item_drop, self) self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats --self.object:set_callback(callback.actor_sleep, self.sleep_callback, self) self.object:set_callback(callback.task_state, self.task_callback, self) --self.object:set_callback(callback.map_location_added, self.map_location_added_callback, self) self.object:set_callback(callback.level_border_enter, self.level_border_enter, self) self.object:set_callback(callback.level_border_exit, self.level_border_exit, self) self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self) self.object:set_callback(callback.use_object, self.use_object, self) self.object:set_callback(callback.select_pda_contact, self.select_pda_contact, self) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end treasure_manager.take_item_from_box(box, story_id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_enter(npc, info_id) self.actor_detector:actor_enter() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:level_border_exit(npc, info_id) self.actor_detector:actor_exit() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:info_callback(npc, info_id) --' Сюжет level_tasks.proceed(self.object) -- Отметки на карте level_tasks.process_info_portion(info_id) amk.on_actor_info(info_id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_trade (item, sell_bye, money) if sell_bye == true then game_stats.money_trade_update (money) else game_stats.money_trade_update (-money) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:article_callback(npc, group, name, article_type) --printf("article_callback [%s][%s]", group, name) if device().precache_frame >1 then return end if group == "Diary" then news_manager.send_encyclopedy("diary", group) amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7) elseif group == "Mutants" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка о мутантах:", nil, 7) elseif group == "Social" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Информация о группировке:", nil, 7) elseif group == "Artifacts" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка об артефактах:", nil, 7) elseif group == "Anomalies" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка об аномалиях:", nil, 7) elseif group == "Locations" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Информация о локации:", nil, 7) elseif group == "Zone-story" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "История Зоны:", nil, 7) elseif group == "Stories" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Местный фольклор:", nil, 7) elseif group == "memuars" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Личная заметка:", nil, 7) elseif group == "Found_PDA" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Скачаны данные:", nil, 7) elseif group == "st_operation_agroprom" or group == "LabX18_information" or group == "aes_military_task" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка в журнале:", nil, 7) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) ogsm_function.outfit_fix(obj) --game_stats.update_take_item (obj, self.object) if xrs_ai then xrs_ai.actor_item_take(obj) end if obj:clsid() == clsid.wpn_ammo then dunin_ammo.on_take(obj) end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) amk.on_item_drop(obj) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:use_object(obj) ogsm_quests.use_items(obj) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:select_pda_contact(id) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:task_callback(_task, _objective, _state) task_manager.task_callback(_task:get_id(), _objective:get_idx(), _state) if _objective:get_idx() == 0 then if _state == task.fail then news_manager.send_task(db.actor, "fail", _task, _objective) elseif _state == task.completed then task_manager.reward_by_task(_task) news_manager.send_task(db.actor, "complete", _task, _objective) else news_manager.send_task(db.actor, "new", _task, _objective) end else if _task:get_objective(0):get_state() == task.in_progress then news_manager.send_task(db.actor, "update", _task, _objective) end end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:map_location_added_callback(spot_type_str, object_id) if (false==app_ready()) or (device().precache_frame>1) then return end --'news_manager.send_task(db.actor, "new") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:update(delta) object_binder.update(self, delta) -- DEBUG slowdown -- slowdown.update() local time = time_global() game_stats.update (delta, self.object) -- Обновление сна if sleep_manager.is_sleep_active() and xr_conditions.actor_dead() then xr_logic.issue_event(db.actor, db.storage[db.actor:id()]["ar_sleep"], "update") end -- апдейт погоды self.weather_manager:update() -- апдейт схемы детектора self.actor_detector:update() -- апдейт звуковой схемы актера xr_sound.update_actor() --' Проверка потери жизни --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then lasthealth = self.object.health lasttime = game.time() end ]] -- Обновление отключения ввода с клавиатуры. if self.st.disable_input_time ~= nil and game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle then level.enable_input() self.st.disable_input_time = nil end -- Обновление сна с переносом чувака в указанную позицию if self.st.sleep_relocate_time ~= nil and game.get_game_time():diffSec(self.st.sleep_relocate_time) >= self.st.sleep_relocate_idle then self.object:set_actor_position(self.st.sleep_relocate_point) local dir = self.st.sleep_relocate_point:sub(self.st.sleep_relocate_look) self.object:set_actor_direction(dir:getH()) self.st.sleep_relocate_time = nil end -- Апдейт прятание оружия игрока во время диалога if weapon_hide == true or self.object:is_talking() then if self.weapon_hide == false then self.object:hide_weapon() self.weapon_hide = true end else if self.weapon_hide == true then self.object:restore_weapon() self.weapon_hide = false end end -- обновление рестрикторов, которые под логикой, срабатывает через интервалы времени if self.next_restrictors_update_time < time then bind_restrictor.actor_update(delta) self.next_restrictors_update_time = time + 200 task_manager.actor_update() end -- обновление постпроцессов if post_process ~= 0 then if post_process:update () == true then post_process = 0 end end -- обновление пси-антенны if sr_psy_antenna.psy_antenna then sr_psy_antenna.psy_antenna:update(delta) end --' Вывод сообщения о большой радиации if self.object.radiation >= 0.7 then local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static == nil then hud:AddCustomStatic("cs_radiation_danger", true) hud:GetCustomStatic("cs_radiation_danger"):wnd():SetTextST("st_radiation_danger") end else local hud = get_hud() local custom_static = hud:GetCustomStatic("cs_radiation_danger") if custom_static ~= nil then hud:RemoveCustomStatic("cs_radiation_danger") end end -- Запускаем затычку от возможной потери содержимого тайников treasure_manager.get_treasure_manager():loss_workaround() if self.bCheckStart then if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true end -- if not has_alife_info("encyclopedy") then -- self.object:give_info_portion("encyclopedy") -- end if not has_alife_info("global_dialogs") then self.object:give_info_portion("global_dialogs") end if not has_alife_info("level_changer_icons") then self.object:give_info_portion("level_changer_icons") end level_tasks.add_lchanger_location() self.bCheckStart = false end -- Обновление актора amk.on_actor_update() -- Обновление АИ-пака if xrs_ai then xrs_ai.actor_update(delta) end -- Обновление упаковщика патронов if not self.object:is_talking() then dunin_ammo.on_update() end --ссылаемся на секцию спринта self:hud_sprint_animation() end ---------------------------------------------------------------------------------------------------------------------- --спринт by RayTwitty local sprint = false local last_active_item_id = 0 function actor_binder:hud_sprint_animation() local active_item = self.object:active_item() if active_item and last_active_item_id ~= active_item:id() then last_active_item_id = active_item:id() sprint = false end if active_item and (active_item:is_knife() or active_item:is_missile()) then if (active_item:get_hud_item_state() == 0 and active_item:is_knife()) or (active_item:get_hud_item_state() == 2 and active_item:is_missile()) then if self.object:is_actor_sprinting() then if not sprint then active_item:play_hud_animation(system_ini():r_string(active_item:section().."_hud", "anim_idle_sprint"), true) sprint = true end elseif sprint then active_item:play_hud_animation(system_ini():r_string(active_item:section().."_hud", "anim_idle"), true) sprint = false end elseif sprint then sprint = false end end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) local pk1 = fake_net_packet.fake_net_packet() self:save_old(pk1) -- get_console():execute("Packet_size_is_"..pk1:w_tell()) if pk1:w_tell() > 7500 then task_manager.cleanup_actor() end self:save_old(packet) end function actor_binder:save_old(packet) local save_treasure_manager = true object_binder.save(self, packet) --' Сохраняем уровень сложности if save_treasure_manager == true then packet:w_u8(level.get_game_difficulty() + 128) else packet:w_u8(level.get_game_difficulty()) end --' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packet:w_bool(true) utils.w_CTime(packet, self.st.disable_input_time) end xr_logic.pstor_save_all(self.object, packet) self.weather_manager:save(packet) sr_psy_antenna.save( packet ) if save_treasure_manager == true then treasure_manager.save(packet) end task_manager.save(packet) self.actor_detector:save(packet) -- ------------------------------------------------------------------ -- схема за 05.07.2015 от makdm с правками от Zander_driver -- перед сейвом удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID -- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в талицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then table.insert(remove_sobj, sobj.id) end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do local sobj_for_remove = alife():object(_v) if sobj_for_remove then alife():release(sobj_for_remove, true) end end -- ------------------------------------------------------------------ end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) object_binder.load(self, reader) --' Загружаем уровень сложности local game_difficulty = reader:r_u8() local load_treasure_manager = false if game_difficulty >= 128 then game_difficulty = game_difficulty - 128 load_treasure_manager = true end get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) if reader:r_eof() then abort("SAVE FILE IS CORRUPT") end local stored_input_time = reader:r_u8() if stored_input_time == true then self.st.disable_input_time = utils.r_CTime(reader) end xr_logic.pstor_load_all(self.object, reader) self.weather_manager:load(reader) sr_psy_antenna.load(reader) if load_treasure_manager == true then treasure_manager.load(reader) end task_manager.load(reader) self.actor_detector:load(reader) -- ------------------------------------------------------------------ -- схема за 05.07.2015 от makdm с правками от Zander_driver -- в конце загрузки удаляем все объекты ставящие себе ID от левелчейнжера в качестве PARENT_ID -- что приводит к битью сейвов и вылету движка по CHILD REGISTERED BUT NOT FOUND local parent_id = {} local remove_sobj = {} local i = 1 -- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу while i < 65535 do local sobj = alife():object( i ) if sobj and sobj:clsid() == clsid.level_changer then parent_id[ sobj.id ] = sobj.id end i = i + 1 end -- Пробегаем по объектам и все child level_changer помещаем в талицу for n = 1, 65534 do local sobj = alife():object( n ) if sobj then for k,v in pairs( parent_id ) do if sobj.parent_id == v then table.insert(remove_sobj, sobj.id) end end end end --Удаляем child level_changer for _k,_v in pairs( remove_sobj ) do local sobj_for_remove = alife():object(_v) if sobj_for_remove then alife():release(sobj_for_remove, true) end end -- ------------------------------------------------------------------ end ---------------------------------------------------------------------------------------------------------------------- -- Weapon functions function hide_weapon() weapon_hide = true end function restore_weapon() weapon_hide = false end Это взято из shadows addon 0.8 А вот файл в котором якобы ошибка: Скрытый текст ----------- Дополнительные функции и фиксы для OGSM 2.x ------------ -------------- Copyright 2007-2008 DEXXX, lvg_brest ---------------- -- Создание "убийственной зоны" на Радаре function check_radar_off() if (level.name() == "l10_radar") then if not has_alife_info("bar_deactivate_radar_done") then local pos = db.actor:position() if pos.z>65 and pos.x>350 and pos.x<410 then if amk.load_variable("rfx",0)==0 then level.add_pp_effector("fire_hit.ppe", 1523, true) level.set_pp_effector_factor(1523, 0.5) amk.save_variable("rfx",1) amk.start_timer("rfx",5) end end end end end function radar_fix() level.remove_pp_effector(1523) local pos = db.actor:position() if pos.z>65 and pos.x>350 and pos.x<410 then db.actor:kill(db.actor) end amk.del_variable("rfx") end -- Багфикс таймеров function fix_timers() for i=1,100 do amk.del_variable("rt"..i) amk.del_variable("rt"..i.."d") amk.del_variable("rt"..i.."p") amk.del_variable("gt"..i) amk.del_variable("gt"..i.."d") amk.del_variable("gt"..i.."p") end amk.del_variable("rfx") amk.del_variable("blt") amk.del_variable("drnk") amk.del_variable("bl1") amk.del_variable("bl2") amk.del_variable("bl3") amk.del_variable("bl4") amk.del_variable("bl5") amk.del_variable("bl6") amk.del_variable("bl7") amk.del_variable("rsp") amk.g_start_timer("bl1",0, 24+math.random(-4,4), 0) amk.g_start_timer("rsp",0, 4+math.random(-1,1), 0) -- get_console():execute("amk.g_start_timers_restart!") end -- Удаление при загрузке трупов в Припяти во фриплее и фантомов пси-собак на Радаре, в Припяти, на ЧАЭС local dist_to_corpses = 150 -- расстояние от ГГ, свыше которого считаются трупы. local a = 0 local b = 0 function clean_level() if has_alife_info("freeplay") and level.name()=="l11_pripyat" and a==0 then for i=1,65535 do local obj = level.object_by_id(i) if obj then local posobj = obj:position() local actorpos = db.actor:position() local npc_name = obj:name() if IsStalker(obj) and not obj:alive() and npc_name~="mil_freedom_member0012" and npc_name~="mil_freedom_member0021" and npc_name~="mil_freedom_member0018" and npc_name~="mil_freedom_member0026" and npc_name~="mil_freedom_member0023" then if (posobj:distance_to(actorpos) > dist_to_corpses) then local obj_1 = alife():object(obj:id()) if obj_1 then local result = pcall(prot_release_ogd, obj_1) end end end end end a = 1 end if (level.name()=="l10_radar" or level.name()=="l11_pripyat" or level.name()=="l12_stancia" or level.name()=="l12_stancia_2") and b==0 then for i=1,100 do local obj_1 = alife():object("psy_dog_phantom") if obj_1 then local result = pcall(prot_release_ogd, obj_1) end end b = 1 end end function prot_release_ogd(obj_1) alife():release(obj_1, true) end -- Исправление сброса визуала игрока, если в его инвентаре находится более двух костюмов, Shadows function outfit_fix(obj) if string.find(obj:section(),"outfit") then local actor_outfit = db.actor:item_in_slot(6) -- Вот эта строчка if actor_outfit and actor_outfit:id() ~= obj:id() then db.actor:transfer_item(actor_outfit, db.actor) end end end --[[ Если вы собираетесь использовать данный скрипт целиком или частично в своих разработках по игре S.T.A.L.K.E.R., пожалуйста не удаляйте копирайты, указывайте настоящего автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Спасибо за понимание. ]]-- Но чем это поможет, сея функция мною будет вырезана за ненадобностью, так как это дело поправлено в движке. Я уже пробовал - отключал её, но вылет сохранился, просто ругань была уже на другое место, и всё так же на field 'actor'. Изменено 7 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374225
Купер 3 464 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 @UriZzz, предположительно - не оно? "Пошурши" по форуму на предмет использования. Сталкерский архив Петровича (BFG) Филиал Костра Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374324
AndreySol 215 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 @UriZzz Ты пишешь, что добавил кэллбэк pda_contact, а в коде бинд_сталкер прописано select_pda_contact. Так как правильно кэллбэк назван в X-Ray extensions? 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374334
UriZzz 1 004 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 (изменено) @AndreySol в том то и дело что не знаю. pda_contact это вроде в OGSE, но там этот кэллбэк не используют. select_pda_contact это в shadows addon 0.8, пробовал и так и так, не получилось. Жду может @НаноБотнарисуется, он вроде ещё возится с xray ext (надеюсь), может он подскажет Изменено 8 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374335
naxac 2 595 Опубликовано 11 Марта 2021 Поделиться Опубликовано 11 Марта 2021 (изменено) @UriZzz , как называется каллбэк - не важно. В функцию set_callback нужно передавать число. А чтобы callback.select_pda_contact или callback.pda_contact стали числом, надо сделать что-то типа callback.select_pda_contact = 12345 где 12345 - номер каллбэка. В общем, добавить в класс callback соответствующую переменную, потому что движок сам этого не делает - каллбэк-то "самопальный". Изменено 11 Марта 2021 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374880
UriZzz 1 004 Опубликовано 11 Марта 2021 Поделиться Опубликовано 11 Марта 2021 (изменено) @naxac ого, для меня это открытие да, ёлки, в корекшен листе же указывается в пояснениях что мол "скриптовый" коллбэк... Но я как то не придал этому значения... Интересно, как оно там делается??? Ну, это риторический вопрос. В ТЧ движке, в ОГСР или просто седьмом патче можно в принципе и в исходниках подсмотреть, если что. А x ray ext для меня черный ящик. Изменено 11 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1374881
naxac 2 595 Опубликовано 12 Марта 2021 Поделиться Опубликовано 12 Марта 2021 @UriZzz , почитай вики по проекту - многое прояснится. https://xray-engine.org/index.php?title=X-Ray_extensions 1 2 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1375050
GGG_STALKER 0 Опубликовано 14 Июля 2021 Поделиться Опубликовано 14 Июля 2021 Кто нибуть знает как вернуть метод bomb:explose(0) чтоб не назначать инициатора? Это для ЗП. Закоментировать переход на фикс (7 байтный) не помогает... Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1389888
naxac 2 595 Опубликовано 15 Июля 2021 Поделиться Опубликовано 15 Июля 2021 @GGG_STALKER , а ты попробуй вместо id инициатора передать, к примеру, 65535. 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO Ссылка на комментарий https://www.amk-team.ru/forum/topic/10538-x-ray-extensions/page/81/#findComment-1389960
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти