AndrewMor 527 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 (изменено) 9 часов назад, Zander_driver сказал: Были "псевдо-динамические", о которых все не-разбирающиеся глубоко в механике, думали что они динамические. Надо же, впервые узнал. Раньше тоже считал, что динамические. А кстати, в НС-2010 уже динамические были? Изменено 18 Июля 2020 пользователем AndrewMor Сталкер - наше всё! Ссылка на комментарий
Zander_driver 10 334 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 Я не копался в НС-2010, не знаю. О том что они в амк не сразу были полностью динамическими, я знаю из того факта что они были на переключаемой статике в моде "Жесть" образца 2008 - 2011 годов. А он в свою очередь был на основе как раз амк, и аномалии перенял оттуда. Но то была не последняя версия амк, из вышедших в готовом виде. 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. Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 @Kirgudu Движок пересобирать – уровень для меня недостижимый. Создать рестриктор на месте ГГ и каким-то образом его двигать (или переспавнивать с интервалом в пару секунд) – еще можно попробовать. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
mole venomous 3 429 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 В Новом Арсенале-6 есть авторазряжание дропнутого оружия. Я так понимаю, это делается средствами движка? Пробовал у себя подобное сделать скриптом, в результате на обновлении вообще всё, что у актора, разряжается... Здесь могла быть ваша реклама. Ссылка на комментарий
Space.Marine 466 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 14 минут назад, mole venomous сказал: авторазряжание дропнутого оружия Для ТЧ и ЗП 1 Ссылка на комментарий
Zander_driver 10 334 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 2 минуты назад, mole venomous сказал: Я так понимаю, это делается средствами движка? Нет, метод unload_magazine присутствует в ТЧ с исходно-бородатых времен. 3 минуты назад, mole venomous сказал: всё, что у актора, разряжается... Ну ведь разряжается? Значит, метод работает. А уж к чему вы его применяете, это другой вопрос. 2 часа назад, Norman Eisenherz сказал: переспавнивать с интервалом в пару секунд Рестриктор, находящийся в памяти нпс... ну да... Если удалить из игры рестриктор, находящийся в чьей-то памяти, то без правок движка будет вылет. Чтобы удалить его из чьей-то памяти, то без правок движка - надо этого кого-то уводить в оффлайн и ковырять его нетпакет. Это у вас все неписи на локе будут каждые пару сек в онлайн-оффлайн прыгать каких-только костылей не выдумают... 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. Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 @Zander_driver Рабочие методы кроме переноса функций движка из ЗП есть? Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 334 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 Только что, Norman Eisenherz сказал: кроме переноса функций движка из ЗП Есть. С нуля писать свое. Вообще-то как бы, если ковырнуть, что такое по сути рестриктор, и что ему надо для проверок коллизии с предполагаемыми путями нпс. Это ровно два метода, Center() и Radius(). А они есть у всех вообще объектов в игре... в движке. 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. Ссылка на комментарий
Norman Eisenherz 316 Опубликовано 18 Июля 2020 Поделиться Опубликовано 18 Июля 2020 (изменено) Здрасьте. [ЧН 1.5.10] Отсортировал список переходов в диалоге проводников по сюжетному порядку обхода локаций: у одних проводников список выводится в прямом порядке (Болота, Кордон, …), у других – в обратном (Военные склады, Рыжий лес, …). Чем можно объяснить такую разницу? Spoiler [scripts\guiders.script] (–) -- point_name for k,v in pairs(guiders_table.teleport_points) do phrase = dialog:AddPhrase("NO TEXT", k, "2", -10000) script = phrase:GetPhraseScript() script:AddPrecondition("guiders.precondition_teleport_to_point_available") script:SetScriptText("guiders.set_phrase_text") script:AddAction("guiders.select_point") -- ready? phrase = dialog:AddPhrase("st_tm_guide_21", "21", k, -10000) end (+) -- point_name local names = {} local gtp = guiders_table.teleport_points local levels = { "marsh", "escape", "garbage", "darkvalley", "agroprom", "yantar", "red_forest", "military" } for i = 1, #levels do for name, v in pairs(gtp) do if v.level == levels[i] then names[#names +1] = name end end end for k, name in ipairs(names) do phrase = dialog:AddPhrase("NO TEXT", name, "2", -10000) script = phrase:GetPhraseScript() script:AddPrecondition("guiders.precondition_teleport_to_point_available") script:SetScriptText("guiders.set_phrase_text") script:AddAction("guiders.select_point") -- ready? phrase = dialog:AddPhrase("st_tm_guide_21", "21", name, -10000) end Изменено 18 Июля 2020 пользователем Norman Eisenherz 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Shennondoah 130 Опубликовано 19 Июля 2020 Поделиться Опубликовано 19 Июля 2020 Ребята, как сделать так, чтобы доступ к тайнику был только при наличии предмета в инвентаре? (Лопата нужна, а тайник планирую квестовый в могилке) Оц тоц перевертоц, бабушка здорова, Оц тоц перевертоц кушает компот. Оц тоц перевертоц и мечтает снова Оц тоц перевертоц пережить налет! Ссылка на комментарий
dsh 3 824 Опубликовано 19 Июля 2020 Поделиться Опубликовано 19 Июля 2020 @Shennondoah, дай определение термину "доступ к тайнику". dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Это популярное сообщение. Painter 3 399 Опубликовано 19 Июля 2020 Это популярное сообщение. Поделиться Опубликовано 19 Июля 2020 @Shennondoah, если правильно понял задумку, реализовать можно примерно таким образом: [logic] active = ph_idle@not_item [ph_idle@not_item] nonscript_usable = false tips = st_tip_grave_1 on_info = {=actor_has_item(item)} ph_idle@has_item [ph_idle@has_item] nonscript_usable = false tips = st_tip_grave_2 on_info = {!actor_has_item(item)} ph_idle@not_item on_use = {=actor_has_item(item)} ph_idle@open [ph_idle@open] nonscript_usable = true tips = st_tip_grave_3 <string id="st_tip_grave_1"> <text>Необходим инструмент для раскопки</text> </string> <string id="st_tip_grave_2"> <text>Раскопать могилу</text> </string> <string id="st_tip_grave_3"> <text>Осмотреть могилу</text> </string> 3 7 Портфолио Ссылка на комментарий
UriZzz 1 004 Опубликовано 25 Июля 2020 Поделиться Опубликовано 25 Июля 2020 (изменено) 20.04.2020 в 12:00, naxac сказал: @UriZzz, это в нет-пакете, поле object_flags. Например (Скрыть) local obj = alife():create(...) local data = netpk:get(obj) data.object_flags = bit_and(data.object_flags, bit_not(128)) netpk:set(obj, data) Блин, не как не соображу - как это оформить? Вот так я сделал: Скрытый текст --' Ключем является группировка персонажа. Значением является таблица, содержашая имена секций предметов. local item_by_community = {} --' Множители и минимаксы для выпадения вещей в зависимости от уровня local mul_by_level = {} local count_by_level = {} --' Предметы, относящиеся к патронам. Их надо спаунить другим методом. local ammo_sections = {} local death_ini = ini_file("misc\\ph_box_generic.ltx") class "ph_item_box" function ph_item_box:__init(obj) self.obj = obj local community_list = { "def_box", "small_box_generic", "small_box_ussr", "small_box_nato", "small_box_army", "small_box_science", "big_box_generic", "big_box_dungeons", "big_box_arsenal"} for k,v in pairs(community_list) do --' Необходимо заполнить таблицу -- printf("pl: community = %s",v ) item_by_community[v] = {} if death_ini:section_exist(v) then local n = death_ini:line_count(v) local id, value = "", "" for i=0,n-1 do result, id, value = death_ini:r_line(v,i,"","") item_by_community[v][id] = 100*tonumber(value) -- printf("PL : id=%s value=%s",id, value) end end end --' Множители и минимаксы для выпадения вещей в зависимости от уровня local level_name = level.name() if not death_ini:section_exist(level_name) then level_name = "default" end local n = death_ini:line_count(level_name) local id, value = "", "" for i=0,n-1 do result, id, value = death_ini:r_line(level_name,i,"","") mul_by_level[id] = tonumber(value) end local item_count_section = "item_count_" .. level.get_game_difficulty() local n = death_ini:line_count(item_count_section) for i=0,n-1 do result, id, value = death_ini:r_line(item_count_section,i,"","") --' Нужно распарсить value в два значения local t = parse_nums(value) if t[1] == nil then abort("Error on [death_ini] declaration. Section [%s], line [%s]", item_count_section, tostring(id)) end local min = t[1] local max = t[2] if max == nil then max = min end if mul_by_level[id] == nil then mul_by_level[id] = 0 end min = tonumber(min) * mul_by_level[id] max = tonumber(max) * mul_by_level[id] count_by_level[id] = {min = min, max = max} end --' Предметы, относящиеся к патронам. Их надо спаунить другим методом. ammo_sections = {} local n = death_ini:line_count("ammo_sections") local id, value = "", "" for i=0,n-1 do result, id, value = death_ini:r_line("ammo_sections",i,"","") ammo_sections[id] = true end end function ph_item_box:spawn_items() local spawn_items = {} local ini = self.obj:spawn_ini() local community = utils.cfg_get_string(ini, "drop_box", "community", self.obj, false, "", "def_box") if r_items(ini, "drop_box", "items") ~= nil then local items = r_items(ini, "drop_box", "items") for k,v in pairs(items) do create_obligatory_items(self.obj, v.section, v.count) end return end printf(" community = %s", community) --' Доспавниваем необходимое количество итемов: --' Необходимо составить список объектов которые могут быть заспавнены для персонажа local spawn_items = item_by_community[community] --' Если комьюнити задана не верно, то ставим дефолт и срем в лог. if spawn_items == nil then printf("xr_box: wrong community -- %s setting default def_box ", community) local spawn_items = {} local spawn_items = item_by_community["def_box"] end for k,v in pairs(spawn_items) do --' По каждому объекту необходимо получить количество local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max)) --' Необходимо заспавнить нужное количество. create_items(self.obj, k, number, v) end end --' Функция спавнит необходимое число предметов function create_items(obj, section, number, rnd) printf("create %s of %s", tostring(number), tostring(section)) if ammo_sections[section] == true then if math.random(100) <= rnd then if number > 0 then local position = vector():set(0,0,0) position.x = obj:position().x + math.random(-30,30)/100 position.z = obj:position().z + math.random(-30,30)/100 position.y = obj:position().y + math.random(30,50)/100 se_respawn.create_ammo(section, position, obj:level_vertex_id(), obj:game_vertex_id(), 65535, number) end end else for i=1,number do --' Проверяем вероятность появить каждый объект в отдельности if math.random(100) <= rnd then local position = vector():set(0,0,0) position.x = obj:position().x + math.random(-30,30)/100 position.z = obj:position().z + math.random(-30,30)/100 position.y = obj:position().y + math.random(30,50)/100 local obj = alife():create(section, position, obj:level_vertex_id(), obj:game_vertex_id()) local pk = m_netpk.net_cse_alife_dynamic_object(obj) local data = pk:get(obj) data.object_flags = bit_and(data.object_flags, bit_not(128)) pk:set(obj, data) end end end end function parse_names( s ) local t = {} for name in string.gfind( s, "([%w_%-.\\]+)%p*" ) do table.insert( t, name ) end return t end function r_items( spawn_ini, section, line) if spawn_ini:line_exist( section, line ) then --' если default-ов больше, чем значений в ini, то забить недостающие последним значением из ini local t = parse_names( spawn_ini:r_string( section, line ) ) local n = table.getn( t ) local ret_table = {} local k = 1 while k <= n do local item = {} item.section = t[k] -- Проверяем что это не последняя запись if t[k+1] ~= nil then local p = tonumber(t[k+1]) -- проверяем что вторым числом задана вероятность, а не другая секция спавну if p then -- забиваем число item.count = p k = k + 2 else -- забиваем дефолт 1 item.count = 1 k = k + 1 end else item.count = 1 k = k + 1 end table.insert(ret_table, item) end return ret_table end return nil end function create_obligatory_items(obj, item , count) for i = 1,count do local position = vector():set(0,0,0) position.x = obj:position().x + math.random(-30,30)/100 position.z = obj:position().z + math.random(-30,30)/100 position.y = obj:position().y + math.random(30,50)/100 local obj = alife():create(item, position, obj:level_vertex_id(), obj:game_vertex_id()) local pk = m_netpk.net_cse_alife_dynamic_object(obj) local data = pk:get(obj) data.object_flags = bit_and(data.object_flags, bit_not(128)) pk:set(obj, data) end end Итемы просто не спавнятся при разбитии ящика, чаднт? упд. Мне кажется я не правильно с пакетами работаю. упд2. Кажется я уловил структуру нэт пакета, но итемы, при разбитии ящика, всё равно не спавнятся Изменено 25 Июля 2020 пользователем UriZzz Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
Stalkersof 183 Опубликовано 26 Июля 2020 Поделиться Опубликовано 26 Июля 2020 А можно как-то скриптом задать логику для двери или задействовать файл логики. Не хочется мне алл.спавн ковырять. Я все практически скриптами сделал. Остались двери на локации Центр Управления Монолитом. Может есть способ скриптом назначить им другую логику, а то у этих дверей в алл.спавне логика. name = mon_door_from_monolith_control_0000 Freeplay Graphic Mod(FGM) Ссылка на комментарий
Zander_driver 10 334 Опубликовано 26 Июля 2020 Поделиться Опубликовано 26 Июля 2020 1 час назад, Stalkersof сказал: Может есть способ скриптом назначить им другую логику Назначение логики записано в кастом-дате. А ее можно изменять через нетпакет, или движковыми методами если движок модифицирован. Через нетпакет == скриптами. Что и требовалось. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
Шипэтя 0 Опубликовано 27 Июля 2020 Поделиться Опубликовано 27 Июля 2020 Какой файл отвечает за рандомные звуки на локация, там случайный крик и т.д Ссылка на комментарий
UriZzz 1 004 Опубликовано 27 Июля 2020 Поделиться Опубликовано 27 Июля 2020 (изменено) @Шипэтя, gamedata/config/weathers/env_ambient.ltx Изменено 27 Июля 2020 пользователем UriZzz 1 Моя нычка, Нычка в арендованном у Опричника холодильнике Мы хорошие ребята, жаль патронов маловато:) Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 27 Июля 2020 Поделиться Опубликовано 27 Июля 2020 Доброй ночи! Прошу помощи. Скрипт не проходит дальше отметки (спойлер) и нпс не воспроизводит звук. В чем может быть дело? Скрытый текст function set_sound_play(npc_id,sound,cb_func) -- rx_ai.printf("SET_SOUND_PLAY. theme[%s] object[%s]", tostring(sound), npc_id) local snd_theme = theme[sound] if not snd_theme then amk.send_tip("Ошибка в теме", "ахтунг", 1, 15, "death") return end if sound_table[npc_id] == nil then amk.send_tip(tostring(sound), npc_id, 1, 15, "death") -- отметку проходим, тип приходит с названием темы и ИД НПС, все ок if snd_theme:play(npc_id) then -- ОТМЕТКА!!! ТУТ ЗАТЫК. Это условие не проходится, нпс не проигрывает звук!!! amk.send_tip("тест", "тест", 1, 15, "death") snd_theme.npc[npc_id].cb = cb_func sound_table[npc_id] = snd_theme return true end else amk.send_tip("Не проигрываю т.к. уже что-то играю?", "ахтунг", 1, 15, "death") end end Пытаюсь проиграть вот так: rx_sound.set_sound_play(selected_id,"help_thanks") Ссылка на комментарий
abramcumner 1 157 Опубликовано 28 Июля 2020 Поделиться Опубликовано 28 Июля 2020 9 часов назад, _Sk8_AsTeR_ сказал: if snd_theme:play(npc_id) then -- ОТМЕТКА!!! ТУТ ЗАТЫК. Это условие не проходится, нпс не проигрывает звук!!! А snd_theme:play точно что-нибудь возвращает? А то может он ничего не возвращает, ну и if nil then естественно не срабатывает. 1 1 Ссылка на комментарий
Шипэтя 0 Опубликовано 28 Июля 2020 Поделиться Опубликовано 28 Июля 2020 Ребята что отвечает за перенос объектов трупы ящики, как сделать его корректным как в народной солянке 2016 на Ogsr двигле Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти