Это популярное сообщение. Malandrinus 615 Опубликовано 22 Ноября 2010 Это популярное сообщение. Поделиться Опубликовано 22 Ноября 2010 (изменено) Проект X-Ray extensions Представляет собой набор добавлений, расширяющих возможности движка для скриптёров, а также, в ряде случаев, меняющих поведение игры. Изменения реализованы в виде бинарных патчей библиотек и исполняемых файлов. Адрес проекта на Google CodeДокументация одним файлом в 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 хранилище не содержит оригинальных файлов игры. Не забывайте делать резервные копии перед заменой файлов игры! Ссылка на адрес нового репозитария: https://github.com/KD87/xray-extensions Изменено 23 Июня 2016 пользователем Malandrinus 12 12 1 8 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
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! Ссылка на комментарий
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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
Купер 2 927 Опубликовано 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 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 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. Ссылка на комментарий
Labadal 68 Опубликовано 18 Декабря 2020 Поделиться Опубликовано 18 Декабря 2020 8 часов назад, Romann сказал: Ну во первых - это в тему скриптования. Почему в тему скриптования? функция db.actor:is_on_belt - это функция, добавленная проектом Xray extensions, так что логичней спрашивать об этом здесь. А что дальше, не важно, проблема заключалась именно с этой новой функцией проверки нахождения предмета на поясе. God save Hatsune Miku! Ссылка на комментарий
Купер 2 927 Опубликовано 19 Декабря 2020 Поделиться Опубликовано 19 Декабря 2020 @Zander_driver, так вводные изначально туманные, поэтому 18.12.2020 в 08:44, Купер сказал: Приблизительно так Медуза выше, разумеется, вполне себе конкретная и определённая Медуза. Никак не "расходник" и множественности в инвентаре не предусматривает. Иначе, естественно. @Labadal, судя по направленности вопросов, интересует "артефактный" переносимый вес, похоже? Можно подглядеть у @RayTwitty в Shadows Addon. Самый, пожалуй, изящный вариант реализации с минимумом "подсебяшных прокладок". 1 Ссылка на комментарий
Это популярное сообщение. macron 1 884 Опубликовано 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 Ссылка на комментарий
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 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Zander_driver 10 334 Опубликовано 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. Ссылка на комментарий
UriZzz 1 004 Опубликовано 7 Марта 2021 Поделиться Опубликовано 7 Марта 2021 @Zander_driver да в том то и дело что в нём самом. Вылет пропал когда я закомментировал выше мной написанные строки 1 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Zander_driver 10 334 Опубликовано 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. Ссылка на комментарий
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 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Купер 2 927 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 @UriZzz, предположительно - не оно? "Пошурши" по форуму на предмет использования. Ссылка на комментарий
AndreySol 215 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 @UriZzz Ты пишешь, что добавил кэллбэк pda_contact, а в коде бинд_сталкер прописано select_pda_contact. Так как правильно кэллбэк назван в X-Ray extensions? 1 Ссылка на комментарий
UriZzz 1 004 Опубликовано 8 Марта 2021 Поделиться Опубликовано 8 Марта 2021 (изменено) @AndreySol в том то и дело что не знаю. pda_contact это вроде в OGSE, но там этот кэллбэк не используют. select_pda_contact это в shadows addon 0.8, пробовал и так и так, не получилось. Жду может @НаноБотнарисуется, он вроде ещё возится с xray ext (надеюсь), может он подскажет Изменено 8 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
naxac 2 447 Опубликовано 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 Ссылка на комментарий
UriZzz 1 004 Опубликовано 11 Марта 2021 Поделиться Опубликовано 11 Марта 2021 (изменено) @naxac ого, для меня это открытие да, ёлки, в корекшен листе же указывается в пояснениях что мол "скриптовый" коллбэк... Но я как то не придал этому значения... Интересно, как оно там делается??? Ну, это риторический вопрос. В ТЧ движке, в ОГСР или просто седьмом патче можно в принципе и в исходниках подсмотреть, если что. А x ray ext для меня черный ящик. Изменено 11 Марта 2021 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
naxac 2 447 Опубликовано 12 Марта 2021 Поделиться Опубликовано 12 Марта 2021 @UriZzz , почитай вики по проекту - многое прояснится. https://xray-engine.org/index.php?title=X-Ray_extensions 1 2 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
GGG_STALKER 0 Опубликовано 14 Июля 2021 Поделиться Опубликовано 14 Июля 2021 Кто нибуть знает как вернуть метод bomb:explose(0) чтоб не назначать инициатора? Это для ЗП. Закоментировать переход на фикс (7 байтный) не помогает... Ссылка на комментарий
naxac 2 447 Опубликовано 15 Июля 2021 Поделиться Опубликовано 15 Июля 2021 @GGG_STALKER , а ты попробуй вместо id инициатора передать, к примеру, 65535. 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти