Redix 0 Опубликовано 26 Сентября 2020 Поделиться Опубликовано 26 Сентября 2020 Нужен скриптер, возможно ли переделать скрипт из мода Dynamics Helmets на ЗП в ТЧ? Поменял только названия визуалов, вылет. Скрытый текст [26.09.20 15:11:25.868] ********************************************************************************* [26.09.20 15:11:25.868] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR: ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil) stack traceback: [C]: at 0x7ff92d71b8d8 [C]: in function 'find' ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode' ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update' ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214> [26.09.20 15:11:25.868] ********************************************************************************* [26.09.20 15:11:25.868] FATAL ERROR [error]Expression : FATAL ERROR [error]Function : CScriptEngine::lua_pcall_failed [error]File : c:\projects\ogsr-engine\ogsr_engine\common_ai\script_engine.cpp [error]Line : 52 [error]Description : [CScriptEngine::lua_pcall_failed]: ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil) [26.09.20 15:11:25.868] ***************************[ScriptCrashHandler]********************************** [26.09.20 15:11:25.868] stack traceback: [C]: at 0x7ff92d71b8d8 [C]: in function 'find' ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: in function 'str_explode' ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:68: in function 'update' ...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:340: in function <...l.k.e.r - shadow of chernobyl\gamedata\scripts\bind_stalker.script:214> [26.09.20 15:11:25.868] Locals: [26.09.20 15:11:25.868] string (*temporary) : ....a.l.k.e.r - shadow of chernobyl\gamedata\scripts\m_visuals.script:125: bad argument #1 to 'find' (string expected, got nil) [26.09.20 15:11:25.868] End [26.09.20 15:11:25.868] Locals: [26.09.20 15:11:25.868] nil (*temporary) : [not available] [26.09.20 15:11:25.868] string (*temporary) : . [26.09.20 15:11:25.868] number (*temporary) : 1.000000 [26.09.20 15:11:25.868] boolean (*temporary) : true [26.09.20 15:11:25.868] string (*temporary) : string expected, got nil [26.09.20 15:11:25.868] string (*temporary) : bad argument #1 to 'find' (string expected, got nil) [26.09.20 15:11:25.868] End [26.09.20 15:11:25.868] Locals: [26.09.20 15:11:25.868] string div : . [26.09.20 15:11:25.868] nil str : [not available] [26.09.20 15:11:25.868] number pos1 : 1.000000 [26.09.20 15:11:25.868] number pos2 : 1.000000 [26.09.20 15:11:25.868] nil clear : [not available] [26.09.20 15:11:25.868] nil conv : [not available] [26.09.20 15:11:25.868] Table: t [26.09.20 15:11:25.868] nil cpt : [not available] [26.09.20 15:11:25.868] nil pos : [not available] [26.09.20 15:11:25.868] End [26.09.20 15:11:25.868] Locals: [26.09.20 15:11:25.868] End [26.09.20 15:11:25.868] Locals: [26.09.20 15:11:25.868] Userdata: self [26.09.20 15:11:25.868] Table: self.st [26.09.20 15:11:25.868] number self.next_restrictors_update_time : 28190.000000 [26.09.20 15:11:25.868] boolean self.weapon_hide : false [26.09.20 15:11:25.868] boolean self.bCheckStart : false [26.09.20 15:11:25.868] Userdata: self.weather_manager [26.09.20 15:11:25.868] table self.weather_manager.weather_list : [...] [26.09.20 15:11:25.868] number self.weather_manager.update_time : 10000.000000 [26.09.20 15:11:25.868] string self.weather_manager.update_level : l01_escape [26.09.20 15:11:25.868] number self.weather_manager.weather_change_day : 1.000000 [26.09.20 15:11:25.868] Userdata: self.actor_detector [26.09.20 15:11:25.868] number self.actor_detector.init_time : -1.000000 [26.09.20 15:11:25.868] number delta : 0.000000 [26.09.20 15:11:25.868] number time : 27990.000000 [26.09.20 15:11:25.868] End Вот сам скрипт: Скрытый текст ---------------------- -- File: Visuals -- Author: Shoker, Mechanic -- Правки: Antnigm, Redix -- Меняет визуал ГГ в зависимости от одетого на него шлема ---------------------- -- Таблица секций брони, а также визуалов --[[ local visuals = { секция_брони = { секция_шлема = путь к моделе ... } ... } ]] -- Если шлем не нужен, то ничего не пишем local visuals = { without_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, novice_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, stalker_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, svoboda_light_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, dolg_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, svoboda_heavy_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, specops_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, military_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, dolg_heavy_outfit = { helm_respirator = "actors\\novice\\green_stalker_antigas", }, } local otf local helm local curent_vis local helm_tbl local new_model function update() otf = db.actor:item_in_slot(7) helm = db.actor:item_in_slot(11) curent_vis = db.actor:get_visual_name() if otf==nil and helm==nil then db.actor:set_visual_name("actors\\hero\\hero_novice") return end if otf~=nil and helm==nil then local otf_vis_name = str_explode(".", get_ltx(otf:section(), "actor_visual", "str"))[1] if otf_vis_name~=curent_vis then db.actor:set_visual_name(otf_vis_name) end else ------------------------------------- if otf==nil and helm~=nil then helm_tbl = visuals["without_outfit"] else helm_tbl = visuals[otf:section()] end if helm_tbl~=nil then new_model = helm_tbl[helm:section()] if new_model~=nil then if new_model~=curent_vis then db.actor:set_visual_name(new_model) end end end ------------------------------------- end end -- Получить строку из LTX файла function get_ltx(l_name,l_string,type) if system_ini():section_exist(l_name) and system_ini():line_exist(l_name, l_string) then if type=="bol" then return system_ini():r_bool(l_name, l_string) end if type=="num" then -- целое число return tonumber(system_ini():r_u32(l_name, l_string)) end if type=="num_float" then -- число с запятой return tonumber(system_ini():r_float(l_name, l_string)) end if type=="str" then return tostring(system_ini():r_string(l_name, l_string)) end if type==nil then return system_ini():r_u32(l_name, l_string) end end return nil end function str_explode(div,str,pos1,pos2,clear, conv) local t={} local cpt, pos if pos1 == nil then pos1 = 1 end if pos2 == nil then pos2 = pos1 end local cpt1 = string.find (str, div, pos1, true) local cpt2 = string.find (str, div, pos2, true) if cpt1 and cpt2 then if cpt2-cpt1 > 5 then cpt = cpt1 pos = pos1 else cpt = cpt2 pos = pos2 end repeat if clear then table.insert( t, trim(string.sub(str, 1, cpt-1)) ) else table.insert( t, string.sub(str, 1, cpt-1) ) end str = string.sub( str, cpt+string.len(div) ) cpt = string.find (str, div, pos, true) until cpt==nil end if clear then table.insert(t, trim(str)) else table.insert(t, str) end if conv then t = convert_tbl(t) end return t end 125 строка - local cpt1 = string.find (str, div, pos1, true) Заранее спасибо Ссылка на комментарий
UriZzz 1 004 Опубликовано 26 Сентября 2020 Поделиться Опубликовано 26 Сентября 2020 (изменено) В xray_ext есть скриптовой метод задающий путь до визуала для актора - set_actor_visual(string<path>), не думал попробовать? В ОГСР скорее всего тоже что то есть, не знаю. Как показал lua_help в ТЧ нет методов set_visual_name, get_visual_name, так что однозначно правим движок Изменено 26 Сентября 2020 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 28 Сентября 2020 Поделиться Опубликовано 28 Сентября 2020 Ребят, а как вообще реализована механика ворон в Сталкере? Насколько я понял - они спавнятся и "беспалева" преследуют ГГ по небу, имитируя бурную воронью деятельность. А есть возможность задать воронам вектор движения? По вызову скрипта, например, чтобы летела ворона от края до края локи? Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 Доброго времени! Сильно заинтересовал такой вопрос - в ТЧ есть масхалат, точнее маскировочный экзоскелет, в котором можно некоторое время шариться под самым носом у врагов и они только головами водят, но не трогают. Как реализовать такую маскировку в ЗП, если это реально? Ссылка на комментарий
HellRatz 2 892 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 @mdm64, вставлю 5 копеек и не более. Не утверждаю, т.к не скриптер. Но большинство кода можно перенести из платформы в платформу, что и делали первые модификации на ЗП — там тянули фишки из модов на ТЧ (Те же контейнеры для артов). Думаю, если у тебя есть скрипт этого экзоскелета, можно попробовать его адаптировать напрямую. Во всяком случае, я бы начал с этого, чем писать с нуля. 3 GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 @HellRatz, Согласен, идея более чем разумная. Мы тут с моей головой посовещались и я решил... высказать простое предположение по возможной реализации "невидимки" - по сути, если вспомнить реакцию враждебных НПС из той же Солянки, требуется при надевании такого масхалата прописать запрет на стрельбу со стороны врагов и всё. И будет тот же самый эффект. Я хорошо помню, что неписи даже какое-то время шли за мной с оружием, кричали "враг, враг!", но не стреляли. Но честно говоря, я сейчас не представляю, как эту возможность реализовать. Понятно, что требуется скрипт и инфопоршни, чтобы при одевании масхалата выдавался поршень и скрипт отрабатывал запрет ведения огня любыми неписями... Думается, так оно и реализовано, это по мне так самый простой вариант "Невидимки". Хотя, может быть и ошибаюсь... Ссылка на комментарий
Painter 3 401 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 Цитата Как реализовать такую маскировку в ЗП, если это реально? @mdm64, один из вариантов реализации маскхалата можно подсмотреть здесь. 1 Портфолио Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 (изменено) @Jurok, Этот параметр является штатным для движка ЗП - "npc_blindness_koeff" (видимость ГГ НПС, в метрах.)? или это только для правленого движка? @Jurok, Если я правильно понимаю, в этом способе работают следующие файлы: Скрытый текст npc_blindness_koeff = 19 ;видимость ГГ НПС, в метрах. Скрытый текст function ReadOutfitBlindnessKoeff(section) local ltx = system_ini() if ltx:line_exist(section,"npc_blindness_koeff") then return ltx:r_float(section,"npc_blindness_koeff") else return 80 end end function transparent_gg() local range1, id, obj_around, alife_obj, dist_act_npc local outfit_in_slot=db.actor:item_in_slot(7) if db.actor == nil then return nil end if db.actor:item_in_slot(7) == nil then range1 = 80 elseif outfit_in_slot~=nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section())>0.0 then range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section()) else range1 = 80 end for id = 1, 65534 do obj_around = level.object_by_id(id) if obj_around ~= nil and IsStalker(obj_around) then alife_obj = alife():object(id) if alife_obj then dist_act_npc = db.actor:position():distance_to(alife_obj.position) end if dist_act_npc <= 120 then if obj_around then obj_around:set_range(range1) end else if obj_around then obj_around:set_range(80) end end end end end function timer_trans() timer_transparent = timer_transparent + 1 if timer_transparent >= 50 then timer_transparent = 0 transparent_gg() end end Скрытый текст trans_outfit.timer_trans() -- уменьшение дистанции видимости при одевании соотв. броников -- јпдейт доступности дл¤ симул¤ции. simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor()) bind_stalker_ext.actor_on_update(self,delta) --alun_utils.debug_write("actor update END 2") end Скрытый текст mus_vol = 0 amb_vol = 0 b_discard_settings_shown = false timer_transparent = 0 --маскхалат Я ничего не пропустил или всё-таки что-то не доглядел? Изменено 29 Сентября 2020 пользователем mdm64 Ссылка на комментарий
dsh 3 824 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 2 hours ago, mdm64 said: высказать простое предположение по возможной реализации "невидимки Один из вариантов - это использовать enemy_callback. Т.е. если невидимка в слоте, то всем мобам этот коллбек отвечает, что актор невкусный и они его игнорируют. 2 3 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Romann 623 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 2 часа назад, mdm64 сказал: Думается, так оно и реализовано. Хотя, может быть и ошибаюсь... Ошибаешься. 2 часа назад, HellRatz сказал: большинство кода можно перенести из платформы в платформу Я как-то тоже подумывал перенести "невидимку" на КоК, там конечно есть свой "маскхалат", но вот хочется именно тот самый скрипт невидимки от @НаноБот, там используется некий "инвиз", что за зверь и где он в скриптах вообще объявляется я так и не нашёл(или плохо искал), или может он из движка не знаю, так и забил на это. Мать: 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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
WinCap 316 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 3 часа назад, mdm64 сказал: возможной реализации "невидимки" Как уже сказал @dsh, самый простой вариант добавить новое условие в функцию "is_enemy()" в "xr_combat_ignore.script". Если надет нужный броник, то функция возвращает false. Скрытый текст function is_enemy(obj, enemy, st, not_check_sim) ... if st.enabled == false then return true end -- МаскХалат if enemy:id() == db.actor:id() then local bronik = db.actor:item_in_slot(7) if bronik and bronik:section() == "maskhalat" then return false end end ... end 1 3 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 @WinCap, Да, согласен, действительно очень просто, решение в несколько строк... Ссылка на комментарий
Romann 623 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 11 минут назад, WinCap сказал: самый простой вариант Ну не всё так просто - это не реализация "невидимки", это всего лишь некий игнор, враг просто не будет атаковать, но по факту актора будут все видеть, и даже на него реагировать. И назвать такое "невидимкой" у меня лично язык не повернётся, ИМХО. А вот сделать полную реализацию невидимки, когда мобы актора не просто игнорят - а полностью не видят и не реагируют - вот это уже "невидимка". 4 Мать: 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. Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 (изменено) @Romann, Соглашусь полностью, но именно так была реализована "невидимка" в Солянке, просто другой реализации я не видел. Я бы даже сказал так - это именно маскхалат, когда враги тебя ощущают, но не видят отчётливо настолько, чтобы стрелять. А "невидимка" это да - когда сидят "три мартышки"... и четвёртая с КПК.... Изменено 29 Сентября 2020 пользователем mdm64 1 Ссылка на комментарий
WinCap 316 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 @mdm64, вариант скрипта, с проверкой расстояния и времени суток: Скрытый текст if enemy:id() == db.actor:id() then local bronik = db.actor:item_in_slot(7) if bronik and bronik:section() == "maskhalat" then local dist = 10 -- ночью if in_time_interval(10, 17) then dist = 50 -- днем else if in_time_interval(6, 21) then dist = 35 -- утром/вечером end if obj:position():distance_to(enemy:position()) > dist then return false end end end 1 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
mdm64 579 Опубликовано 29 Сентября 2020 Поделиться Опубликовано 29 Сентября 2020 @WinCap, А ведь на этот скрипт можно "прикрутить" совершенно уникальные условия для выполнения тех или иных квестов! И в частности, с фотографированием нужных объектов или НПС... Вот только нигде пока не нашёл аддона с фотиком, как в Фотографе... 1 Ссылка на комментарий
phalcor 60 Опубликовано 30 Сентября 2020 Поделиться Опубликовано 30 Сентября 2020 А возможно заспавнить физический объект? Например, деревянный ящик, такой, как рядом с Прапором? На котором магнитофон стоит. Делаю, как ниже. Рюкзак спавнится, а какую секцию указать для ящика? local a_pos = db.actor:position() local xpos=a_pos.x+2 local ypos=a_pos.y local zpos=a_pos.z local lv=db.actor:level_vertex_id() local gv=db.actor:game_vertex_id() local newOBJ=alife():create("inventory_box", xyz(xpos,ypos,zpos), lv,gv) Ссылка на комментарий
HellRatz 2 892 Опубликовано 30 Сентября 2020 Поделиться Опубликовано 30 Сентября 2020 53 минуты назад, phalcor сказал: а какую секцию указать для ящика? Нужно создать предмет (естественно не подбираемый, хотя можно и ящики собирать если нужно) с визуалом ящика, потом спавнить как любой предмет. Но все же советую делать такие вещи через СДК, подобные костыли — уровень 2007 года. 1 2 GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
phalcor 60 Опубликовано 30 Сентября 2020 Поделиться Опубликовано 30 Сентября 2020 @HellRatz, получается, что самый обычный деревянный ящик скриптом я заспавнить не смогу без создания своего предмета? Ссылка на комментарий
HellRatz 2 892 Опубликовано 30 Сентября 2020 Поделиться Опубликовано 30 Сентября 2020 2 минуты назад, phalcor сказал: обычный деревянный ящик скриптом я заспавнить не смогу Деревянный ящик — это зашитая в спавн секция динамического объекта с прописанным визуалом этого самого ящика. Соответственно — нет. Тебе нужно по аналогии создать в конфигах предмет с прописанным визуалом, и спавнить непосредственно предмет, а не модель. 1 GTA 3 MAP X-Ray | NFS U:2 MAP X-Ray | RTCW MAP X-Ray | L2D | Раритетные моды на моем облаке — на память о былом. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти