Это популярное сообщение. Dennis_Chikin 3 663 Опубликовано 16 Мая 2014 Это популярное сообщение. Поделиться Опубликовано 16 Мая 2014 Ковыряемся в файлах ТЧ Прежде чем писать в тему - внимательно читаем первый пост, и пользуемся поиском. Возможно, ответ на Ваш вопрос уже есть. Касательно телепатии: если Вы передаете Ваши файлы телепатическим путем - ответы будут передаваться тоже телепатически. Если Вы предлагаете угадать, отчего у Вас в подвале происходит странный стук - ответ будет передан стуком. 4 8 6 12 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Купер 3 203 Опубликовано 28 Марта Поделиться Опубликовано 28 Марта Внезапный вопрос поставил в тупик. А как отследить проигрывание партикла в текущий момент, применительно, например, к этому? Ссылка на комментарий
Kirgudu 1 303 Опубликовано 28 Марта Поделиться Опубликовано 28 Марта 36 минут назад, Купер сказал: применительно, например, к этому if self.particle and self.particle:playing() then -- do something end Возможны нюансы в зависимости от того, что в действительности возвращает метод playing(). Там константа на выходе, теоретически 0 или 1, то есть должна сработать как булевый результат, но лучше проверить или посмотреть в движке. 1 3 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
RayTwitty 548 Опубликовано 29 Марта Поделиться Опубликовано 29 Марта 28.03.2025 в 16:58, Kirgudu сказал: Там константа на выходе, теоретически 0 или 1, то есть должна сработать как булевый результат В lua (в сталкере) в 99% случаев приведение типов работает корректно, поэтому условие сработает как обычное булевое. Ну а чтобы проверить проигрывающий партикл, да, этот метод и ссылка на собственно партикл (а без ссылки его и не будет, сборщик мусора же). Кстати, в приведенном примере по ссылке ситуация странная - код есть в оригинале, но проблем никогда не было. Да и "он выполняется на каждом обновлении биндера", на самом деле нет, там выше стоит флажок, код под ним выполнится только на первом апдейте. Впрочем, от доп. проверки хуже ему не станет. 3 Ссылка на комментарий
Капрал Хикс 555 Опубликовано 2 Апреля Поделиться Опубликовано 2 Апреля А напомните, пожалуйста, кто-то уже реализовывал же схему поиска артефактов как в ЧН из ЗП, но для ТЧ? Вроде достаточно немного усовершенствовать se_artefact.script? Добавлено Купер, 3 Апреля Перемещено из темы. Ссылка на комментарий
Fllfll 11 Опубликовано 2 Апреля Поделиться Опубликовано 2 Апреля @Капрал Хикс подобие есть в autumn aurora 2 (вроде чисто на скриптах, если память не изменяет). Более серьезная система в ogsr, но с движковыми правками. 1 Ссылка на комментарий
Капрал Хикс 555 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля @Fllfll, вроде в Detectors mod 1.0 singapur22 систему поиска поменял, но ссылки дохлые, ищу. Выдирать откуда-то из Соли дело неблагодарное... Ссылка на комментарий
Stalkersof 191 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля @Капрал Хикс В АА2 тот же мод от сингапура только доработанный, там детекторы в руках. Выдрать полегче будет если установить огср движок. Я выдрал.))) Freeplay Graphic Mod(FGM) Ссылка на комментарий
Капрал Хикс 555 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля 53 минуты назад, Stalkersof сказал: если установить огср движок. Было бы это так просто. У мен Р.М.А. + x-ray extensions. Ссылка на комментарий
Stalkersof 191 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля @Капрал Хикс А ты на чистый сталкер установи ОГСР и детекторы выдирай, потом к себе перенесешь. В АА2 детекторы на чн руках, арты невидимые (выскакивают из под терейна). И индикация артов на миникарте. 1 1 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Chypakabra 585 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля @Капрал Хикс, я по просьбе одного знакомца, из AA2 детекторы дергал для чистой ТЧ, https://disk.yandex.com/d/qQOzcL-AA2IlGA 2 1 Личный АРХИВ по S.T.A.L.K.E.R Архив по Legends of the Zone Trilogy Ссылка на комментарий
Капрал Хикс 555 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля 10 часов назад, Stalkersof сказал: А ты на чистый сталкер установи ОГСР и детекторы выдирай, потом к себе перенесешь Да я ж говорю, движки разные, зачем такие пляски с бубном? @Chypakabra , супер, буду смотреть. Ссылка на комментарий
Stalkersof 191 Опубликовано 3 Апреля Поделиться Опубликовано 3 Апреля @Капрал Хикс Все что сделано для чистого тч, работает и на ОГСР движке и на x-ray extensions. Ты не понял. Огср движок я рекомендовал установить чисто для дебага.))) 1 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Erty123 0 Опубликовано 4 Апреля Поделиться Опубликовано 4 Апреля function is_has_vodka_borode() if db.actor:object("vodka") then db.actor:give_info_portion("vodka_pon_start") return true end return false end Подскажите пж как можно проверить наличие, например ни 1 водки а штук 6. title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name Добавлено Купер, 4 Апреля Перемещено из темы. Ссылка на комментарий
Balavnik 151 Опубликовано 4 Апреля Поделиться Опубликовано 4 Апреля @Erty123 Воспользоваться готовой функций от сяка/amk/ogse и т.д. А вообще это в тему ковыряния. Или написать свою, которая будет считать предметы в инвентаре с помощью iterate_inventory. А где зима? Ссылка на комментарий
Erty123 0 Опубликовано 4 Апреля Поделиться Опубликовано 4 Апреля Кстати никто не подскажет как можно спавнить предметы в определённый момент(по получению какого-либо инфопоршня или при активации какой-нибудь функции). Ссылка на комментарий
ASSASIN64 25 Опубликовано 5 Апреля Поделиться Опубликовано 5 Апреля Добрый день Где-то это уже было, но лопатить овер 1000 страниц нет сил, а что вбивать в поиск - даже не представляю. Есть такое пожелание, чтобы после нажатия "Взять всё" в ТЧ (это доработал, там несложно в carbody_new_16.xml чутка дописать) окошко закрывалось само. Речь шла по закрытие по таймеру, но где и куда прописать - убей не помню. Подскажите, пжлст. Ссылка на комментарий
Это популярное сообщение. Kirgudu 1 303 Опубликовано 5 Апреля Это популярное сообщение. Поделиться Опубликовано 5 Апреля 3 часа назад, ASSASIN64 сказал: окошко закрывалось само Пример без всяких таймеров (bind_stalker.script): function actor_binder:take_item_from_box(box, item) -- здесь переделываем исходную функцию так, чтобы не выходить из неё, если нет story_id (иначе на "обычных" ящиках не сработает) local story_id = box:story_id() if story_id ~= nil then treasure_manager.take_item_from_box(box, story_id) end -- проверяем, что контейнер, из которого брали предметы, стал пустым if box:is_inv_box_empty() then -- получаем активное окно и закрываем его local inv = level.main_input_receiver() if inv ~= nil then level.start_stop_menu(inv) end end end Нюанс в том, что контейнер закроется не только по кнопке "взять всё", но и если мы вручную переместили из него последний предмет. Доработать под кнопку и/или другие нужды не сложно. 2 5 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
ASSASIN64 25 Опубликовано 5 Апреля Поделиться Опубликовано 5 Апреля (изменено) 7 минут назад, Kirgudu сказал: Пример без всяких таймеров (bind_stalker.script) Спасибо! А в какое место в bind_stalker.script это вставить? Не работает... Вставил после class "actor_binder" (object_binder) Скрытый текст function init (obj) xr_motivator.AddToMotivator(obj) end function actor_init (npc) npc:bind_object(actor_binder(npc)) end local sim = alife() local game_difficulty_by_num = { [0] = "gd_novice", [1] = "gd_stalker", [2] = "gd_veteran", [3] = "gd_master" } lasthealth = 0 local post_time = 0 lasttime = 0 post_process = 0 local weapon_hide = false local last_armor_id = 0 refresh_slots = false local slot_before_binoc = -1 local update_was_never_called = true ---------------------------------------------------------------------------------------------------------------------- class "actor_binder" (object_binder) ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) -- здесь переделываем исходную функцию так, чтобы не выходить из неё, если нет story_id (иначе на "обычных" ящиках не сработает) local story_id = box:story_id() if story_id ~= nil then treasure_manager.take_item_from_box(box, story_id) end -- проверяем, что контейнер, из которого брали предметы, стал пустым if box:is_inv_box_empty() then -- получаем активное окно и закрываем его local inv = level.main_input_receiver() if inv ~= nil then level.start_stop_menu(inv) end end end -------------------------------------------------------------------------------------------------------------------------- function actor_binder:__init (obj) super(obj) self.bCheckStart = false self.actor_detector = xr_detector.actor_detector() self.am = ogse_signals.get_mgr() self.am:call( "on_load_before_all" ) self.am:call( "on_init", obj ) end function actor_binder:__finalize() self.am:call( "on_finalize" ) xr_s_new.init() end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_spawn(data) printf("actor net spawn") self.am:call( "on_before_spawn" ) aa2_hud_control.reset() self:fix_ui_inventory_info() if not has_alife_info( "storyline_actor_start" ) then log2( "[%s]: new game detected, clear all", script_name() ) jr_xvars.clean_all_vars() end 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) _G.Timer = timers.CTimer() -- nv100217 permanent radiation cure if self.actor_detector.init_time ~= -1 then self.actor_detector:actor_enter() dbglog("Permanent radiation bug fix applied") end if self.st.disable_input_time == nil then level.enable_input() end if(actor_stats.add_to_ranking~=nil)then actor_stats.add_to_ranking(self.object:id()) end self.am:call( "on_spawn", data ) --' Загружаем настройки дропа death_manager.init_drop_settings() -- Moved this after the "on_spawn" event, because loot factor gets set on that. amk.on_game_load() if rx_ai then rx_ai.actor_net_spawn() end aa2.set_console_on_load() level.set_cam_inert(0.0) local screen = device() local scr_width = screen.width local scr_height = screen.height if scr_width > 0 and scr_height > 0 then ui_rad.orig_aspect = scr_width / scr_height end cmd("r_SunShafts_Radius 2.0") cmd("r_SunShafts_Blend 0.01") ----------------------------------------------------------- if get_console():get_integer("r3_dynamic_wet_surfaces_sm_res") < 1024 then cmd("r3_dynamic_wet_surfaces_sm_res 1024") --Чтобы полос на стенах не было во время дождя. end cmd("r2_exp_donttest_shad off") --Это экономит фпс. if isIndoor(level.name()) then --SSS18 get_console():execute("ssfx_is_underground 1") else get_console():execute("ssfx_is_underground 0") end ----------------------------------------------------------- if not ogse.var_exists("ES_GRAPHICS_SETTINGS") then cmd("r2_sun_lumscale 1.5") --Фикс темноты cmd("r2_sun_lumscale_amb 1.") cmd("r2_sun_lumscale_hemi 1.5") --Фикс темноты cmd("r2_ls_bloom_threshold 0.0001") --откат со сжима cmd("r2_ls_bloom_kernel_scale 0.7") --Откат со сжима, но чуть прибавлено по сравнению с ЗП --Откат тонмапа со сжима cmd("r2_tonemap on") cmd("r2_tonemap_adaptation 1.") cmd("r2_tonemap_amount 0.7") cmd("r2_tonemap_lowlum 0.0001") cmd("r2_tonemap_middlegray 1.") -- cmd("r3_dynamic_wet_surfaces_far 100.") --Если уменьшать - видна будет граница между мокрой поверхностью и сухой cmd("ssfx_wetsurfaces_1 1.700000, 1.400000, 0.700000, 2.000000") cmd("ssfx_wetsurfaces_2 1.200000, 1.500000, 0.200000, 0.700000") cmd("ssfx_gloss_method 1") --Только так и иначе никак! cmd("ssfx_gloss_minmax 0.600000, 0.800000, 0.15") --так выглядит лучше чем с максимумом 0.9 по крайней мере на вагонах + для худа глосс чуть прибавлен cmd("ssfx_lightsetup_1 0.95, 0.5, 1.0, 1.0") --Вот это для максимального блеска cmd("ssfx_florafixes_1 0.2, 0.3, 0.2, 0.3") cmd("ssfx_florafixes_2 4.0, 1.0, 0.0, 0.0") --Так солнце на листьях выглядит максимально сочно. Больше - уже слишком. --Это наиболее близко к тому чтоб получить картинку как до добавления шейдеров Color Grading cmd("ssfx_exposure 1") cmd("ssfx_gamma 1") cmd("ssfx_saturation 1.0") cmd("ssfx_color_grading 0.500000, 0.500000, 0.500000") -- ogse.save_var("ES_GRAPHICS_SETTINGS", true) end ----------------------------------------------------------- return true end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:net_destroy() self.am:call( "on_before_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.hit, nil) self.object:set_callback(callback.on_key_press, nil) self.object:set_callback(callback.on_key_release, nil) self.object:set_callback(callback.on_key_hold, nil) self.object:set_callback(callback.on_mouse_wheel, nil) self.object:set_callback(callback.on_belt, nil) self.object:set_callback(callback.on_ruck, nil) self.object:set_callback(callback.on_slot, nil) self.object:set_callback(callback.on_cell_item_select, nil) self.object:set_callback(callback.on_attach_vehicle, nil) self.object:set_callback(callback.on_use_vehicle, nil) self.object:set_callback(callback.on_detach_vehicle, nil) self.object:set_callback(callback.on_before_use_item, nil) --self.object:set_callback(callback.on_actor_weapon_switch_gl, nil) self.object:set_callback(callback.on_actor_weapon_zoom_in, nil) self.object:set_callback(callback.on_actor_weapon_zoom_out, nil) self.object:set_callback(callback.on_actor_weapon_alt_aim_switch, nil) --self.object:set_callback(callback.on_actor_weapon_start_firing, nil) self.object:set_callback(callback.on_actor_weapon_fire, nil) --self.object:set_callback(callback.on_actor_weapon_reload, nil) self.object:set_callback(callback.on_throw_grenade, nil) self.object:set_callback(callback.level_changer_action, nil) self.object:set_callback(callback.entity_alive_before_hit, nil) self.object:set_callback(callback.update_artefacts_on_belt, nil) self.object:set_callback( callback.on_cell_item_focus, nil ) self.object:set_callback( callback.on_cell_item_focus_lost, nil ) self.object:set_callback( callback.on_cell_item_mouse, nil ) self.object:set_callback(callback.on_footstep, nil) self.object:set_callback(callback.on_actor_land, nil) self.object:set_callback(callback.on_actor_jump, 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() if ui_grenade_marks then ui_grenade_marks.remove_grenade_marks() end self.am:call( "on_destroy" ) 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.on_cell_item_select, self.on_select_item, self) self.object:set_callback(callback.use_object, self.use_inventory_item, self) self.object:set_callback(callback.hit, self.actor_hit_callback, self) self.object:set_callback(callback.on_key_press, self.on_key_press, self) self.object:set_callback(callback.on_key_release, self.on_key_release, self) self.object:set_callback(callback.on_key_hold, self.on_key_hold, self) self.object:set_callback(callback.on_mouse_wheel, self.on_mouse_wheel, self) self.object:set_callback(callback.on_belt, self.on_item_to_belt, self) self.object:set_callback(callback.on_ruck, self.on_item_to_ruck, self) self.object:set_callback(callback.on_slot, self.on_item_to_slot, self) self.object:set_callback(callback.on_cell_item_select, self.on_select_item, self) self.object:set_callback(callback.on_attach_vehicle, self.attach_car, self) self.object:set_callback(callback.on_use_vehicle, self.use_car, self) self.object:set_callback(callback.on_detach_vehicle, self.detach_car, self) self.object:set_callback(callback.on_before_use_item, self.before_use_item, self) --self.object:set_callback(callback.on_actor_weapon_switch_gl, self.on_actor_weapon_switch_gl, self) self.object:set_callback(callback.on_actor_weapon_zoom_in, self.on_actor_weapon_zoom_in, self) self.object:set_callback(callback.on_actor_weapon_zoom_out, self.on_actor_weapon_zoom_out, self) self.object:set_callback(callback.on_actor_weapon_alt_aim_switch, self.on_actor_weapon_alt_aim_switch, self) --self.object:set_callback(callback.on_actor_weapon_start_firing, self.on_actor_weapon_start_firing, self) self.object:set_callback(callback.on_actor_weapon_fire, self.on_actor_weapon_fire, self) --self.object:set_callback(callback.on_actor_weapon_reload, self.on_actor_weapon_reload, self) self.object:set_callback(callback.on_throw_grenade, self.on_throw_grenade, self) self.object:set_callback(callback.level_changer_action, self.level_changer_action, self) self.object:set_callback(callback.entity_alive_before_hit, self.before_hit_callback, self) self.object:set_callback(callback.update_artefacts_on_belt, self.update_artefacts_on_belt, self) self.object:set_callback(callback.on_footstep, self.on_footstep, self) self.object:set_callback(callback.on_actor_land, self.on_actor_land, self) self.object:set_callback(callback.on_actor_jump, self.on_actor_jump, self) self.object:set_callback( callback.on_cell_item_focus, self.on_cell_item_focus, self ) self.object:set_callback( callback.on_cell_item_focus_lost, self.on_cell_item_focus_lost, self ) self.object:set_callback( callback.on_cell_item_mouse, self.on_cell_item_mouse, self ) self.am:call( "on_reinit" ) end local keyboard_events = { [ "on_key_down" ] = "on_key_down", [ "on_key_hold" ] = "on_key_hold", [ "on_key_up" ] = "on_key_up", } function actor_binder:on_key_press(key) --log1("key :"..key) local bind = dik_to_bind(key) ui_ogse_quicklaunch.chek_keys(key, bind) xr_s_new.on_event( "key_press", key, bind ) if key == bind_to_dik(key_bindings.kNA_USE_BINOC) then if self.object:active_slot() == 4 then self.object:activate_slot(slot_before_binoc) elseif self.object:item_in_slot(4) and self.object:item_in_slot(4):is_binoculars() then slot_before_binoc = db.actor:active_slot() self.object:activate_slot(4) end end self.am:call( keyboard_events.on_key_down, key, dik_to_bind( key ) ) end function actor_binder:on_key_hold(key) local bind = dik_to_bind(key) if level.main_input_receiver() then return end self.am:call( keyboard_events.on_key_hold, key, dik_to_bind( key ) ) end function actor_binder:on_key_release(key) ui_ogse_quicklaunch.on_key_up(key, bind) self.am:call( keyboard_events.on_key_up, key, dik_to_bind( key ) ) end function actor_binder:on_mouse_wheel(vol) if level.main_input_receiver() then return end xr_s_new.on_event("mouse_wheel", vol) self.am:call( "on_wheel", vol ) if self.object:has_info("ui_inventory") then return end if self.object:has_info("ui_pda") then return end if self.object:active_slot() == 5 and vol > 0 then if self.object:item_in_slot(4) and self.object:item_in_slot(4):is_binoculars() then self.object:activate_slot(4) end elseif self.object:active_slot() == 4 and vol > 0 then if self.object:item_in_slot(5) and not self.object:zoom_mode() then self.object:activate_slot(5) end end end function actor_binder:on_select_item(obj) if not obj then return end local sobj = sim:object( obj:id() ) if sobj then self.am:call( "on_select_item", obj, sobj ) end end function actor_binder:before_use_item(item) self.am:call( "on_actor_before_use", item, sim:object( item:id() ) ) end function actor_binder:on_item_to_belt(obj) if not obj then return end local sobj = sim:object( obj:id() ) if sobj then self.am:call( "on_item_to_belt", obj, sobj ) end if ogse_trade_precondition then ogse_trade_precondition.on_item_to_belt(obj) end end function actor_binder:on_item_to_ruck(obj) if not obj then return end local sobj = sim:object( obj:id() ) if sobj then swm_legs.actor_item_to_ruck(obj) -- такое бывает, когда спавним в инвентарь предмет, а потом его тут же -- удаляем ещё выхода в онлайн self.am:call( "on_item_to_ruck", obj, sobj ) end if ogse_trade_precondition then ogse_trade_precondition.on_item_to_ruck(obj) end end function actor_binder:on_item_to_slot(obj) if not obj then return end local sobj = sim:object( obj:id() ) if sobj then swm_legs.actor_item_to_slot(obj) self.am:call( "on_item_to_slot", obj, sobj ) end local wnd = level.get_inventory_wnd() if refresh_slots and wnd:IsShown() then --log1("refresh_slots") refresh_slots = false self.object:invalidate_inventory() update_inventory_window() end if ogse_trade_precondition then ogse_trade_precondition.on_item_to_slot(obj) end end function actor_binder:use_inventory_item(obj) if obj then local sobj = sim:object( obj:id() ) if sobj then self.am:call( "on_use", obj, sobj ) end end end function actor_binder:use_car(car) end function actor_binder:attach_car(car) local torch = db.actor:item_in_slot( 9 ) if torch and torch:is_torch() then torch = get_torch_obj( torch ) if torch.on then torch:switch( false ) end end end function actor_binder:detach_car(car) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) local story_id = box:story_id() if story_id == nil then return end self.am:call( "on_take_from_box", box, item, sim:object( item: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 ---------------------------------------------------------------------------------------------------------------------- local info2call = { ui_car_body = "on_body_open", ui_car_body_hide = "on_body_hide", ui_inventory = "on_inventory_open", ui_inventory_hide = "on_inventory_hide", ui_pda = "on_pda_open", ui_pda_actor_info = "on_pda_actor_info", ui_pda_contacts = "on_pda_contacts_open", ui_pda_contacts_hide = "on_pda_contacts_hide", ui_pda_diary = "on_pda_diary_open", ui_pda_diary_hide = "on_pda_diary_hide", ui_pda_encyclopedia = "on_pda_encyclopedia_open", ui_pda_encyclopedia_hide = "on_pda_encyclopedia_hide", ui_pda_events = "on_pda_events", ui_pda_hide = "on_pda_hide", ui_pda_jobs = "on_pda_jobs_open", ui_pda_jobs_accomplished = "on_pda_jobs_accomplished", ui_pda_jobs_current = "on_pda_jobs_current", ui_pda_jobs_failed = "on_pda_jobs_failed", ui_pda_jobs_hide = "on_pda_jobs_hide", ui_pda_map_global = "on_pda_map_global", ui_pda_map_local = "on_pda_map_local", ui_pda_news = "on_pda_news_open", ui_pda_news_hide = "on_pda_news_hide", ui_pda_ranking = "on_pda_ranking", ui_talk = "on_talk_open", ui_talk_hide = "on_talk_hide", ui_trade = "on_trade_open", ui_trade_hide = "on_trade_hide", } function actor_binder:info_callback(npc, info_id) printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id) --' Сюжет level_tasks.proceed(self.object) -- Отметки на карте level_tasks.process_info_portion(info_id) if info_id == "ui_inventory_hide" then ogse_quick_slots.clear_quick_slot_idik() end if info_id=="ui_trade" then ui_trade_add.trade_open() elseif info_id=="ui_trade_hide" then ui_trade_add.trade_close() end if info_id=="ui_car_body" then ui_body_add.body_open() elseif info_id=="ui_car_body_hide" then ui_body_add.body_close() end self.am:call( "on_info", npc, info_id ) amk.on_info_update(info_id) local sc = info2call[ info_id ] if sc then self.am:call( sc, npc ) end 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, nil, "pda_info") elseif group == "Mutants" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка о мутантах:", nil, 7, nil, "pda_info") elseif group == "Social" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Информация о фракциях:", nil, 7, nil, "pda_info") elseif group == "Artifacts" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка об артефактах:", nil, 7, nil, "pda_info") elseif group == "Anomalies" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Заметка об аномалиях:", nil, 7, nil, "pda_info") elseif group == "Locations" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Информация о локациях:", nil, 7, nil, "pda_info") elseif group == "Zone-story" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "История Зоны:", nil, 7, nil, "pda_info") elseif group == "Stories" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Местный фольклор:", nil, 7, nil, "pda_info") elseif group == "memuars" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Частные заметки:", nil, 7, nil, "pda_info") elseif group == "Found_PDA" then news_manager.send_encyclopedy("encyclopedy", group) amk.send_tip(game.translate_string(name), "Загруженные данные:", nil, 7, nil, "pda_info") 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, nil, "pda_info") end end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_take (obj) level_tasks.proceed(self.object) if rx_ai then rx_ai.actor_item_take(obj) end ogse_quick_slots.on_item_take(obj) --game_stats.update_take_item (obj, self.object) --************************************ m_bar.take_item(obj) --************************************ amk.on_item_take(obj) jr_mod_inv.on_item_take(obj) rad_money.on_item_take(obj) rad_icons.on_item_take(obj) self.am:call( "on_take", obj, sobj ) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_item_drop (obj) level_tasks.proceed(self.object) --game_stats.update_drop_item (obj, self.object) swm_legs.actor_item_to_ruck(obj) ogse_quick_slots.on_item_drop(obj) --************************************ m_bar.drop_item(obj) --************************************ self.am:call( "on_drop_before_all", obj ) local sobj = sim:object( obj:id() ) if sobj then self.am:call( "on_drop", obj, sobj ) end amk.on_item_drop(obj) terrorizm.li(obj) rad_icons.on_item_drop(obj) 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 self.am:call( "on_task", _task, _objective, _state ) end function actor_binder:actor_hit_callback(obj, amount, local_direction, who, bone_index) --log3("--[%s] Called hit_callback for [%s]. Who: [%s], amount: [%s]", script_name(), self.object:name(), who:name(), amount) self.am:call("on_hit", obj, amount, local_direction, who, bone_index) 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) db.actor.power = 1 aa2_hud_control.update() xr_s.on_actor_update(delta) object_binder.update(self, delta) actor_effects.update() hud.checkmysuithud() xr_s_new.on_update( delta ) --amk.show_time() dsh_torch.on_update() rad_icons.update() if update_was_never_called then self.am:call( "on_before_first_update" ) end self.am:call( "on_before_update", delta ) -- DEBUG slowdown -- slowdown.update() local time = time_global() ui_ogse_quicklaunch.on_update() ogse_screen_msg.timer_message_use_item_check() game_stats.update (delta, self.object) -- апдейт схемы детектора self.actor_detector:update() -- апдейт звуковой схемы актера xr_sound.update_actor() --' Проверка потери жизни --[[ if self.object.health - lasthealth > 0.001 or self.object.health - lasthealth < -0.001 then printf("%f | %f", self.object.health, self.object.health - lasthealth, game.time() - lasttime) 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) -- Апдейтим наш телепорт bind_mteleport.actor_update(delta) self.next_restrictors_update_time = time + 200 --commented out for disabling autoquests --task_manager.actor_update() end -- обновление сна if post_time < time then post_time = time + 250 sleep_manager.update(delta) 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 if self.bCheckStart then printf("SET DEFAULT INFOS") if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then bar_spawn.arbalet() -- seaz5150: M79 spawn in Freedom armory. aa2.set_console_on_start() rad_funcs.start_spawn() rad_art_mgr.del_xlam() self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") self.am:call( "on_new_game" ) 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.am:call( "on_bCheckStart" ) self.bCheckStart = false end if rx_ai then rx_ai.actor_update() end if update_was_never_called then swm_legs.load_settings() -- first_update self.am:call( "on_first_update" ) ogse_trade_precondition.on_first_update() update_was_never_called = false end swm_legs.actor_update() local wpn = self.object:active_item() if wpn then local binder = wpn:binded_object() if binder and binder[ "fast_update" ] then binder:fast_update() end end self.am:call( "on_update", delta ) -- Обновление актора amk.on_actor_update() end function actor_binder:on_actor_weapon_switch_gl( obj ) self.am:call( "on_actor_weapon_switch_gl", obj ) end function actor_binder:on_actor_weapon_zoom_in( obj ) self.am:call( "on_actor_weapon_zoom_in", obj ) end function actor_binder:on_actor_weapon_alt_aim_switch( value ) self.am:call( "on_actor_weapon_alt_aim_switch", value ) end function actor_binder:on_actor_weapon_zoom_out( obj ) self.am:call( "on_actor_weapon_zoom_out", obj ) end function actor_binder:on_actor_weapon_start_firing( obj ) self.am:call( "on_actor_weapon_start_firing", obj ) end function actor_binder:on_actor_weapon_fire( obj ) self.am:call( "on_actor_weapon_fire", obj ) end function actor_binder:on_actor_weapon_reload( obj ) self.am:call( "on_actor_weapon_reload", obj ) end function actor_binder:on_throw_grenade( obj ) self.am:call( "on_throw_grenade", obj ) end function actor_binder:level_changer_action( obj, wnd ) local sobj = obj:get_alife_object() local lc = sobj:get_level_changer() local dest_vertex = lc.dest_game_vertex_id local dest_lname = alife():level_name( game_graph():vertex( dest_vertex ):level_id() ) local msg_text_wnd = wnd:FindChild( "message_box_change_level:message_text" ) msg_text_wnd:GetCUIStatic():SetText( game.translate_string( dest_lname ) .. ": " .. game.translate_string( "level_changer_invitation" ) ) self.am:call( "level_changer_action", obj, wnd ) end function actor_binder:before_hit_callback( hit_data ) -- if not self.last_hit_data then -- self.last_hit_data = {} -- end -- dsh.copy_hit_data( hit_data, self.last_hit_data ) if not hit_data.ignore_hit then self.am:call( "on_actor_before_hit", hit_data ) end end function actor_binder:update_artefacts_on_belt( dt ) self.am:call( "update_artefacts_on_belt", dt ) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) if car_trade.current_car then amk.save_variable("car", car_trade.current_car) end printf("actor_binder:save(): self.object:name()='%s'", self.object:name()) object_binder.save(self, packet) --' Сохраняем данные об отключенном вводе if self.st.disable_input_time == nil then packet:w_bool(false) else packet:w_bool(true) ---- fixed by Kamikazze utils.w_CTime(packet, self.st.disable_input_time) end xr_logic.pstor_save_all(self.object, packet) sr_psy_antenna.save( packet ) self.actor_detector:save(packet) -- Some bullshit, crashes without it. packet:w_stringZ("") packet:w_stringZ("") packet:w_stringZ("") utils.w_CTime(packet, self.st.disable_input_time) -- Some bullshit, crashes without it. if rx_ai then rx_ai.actor_save(packet) end self.am:call( "on_save", packet ) self.am:call("on_save_after_all") end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) printf("actor_binder:load(): self.object:name()='%s'", self.object:name()) object_binder.load(self, reader) printf("actor_binder:object_binder.load(): self.object:name()='%s'", self.object:name()) --' Загружаем уровень сложности local game_difficulty = reader:r_u8() if game_difficulty_by_num[game_difficulty] ~= nil then -- изменено KamikaZze с целью отладки 25/02/2009 get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty]) else get_console():execute("g_game_difficulty ".."gd_master") end if reader:r_eof() then abort(translate("actor_binder_load_0")) string.format("%s") 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) sr_psy_antenna.load(reader) self.actor_detector:load(reader) -- Some bullshit, crashes without it. local flag = reader:r_stringZ() -- Some bullshit, crashes without it. self.am:call( "on_load", reader ) end ---------------------------------------------------------------------------------------------------------------------- --старт префетча звуков --if string.find(command_line(), "-noprefetch") == nil then -- sound_prefetch.prefetch_sounds() --end function actor_binder:on_cell_item_focus( obj ) xr_s_new.on_event("cell_item_focus", obj) self.am:call( "on_cell_item_focus", obj ) end function actor_binder:on_cell_item_focus_lost( obj ) xr_s_new.on_event("cell_item_focus_lost", obj) self.am:call( "on_cell_item_focus_lost", obj ) end function actor_binder:on_cell_item_mouse( obj, x, y, action ) self.am:call( "on_cell_item_mouse", obj, x, y, action ) end -- Weapon functions local restore_wpn_t, weapon_hide function hide_weapon() weapon_hide = true if restore_wpn_t then return end db.actor:hide_weapon() restore_wpn_t = dsh.wait_condition( function() return not ( weapon_hide or db.actor:is_talking() ) end, function() db.actor:restore_weapon() weapon_hide = false restore_wpn_t = nil end, function() ogse_signals.get_mgr():reschedule( 200 ) end ) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_footstep(obj, power, material) self.am:call("on_footstep", obj, power, material) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_actor_land(obj) self.am:call("actor_on_land", obj) end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:on_actor_jump(obj, power) self.am:call("actor_on_jump", obj, power) end ---------------------------------------------------------------------------------------------------------------------- function restore_weapon() weapon_hide = false end class "show_start_screen" ( ogse_qt.quick_timer ) function show_start_screen:__init() self.counter = 0 end function show_start_screen:condition() self.counter = self.counter + 1 return self.counter == 2 end function show_start_screen:action() device():pause( true ) end function start() if has_alife_info( "storyline_actor_start" ) then show_start_screen():start() end end function actor_binder:fix_ui_inventory_info() for info, _ in pairs( info2call ) do if self.object:has_info( info ) then --log2( "[%s]: disable %s", script_name(), info ) self.object:disable_info_portion( info ) end end end // this is test for section iteration /** local function test_section_iteration(file_name, section_name) printf ("file : %s",file_name) printf ("section : %s",section_name) local file = ini_file(file_name) local n = file:line_count(section_name) printf ("lines : %d",n) local id, value = "", "", result for i=0,n-1 do result, id, value = file:r_line(section_name,i,"","") printf ("line %d : %s = %s",i,id,value) end end test_section_iteration("system.ltx","space_restrictor") /**/ Там не фрагмент, там весь файл. Не могу найти кнопку "Исправить"... Изменено 5 Апреля пользователем ASSASIN64 Ссылка на комментарий
Kirgudu 1 303 Опубликовано 5 Апреля Поделиться Опубликовано 5 Апреля 55 минут назад, ASSASIN64 сказал: Не работает И не сработает так, как ты написал. В оригинальном bind_stalker.script уже есть функция actor_binder:take_item_from_box(box, item) - посмотри внимательно свой же целиком выложенный файл. Ты добавил функцию с тем же названием, но выше оригинальной, второй (оригинальный) экземпляр функции перетирает первый при загрузке, так как стоит позже, и в результате функционал скрипта не меняется. Отсюда вывод: найди в исходном файле функцию с данным именем и отредактируй её так, как показано в примере, только оставь последнюю добавленную строчку (self.am:call(чего-то-там)). Вот тогда всё заработает. 1 Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD Полезное: модули Артоса, XML парсер Ссылка на комментарий
ASSASIN64 25 Опубликовано 5 Апреля Поделиться Опубликовано 5 Апреля 21 минуту назад, Kirgudu сказал: Отсюда вывод: найди в исходном файле функцию с данным именем и отредактируй её так, как показано в примере, только оставь последнюю добавленную строчку (self.am:call(чего-то-там)). Вот тогда всё заработает. Отредактировал, сделал так: Скрытый текст ---------------------------------------------------------------------------------------------------------------------- function actor_binder:take_item_from_box(box, item) -- здесь переделываем исходную функцию так, чтобы не выходить из неё, если нет story_id (иначе на "обычных" ящиках не сработает) local story_id = box:story_id() if story_id ~= nil then treasure_manager.take_item_from_box(box, story_id) end -- проверяем, что контейнер, из которого брали предметы, стал пустым if box:is_inv_box_empty() then -- получаем активное окно и закрываем его local inv = level.main_input_receiver() if inv ~= nil then level.start_stop_menu(inv) end end self.am:call( "on_take_from_box", box, item, sim:object( item:id() ) ) end ---------------------------------------------------------------------------------------------------------------------- При попытке взять из ящика получаю вылет: Скрытый текст FATAL ERROR [error]Expression : FATAL ERROR [error]Function : CScriptEngine::lua_pcall_failed [error]File : C:\Users\janpl\Source\Repos\seaz5150\rp3\ogsr_engine\COMMON_AI\script_engine.cpp [error]Line : 60 [error]Description : [CScriptEngine::lua_pcall_failed]: s:\radiophobia 3\gamedata\scripts\bind\bind_stalker.script:482: attempt to call field 'take_item_from_box' (a nil value) Что то я опять не так и не туда... Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти