Kirgudu 1 207 Опубликовано 10 Января 2022 Поделиться Опубликовано 10 Января 2022 (изменено) 25 минут назад, INNOCENT KILLAZ сказал: они одноразовые или нет Нет, конечно. Это точки постоянного (на протяжении игры) периодического (раз в какое-то время) спавна в указанной точке указанной группы монстров с контролем максимальной численности. 25 минут назад, INNOCENT KILLAZ сказал: что дает "fake" См. в функции ogsm_packet.spawn_monster. В зависимости от значения в этом параметре ("fake"/"random_fake"/прочее) монстру назначается та или иная кастомная логика поведения. На будущее, подобные вопросы больше подходят для одной из тем "Ковыряемся в файлах" (в данном случае, я так подозреваю, вариация для ЧН). Изменено 10 Января 2022 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
INNOCENT KILLAZ 2 Опубликовано 10 Января 2022 Поделиться Опубликовано 10 Января 2022 @Kirgudu Спасибо. 9 минут назад, Kirgudu сказал: на протяжении игры Значит и фриплей? Ссылка на комментарий
Kirgudu 1 207 Опубликовано 11 Января 2022 Поделиться Опубликовано 11 Января 2022 (изменено) @INNOCENT KILLAZ да, фриплей тут ничем концептуально не отличается. Однако набор и наполнение точек могут меняться на разных стадиях игры, в том числе при наступлении фриплея - см. для подробностей код модуля ogsm_respawn. Там есть проверки по выданным инфопорциям и в зависимости от этого разные наборы спавна. Изменено 11 Января 2022 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
phalcor 60 Опубликовано 12 Января 2022 Поделиться Опубликовано 12 Января 2022 Ребята, а есть ли возможность из скрипта узнать расстояние до цели в направлении взгляда? Направление взгляда ГГ - это легко: db.actor:direction() или screen.cam_dir, а вот расстояние до точки, куда этот взгляд "упирается"? Ссылка на комментарий
Zander_driver 10 333 Опубликовано 12 Января 2022 Поделиться Опубликовано 12 Января 2022 31 минуту назад, phalcor сказал: из скрипта узнать расстояние до цели в направлении взгляда? В OGSR есть функция level.get_target_dist https://github.com/OGSR/OGSR-Engine/blob/f940dc5f5b1e4fe72f268fec636e16133f47ef51/ogsr_engine/xrGame/level_script.cpp#L1107 А в ванильном движке насколько помню, нет такой возможности. 1 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. Ссылка на комментарий
Купер 2 845 Опубликовано 12 Января 2022 Поделиться Опубликовано 12 Января 2022 @phalcor , готовое решение "на раздербанивание". Платформа X-Ray Extensions. Ссылка на комментарий
Colder 12 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 Создал ремкомплект и возникла такая проблема. При появление 2-х одинаковых(сломаных) оружия у ГГ в списке появляеться вот это https://disk.yandex.ru/i/yPsc0Q9N-FsBBQ Можно это как то решить? Вот сам лист Скрытый текст function UIrepair:FillList() item_table = 0 item_table = {} item_table_index = 0 local function fill_list(actor,item) local main_section = system_ini():r_string_ex(item:section(),"repair_type") or item:section() if main_section then if (self.repair_type == "weapon" and IsWeapon(item)) or (self.repair_type == "knife" and IsKnife(item)) or (self.repair_type == "pistol" and IsPistol(item)) or (self.repair_type == "shotgun" and IsShotgun(item)) or (self.repair_type == "riflight" and IsRlight(item)) or (self.repair_type == "rifheavy" and IsRheavy(item)) or (self.repair_type == "outfit" and IsOutfit(item)) or (self.repair_type == "outlight" and IsOutlight(item)) or (self.repair_type == "outheavy" and IsOutheavy(item)) or (self.repair_type == "outexo" and IsOutexo(item)) or (self.repair_type == "all" and (IsWeapon(item) or IsOutfit(item) or IsKnife(item) or IsPistol(item) or IsShotgun(item) or IsRlight(item) or IsRheavy(item) or IsOutfit(item) or IsOutlight(item) or IsOutheavy(item) or IsOutexo(item))) then local con = item:condition() if con < self.max_condition and con >= self.min_condition then item_table_index = item_table_index + 1 item_table[item_table_index] = item local item_in_slot_1 = db.actor:item_in_slot(1) and db.actor:item_in_slot(1):id() or false local item_in_slot_2 = db.actor:item_in_slot(2) and db.actor:item_in_slot(2):id() or false local item_in_slot_4 = db.actor:item_in_slot(4) and db.actor:item_in_slot(4):id() or false local item_in_slot_6 = db.actor:item_in_slot(6) and db.actor:item_in_slot(6):id() or false local i = 1 while (item_table) do local s_item = item_table local s_item_section = s_item:section() local _item_num = "" .. i .. "" local _item_name = gts(axr_base.get_inv_name_short(s_item_section)) if string.len(_item_name)>25 then _item_name = string.sub(_item_name,1,23).."..." end if s_item:id() == item_in_slot_1 or s_item:id() == item_in_slot_2 or s_item:id() == item_in_slot_4 then _item_name = _item_name.." (в руках)" elseif s_item:id() == item_in_slot_6 then _item_name = _item_name.." (одет)" end local _item_cond = s_item:condition() if _item_cond then _item_cond = math.floor((_item_cond)*100) end _item_cond = "[" .. _item_cond .. "%]" self:AddItemToList(_item_num, _item_name, _item_cond) i = i+1 end end end end end db.actor:iterate_inventory(fill_list,db.actor) end Ссылка на комментарий
ted.80 251 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 @Colder попробуй заменить if s_item:id() == item_in_slot_1 or s_item:id() == item_in_slot_2 or s_item:id() == item_in_slot_4 then _item_name = _item_name.." (в руках)" elseif s_item:id() == item_in_slot_6 then _item_name = _item_name.." (одет)" end на local iis = item_in_slot_1 or item_in_slot_2 or item_in_slot_4 if s_item:id() == iis then _item_name = _item_name.." (в руках)" elseif s_item:id() == item_in_slot_6 then _item_name = _item_name.." (одет)" end Личный АРХИВ по S.T.A.L.K.E.R Ссылка на комментарий
Colder 12 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 Не помогло. Тоже самое. Ссылка на комментарий
AndreySol 215 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 @Colder Что случилось, глобально? Ссылка на комментарий
Colder 12 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 Проверял на работоспособность ремнабор и при тесте увидел что если у гг есть 2 одинаковых сломанных оружия, то в листе появляется дублированый итем. Но когда в инвентаре одно оружие все нормально. Значит дело в Fillist() т.к кроме открыть ремнабор я ни каких действий не делал. Ссылка на комментарий
WinCap 316 Опубликовано 2 Февраля 2022 Поделиться Опубликовано 2 Февраля 2022 3 часа назад, Colder сказал: возникла такая проблема Дело в том, что таблица item_table не очищается после добавления оружия в List. Скрипт вообще написан не правильно. Внутри db.actor:iterate_inventory() нужно только заполнять таблицу item_table, а выводить её содержимое в List нужно после неё. 1 1 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
Colder 12 Опубликовано 4 Февраля 2022 Поделиться Опубликовано 4 Февраля 2022 Возможно ли с помощью этой функции парсить не 1 строчку а несколько? Скрытый текст function parse_list() local ini = ini_file("items\\settings\\items_list.ltx") if not ini then ini = system_ini() end if ini:section_exist("generic_list") then local n = ini:line_count("generic_list") local key = math.random(0,n-1) local result, item, num = ini:r_line("generic_list",key,"","") alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) return item, num end end Ссылка на комментарий
Kirgudu 1 207 Опубликовано 5 Февраля 2022 Поделиться Опубликовано 5 Февраля 2022 (изменено) @Colder конечно, если вместо случайной выборки одной строки воспользоваться, например, циклом и вернуть по итогу таблицу (не забыть обработать её на выходе отличным от пары значений образом): Скрытый текст --local key = math.random(0,n-1) --local result, item, num = ini:r_line("generic_list",key,"","") --alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) --return item, num local t = {} for key = 0,n-1 do local result, item, num = ini:r_line("generic_list",key,"","") alife():create(item, db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) table.insert(t, { item = item, num = num }) end return t Так будут обработаны все строки из generic_list. При желании сюда же можно прикрутить случайную выборку нескольких строк и так далее. Простор для творчества не ограничен. Изменено 5 Февраля 2022 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
mole venomous 3 394 Опубликовано 7 Февраля 2022 Поделиться Опубликовано 7 Февраля 2022 Что-то заклинило у меня. Лыжи не едут или у костра перебрал... При заходе в рестриктор пытаюсь заспавнить рандомный итем по указанным координатам, получаю вылет. Начинается ругань на xr_logic.pick_section_from_condlist, потом на sr_idle, bind_restrictor... Приводить все коды не стал, т.к. всё равно никто не станет распутывать (да и лучше самому, только бы пинок в нужном направлении был задан). Есть подозрение, что всё из-за попытки рандомного спауна при вызове ф-ии, когда ГГ входит в рестрикт. Но... Но рандомный спаун без проблем работает, когда указываю координаты, исходя из координат ГГ: Скрытый текст local lv,gv local a=vector() a=db.actor:position() a.x=a.x+pX a.z=a.z+pZ a.y=a.y+pY lv=db.actor:level_vertex_id() gv=db.actor:game_vertex_id() alife():create(item,vector():set(a.x,a.y,a.z),lv,gv,65535) Движок ОГСР. Здесь могла быть ваша реклама. Ссылка на комментарий
naxac 2 445 Опубликовано 8 Февраля 2022 Поделиться Опубликовано 8 Февраля 2022 @mole venomous , а вылетающий спавн как выглядит? 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
mole venomous 3 394 Опубликовано 8 Февраля 2022 Поделиться Опубликовано 8 Февраля 2022 4 часа назад, naxac сказал: как выглядит? Скрытый текст Ну конечно же! Список итемов есть, а "зарандомить" я его забыл. local rnd = {"af_medusa","af_vyvert","af_blood"} local art = rnd[math.random(#rnd)] Причём для работающего спавна я этого сделать не забыл, а для "неработающего" - забыл. Добрая половина моих ошибок это невнимательность... Несколько часов голову ломал 1 Здесь могла быть ваша реклама. Ссылка на комментарий
Котовод 106 Опубликовано 8 Февраля 2022 Поделиться Опубликовано 8 Февраля 2022 Ребята, есть какой-то способ принудительного обновления диалогов такого типа? В НЛС они формируются при первой загрузке сейва, что мне не подходит... <dialog id="vergas_repair_dialog" priority="-1"> <precondition>dialogs.is_not_wounded</precondition> <init_func>sak_dialog.vergas_repair_dlg</init_func> </dialog> Скрытый текст local vergas_tbl = {} local vergas_bad_tbl = {} function generate_vergas_tbl() local items = get_shadow_inv():get_content( true ) for i, rec in items:ipairs() do local sect = sak_inventory.dyn_art_base( rec.sect ) if ( ( rec.obj:is_weapon() and rec.obj:condition() >= 0.65 and rec.obj:condition() < 1 and not ( str_in_tab( sect, { "wpn_binoc", "wpn_knife", "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1" } ) ) ) or ( rec.obj:is_outfit() and rec.obj:condition() >= 0.59 and rec.obj:condition() < 1 and not ( str_in_tab( sect, { "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) ) ) ) then local cfg = this.repair_config[ r_vergas ] if not cfg then wprintf( "[~T].~C0C #ERROR(uniform_repair_cost):~C07 not specified configuration for repairer~C0A %s~C07", r_vergas ) misc.dump_table( this.repair_config ) return end local item_repair_cost = this.calc_repair_cost( rec.obj, this.get_margin( r_vergas ) ) local time_need_repair = this.uniform_time_repair( item_repair_cost, rec.obj:cost(), cfg.price_coefs, cfg.time_repair ) local time_rep = this.time_desc( time_need_repair ) local cost_phrase = "list_trader_repair_" .. lua_random( 1, 7 ) local text = translate( cost_phrase ) .. " %c[255,238,155,23]" .. item_repair_cost .. " %c[255,216,186,140]рублей. " .. time_rep .." ".. translate( "list_time_repair_2" ) table.insert( vergas_tbl, { obj = rec.obj:id(), sect = sect, cost = item_repair_cost, time_need = time_need_repair, text = text } ) -- misc.dump_table( vergas_tbl ) elseif ( ( rec.obj:is_weapon() and rec.obj:condition() < 0.65 ) or ( rec.obj:is_outfit() and rec.obj:condition() < 0.59 ) ) or str_in_tab( sect, { "wpn_flame", "wpn_rpg7", "wpn_pkm", "wpn_gm94", "wpn_ak74_m1", "_q_", "bandit_veteran_", "bandit_master_", "exo" } ) then table.insert( vergas_bad_tbl, sect ) misc.dump_table( vergas_bad_tbl ) end end end function show_not_available() if #vergas_bad_tbl < 1 then return end local text = "" local colour = "%c[ 255, 255, 255, 255 ]" for kk, vv in pairs( vergas_bad_tbl ) do if kotovod.have_selected_item( vv, 1 ) then text = text .. " • " .. colour .. get_inv_name( vv ) .. "\\n" .. "%c[default]" end end local last = "Так-с, ну... В общем, могу подлатать всё, кроме этих экземпляров: \\n" .. text .. "" db.actor:give_talk_message( last, "ui\\ui_iconsTotal", Frect():set( 0, 0, 0, 0), "simple_answer_item" ) vergas_bad_tbl = {} end function vergas_repair_items( dlg ) local phr = task_manager.Dlg_AddPhrase( dlg, "Здравствуй, не мог бы ты подсобить с ремонтом?", "0", "", -10000 ) local phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "sak_dialog.generate_vergas_tbl" ) phr = task_manager.Dlg_AddPhrase( dlg, "Давай посмотрим, что там у тебя.", "1", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddDontHasInfo( "vergas_repair_starting" ) phrase_script:AddPrecondition( "sak_dialog.klava_done()" ) phrase_script:AddAction( "sak_dialog.show_not_available" ) for k, v in pairs( vergas_tbl ) do -- Наличие и название предмета phr = task_manager.Dlg_AddPhrase( dlg, "".. get_inv_name ( v.sect ) ..".", k + 1, "1", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "kotovod.have_selected_item( \"".. v.sect .."\", 1 )" ) -- Цена составит phr = task_manager.Dlg_AddPhrase( dlg, v.text, k + 100, k + 1, -10000 ) phrase_script = phr:GetPhraseScript() -- Согласен phr = task_manager.Dlg_AddPhrase( dlg, "Хорошо, я согласен. Вот деньги.", k + 1000, k + 100, -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "sak_dialog.money_have( ".. v.cost .." )" ) phrase_script:AddAction( "sak_dialog.relocate_money( ".. v.cost ..", 'out' )" ) phrase_script:AddAction( "sak_dialog.vergas_repair_start( ".. v.time_need ..", \"".. v.sect .."\", ".. v.obj .." )" ) -- Отказ phr = task_manager.Dlg_AddPhrase( dlg, "Может в другой раз...", k + 2000, k + 100, -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) end phr = task_manager.Dlg_AddPhrase( dlg, "Я немного занят. Ты лучше попозже загляни...", "200", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddHasInfo( "vergas_repair_starting" ) phrase_script:AddPrecondition( "sak_dialog.klava_done()" ) phr = task_manager.Dlg_AddPhrase( dlg, "Позже, так позже...", "201", "200", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) phr = task_manager.Dlg_AddPhrase( dlg, "А мне вроде кто-то обещал за блокнот починенный что-то? Слово держать нужно.", "300", "0", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddPrecondition( "sak_dialog.not_klava_done()" ) phr = task_manager.Dlg_AddPhrase( dlg, "Ну ладно, будет тебе \"что-то\".", "301", "300", -10000 ) phrase_script = phr:GetPhraseScript() phrase_script:AddAction( "dialogs.break_dialog" ) end function vergas_repair_start( time_need, sect, obj ) -- log2( "time_need is %s, sect is %s, obj is %s", tostring( time_need ), tostring( sect ), tostring( obj ) ) local cfg = this.repair_config[ r_vergas ] if cfg.info_start then db.actor:give_info_portion( cfg.info_start ) end if t_repair[ r_vergas ] == nil then t_repair[ r_vergas ] = {} end sak.relocate_item( "out", sect, 1 ) t_repair[ r_vergas ].time_need = time_need t_repair[ r_vergas ].time_end = misc.game_time_minutes() + time_need t_repair[ r_vergas ].section = sect local obj = client_obj( obj ) if obj:is_outfit() then misc.release_obj( obj ) else kotovod.release_addons_new( obj, sect, obj ) misc.release_obj( obj ) end end function vergas_repair_dlg( dlg ) vergas_repair_items( dlg ) end Ссылка на комментарий
Zander_driver 10 333 Опубликовано 9 Февраля 2022 Поделиться Опубликовано 9 Февраля 2022 08.02.2022 в 11:22, Котовод сказал: Ребята, есть какой-то способ принудительного обновления диалогов такого типа? Есть. Называется - движок OGSR. Читать вики. 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. Ссылка на комментарий
SpyFox_007 18 Опубликовано 10 Февраля 2022 Поделиться Опубликовано 10 Февраля 2022 Здравствуйте, у меня вопрос: можно ли динамически, через скрипт изменять "fire_wound_immunity" у "actor". Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти