AndreySol 215 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 @Norman Eisenherz На каком движке работаете? Пример конфига покажите, чтоб понять как там вообще эта специализация прописана. Ссылка на комментарий
Firestarter 3 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 Доброго времени суток. Задался для чистого Сталкера:ЗП сделать так, чтобы у НПС после смерти в инвентаре можно было скоммуниздить броник, и он бы имел прочность, отличную от 100%, ну то есть был бы разброс. Скрытый текст Вначале, в файле character_desc_general.xml я добавил некоторым неписям эти самые броники(как пример): <!-- bandit novice --> <specific_character id="sim_default_bandit_0_default_0" team_default = "1"> <name>GENERATE_NAME_bandit</name> <icon>ui_inGame2_bandit_1</icon> <map_icon x="1" y="0"></map_icon> <bio>Опытный сталкер. Детальная информация отсутствует.</bio> <class>sim_default_bandit_0</class> <community>bandit</community> <terrain_sect>stalker_terrain</terrain_sect> <snd_config>characters_voice\human_01\bandit\</snd_config> <rank>20</rank> <reputation>0</reputation> <money min="250" max="1750" infinitive="0"/> <visual>actors\stalker_bandit\stalker_bandit_1</visual> <supplies> [spawn] \n novice_outfit \n wpn_bm16 \n ammo_12x70_buck = 1 \n wpn_pm \n ammo_9x18_fmj = 1 \n #include "gameplay\character_items_nd.xml" #include "gameplay\character_food.xml" #include "gameplay\character_drugs.xml" </supplies> После старта новой игры - сработало - бандиты стали делиться чёткими плащами. Вот что делать с их прочностью? Я хотел сделать как у оружия, для этого полез в death_manager.script: --printf("item name [%s]", item:name()) if isWeapon(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then set_weapon_drop_condition(item) return end --printf("item name [%s]", item:name()) if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then set_outfit_drop_condition(item) return end if xr_corpse_detection.lootable_table[section] == true and ammo_sections[section] == nil then return end alife():release(alife():object(item:id()), true) --[[ local item_id = item:id() local item_in_slot = npc:item_in_slot(2) if item_in_slot ~= nil and item_in_slot:id() == item_id then --' Тут надо уменьшить кондишн оружия item:set_condition((math.random(40)+40)/100) return end item_in_slot = npc:item_in_slot(3) if item_in_slot ~= nil and item_in_slot:id() == item_id then --' Тут надо уменьшить кондишн оружия item:set_condition((math.random(40)+40)/100) return end item_in_slot = npc:item_in_slot(7) if item_in_slot ~= nil and item_in_slot:id() == item_id then --' Тут надо уменьшить кондишн оружия item:set_condition((math.random(40)+40)/100) return end -- npc:mark_item_dropped(item) local item_in_slot = npc:item_in_slot(4) if item_in_slot ~= nil and item_in_slot:id() == item_id then return end if not npc:marked_dropped(item) then -- printf("releasing object ["..item:name().."]") alife():release(alife():object(item:id()), true) end ]] end function set_weapon_drop_condition(item) local condition = (math.random(40)+40)/100 --printf("condition [%s]", tostring(condition)) item:set_condition(condition) end function set_outfit_drop_condition(item) local condition = (math.random(40)+40)/100 --printf("condition [%s]", tostring(condition)) item:set_condition(condition) end Часть когда, который я дополнил. По порядку. Вначале я подумал, что хватит добавить для вычисления окончательной (посмертной) прочности брони добавлением её слота (в system.lts броня числится за 7 слотом): item_in_slot = npc:item_in_slot(7) if item_in_slot ~= nil and item_in_slot:id() == item_id then --' Тут надо уменьшить кондишн оружия item:set_condition((math.random(40)+40)/100) return end Ни рыба, ни мясо, ничего не изменилось. После, добавил следующее:function set_outfit_drop_condition(item) local condition = (math.random(40)+40)/100 --printf("condition [%s]", tostring(condition)) item:set_condition(condition) end Аналогично. Далее: --printf("item name [%s]", item:name()) if isOutfit(item) and not(get_clsid(item)==clsid.wpn_grenade_rgd5_s or get_clsid(item)==clsid.wpn_grenade_f1_s) then set_outfit_drop_condition(item) return end Вылет Line 748, движок не понимал, что такое isOutfit. Поисковиком нашёл некий файл _g.script: ------------------------------------------------------------------------------------------- local monster_classes = {} local stalker_classes = {} local weapon_classes = {} local artefact_classes = {}local outfit_classes = {} function IsMonster (object, class_id) local id = class_id or get_clsid(object) return monster_classes[id] == true end function IsStalker (object, class_id) local id = class_id or get_clsid(object) return stalker_classes[id] == true end function isWeapon(object, class_id) local id = class_id or get_clsid(object) return weapon_classes[id] == true end function isArtefact(object, class_id) local id = class_id or get_clsid(object) return artefact_classes[id] == true end function isOutfit(object, class_id) local id = class_id or get_clsid(object) return outfit_classes[id] == true end Добавление данных кусочков убрал вылет. То есть, я видимо, добавил эту функцию. Однако кондишн остался непреклонен. И тут я уже не знаю, что делать дальше, хотя есть чувство (мб ложное) что близок. Не подскажете, как завершить? И вообще, правильно я хоть начал? Поисковиком пользовался, видел, что не я один пытался выдать параметр прочности и её различность (правда, не броне), правда, ничерта толком и не понял. Помогите, пожалуйста. Ссылка на комментарий
Space.Marine 464 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 @Firestarter, а прописать броню в death_items_....ltx не проще ??? Ссылка на комментарий
Norman Eisenherz 302 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 @AndreySol ЧН 1.5.10, [configs\misc\technics_specialization.ltx]. В оригинале так: [mar_csky_tech] wpn_mp5 novice_outfit В моде так: Spoiler [mar_csky_tech] wpn_mp5 novice_outfit st_tech_pistols_ussr st_wpn_hpsa st_tech_shotguns st_tech_assault_all st_wpn_fn2000 st_wpn_groza st_wpn_rp tech_outfit_jackets stalker_outfit_name tech_outfit_csky Обработка измененной функцией из [scripts\inventory_upgrades.script]: Spoiler local gts = game.translate_string function get_technic_specialization(section) local ini = ini_file("misc\\technics_specialization.ltx") local sys_ini = system_ini() if ini:section_exist(section) then local str = game.translate_string("st_technic_specialization") local n = ini:line_count(section) local main = {} local other_wp = {} local other_am = {} for i = 0, n -1 do local temp1, id, temp2 = ini:r_line(section, i, "", "") if string.find(id, "^st_") then other_wp[#other_wp +1] = id elseif string.find(id, "_outfit_") then other_am[#other_am +1] = id else main[#main +1] = id end end if #main == 0 then -- только обычная прокачка str = str .. "\\n%c[default]" .. gts("st_technic_specialization_none") else table.sort(main) for i = 1, #main do str = str.."%c[default] \\n• "..gts(sys_ini:r_string(main[i], "inv_name")) end end table.sort(other_wp) -- сортировка, потом перевод table.sort(other_am) local other_st = {} for i = 1, #other_wp do other_st[i] = "• " .. gts(other_wp[i]) end for i = 1, #other_am do other_st[#other_wp + i] = "• " .. gts(other_am[i]) end local str_other = table.concat(other_st, "\\n") return str .. "\\n \\n%c[ui_4]" .. gts("st_technic_spec_other") .. "\\n%c[default]" .. str_other else return gts("st_technic_specialization") .. "\\n%c[default]" .. gts("st_technic_specialization_none") end end Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Firestarter 3 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 (изменено) 35 минут назад, Space.Marine сказал: @Firestarter, а прописать броню в death_items_....ltx не проще ??? @Space.Marine, Нет, не проще. Я как сам таким промышлял, так и видел наподобие моды. Потому что: 1)Нельзя будет точно указать, у кого что из сталкеров будет выпадать (например, есть несколько внешних видов бандитов, но в данном файле нельзя будет так расписать. Можно будет конкретно группировке Бандиты расписать, что у них будет выпадать броня, но, опять же, нельзя будет подвязать её к кому-либо конкретному; 2)И, возвращаясь к моему основному вопросу, в этом файле нельзя устанавливать рандомное значение прочности предмета, хотя бы потому, что данные файлы созданы для посмертного спавна всякой мелочёвки по типу - артов, амуниции, лекарств. Но никак не брони и оружия. Изменено 24 Августа 2020 пользователем Firestarter 1 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 24 Августа 2020 Поделиться Опубликовано 24 Августа 2020 4 часа назад, Firestarter сказал: local outfit_classes = {} @Firestarter, теперь надо в эту табличку добавить клсиды классов брони. Если она пустая, то isOutfit для любого предмета вернет false, и скрипт не найдет в луте нпс тех вещей, к которым надо применять set_outfit_drop_condition. 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. Ссылка на комментарий
AndreySol 215 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @Norman Eisenherz Непонятно, зачем Вам четкий порядок чтения строк из конфига, если есть точный признак для каждой группы предметов - "st_", "_outfit_" и остальное. Собирайте эти группы каждую в свою таблицу, а затем формируйте строку из этих таблиц в нужном порядке. 1 Ссылка на комментарий
Norman Eisenherz 302 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @AndreySol Ну ведь не это я спрашивал. Хочу сделать так, чтобы оружие было перечислено в порядке возрастания "полезности": пистолеты, ПП, дробовики, автоматы, снайперки. При этом не хочу вручную задавать алфавитный порядок через имена string_id. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @Norman Eisenherz Не все что нам хочется может движок. 1 Ссылка на комментарий
Norman Eisenherz 302 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @AndreySol Подозреваю, что как раз правками движка можно добиться нужного порядка чтения, а вот в обычных скриптах возможности ограничены… Разве что список с числовыми ключами в отдельном файле создавать, чтобы читать его по порядку. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Zander_driver 10 333 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 В движке порядок чтения конфигов и так есть, почитайте xr_ini.cpp Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
WinCap 314 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 (изменено) @Norman Eisenherz, в LUA-функции table.sort есть необязательный второй аргумент - функция сортировки: function functor_sort(a,b) return (a < b) end В ней можно реализовать любые условия сортировки. В самом "тупом" случае - сделать таблицу с ключами: Скрытый текст key_table = { ["st_tech_pistols_ussr"] = 1, ["st_wpn_hpsa"] = 2, ["st_tech_shotguns"] = 3, ["st_tech_assault_all"] = 4, ["st_wpn_fn2000"] = 5, ["st_wpn_groz"] = 6, ["st_wpn_rp tech_outfit_jackets"] = 7, ["stalker_outfit_name"] = 8, ["tech_outfit_csky"] = 9 } function functor_sort(a,b) return (key_table[a] < key_table[b]) end table.sort(main, functor_sort) Изменено 25 Августа 2020 пользователем WinCap 1 1 S.T.A.L.K.E.R. CoP Objects (upd 28.10.24) Ссылка на комментарий
AndreySol 215 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @WinCap Это не совсем то, что нужно вопрошавшему, точнее не до конца то.. @Norman Eisenherz Если уж так приперло, то вводить дополнительный ключ идентификации, типа "st_1", "_outfit_1", "st_2", "_outfit_2", ну и затем строить список в соответствии с номерами строк. А вообще это по нашему: поставить себе сомнительной полезности задачу, а затем героически ее решать. Лично мне кажется, что игрокам будет совсем наплевать в каком порядке будут перечисляться объекты в пределах группы. 1 Ссылка на комментарий
Zander_driver 10 333 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 Только что, AndreySol сказал: Это не совсем то, что нужно вопрошавшему, Если я таки верно понял вопрошавшего, ему хотелось "в правильном порядке" вывести определенные текстовые элементы. И во первых да, сложно придумать ситуацию где это было бы действительно важно, но допустим они бывают. А во вторых, для организации такого, существует 1001 способ на любой вкус, и метод предложенный @WinCap, ничем не хуже любого другого. Добиваться же выяснения номера строки в конфиге, для этой цели так же "нужно" как собаке пятая нога. Не говоря уж о том, что привязка вывода к номеру строки, если таки ее реализовать тем или иным способом, чревата проблемами в будущем при необходимости правки конфигов. Добавится потом какая-то новая строка в эту секцию - и вся "верстка" "поедет". 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. Ссылка на комментарий
_Sk8_AsTeR_ 117 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 Господа, а есть в двигле огср способ рандомизировать в диалоге НПС с ГГ скриптовые фразы? Именно скриптовые. В ванильке фразы меняются только после сейв/лоада Ссылка на комментарий
Firestarter 3 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 @Zander_driver, Большое спасибо!!! После такого количества времени, всё же - получилось. Скрытый текст Я вначале не особо понял, про какую табличку шла речь. Однако поиском local outfit_classes = {} в данном же файле как нашёл данную место, где должна была быть данная табличка, так и допёр, о чём шла речь. monster_classes = { [clsid.bloodsucker_s] = true, [clsid.boar_s] = true, [clsid.dog_s] = true, [clsid.flesh_s] = true, [clsid.pseudodog_s] = true, [clsid.burer_s] = true, -- [clsid.cat_s] = true, [clsid.chimera_s] = true, [clsid.controller_s] = true, -- [clsid.fracture_s] = true, [clsid.poltergeist_s] = true, [clsid.gigant_s] = true, -- [clsid.zombie_s] = true, [clsid.snork_s] = true, [clsid.tushkano_s] = true, [clsid.psy_dog_s] = true, [clsid.psy_dog_phantom_s] = true} stalker_classes = { [clsid.script_actor] = true, [clsid.script_stalker] = true} weapon_classes = { [clsid.wpn_vintorez_s] = true, [clsid.wpn_ak74_s] = true, [clsid.wpn_lr300_s] = true, [clsid.wpn_hpsa_s] = true, [clsid.wpn_pm_s] = true, [clsid.wpn_shotgun_s] = true, [clsid.wpn_auto_shotgun_s] = true, [clsid.wpn_bm16_s] = true, [clsid.wpn_svd_s] = true, [clsid.wpn_svu_s] = true, [clsid.wpn_rg6_s] = true, [clsid.wpn_rpg7_s] = true, [clsid.wpn_val_s] = true, [clsid.wpn_walther_s] = true, [clsid.wpn_usp45_s] = true, [clsid.wpn_groza_s] = true, [clsid.wpn_knife_s] = true, [clsid.wpn_grenade_f1_s] = true, [clsid.wpn_grenade_rgd5_s] = true, [clsid.wpn_grenade_launcher] = true, [clsid.wpn_grenade_fake] = true} artefact_classes = { [clsid.art_bast_artefact] = true, [clsid.art_black_drops] = true, [clsid.art_dummy] = true, [clsid.art_electric_ball] = true, [clsid.art_faded_ball] = true, [clsid.art_galantine] = true, [clsid.art_gravi] = true, [clsid.art_gravi_black] = true, [clsid.art_mercury_ball] = true, [clsid.art_needles] = true, [clsid.art_rusty_hair] = true, [clsid.art_thorn] = true, [clsid.art_zuda] = true, [clsid.artefact] = true, [clsid.artefact_s] = true} outfit_classes = { [clsid.equ_stalker_s] = true} Я с дуру просто добавил название брони, и получил вылет - я не глянул, что нужен именно класс. В файле outfit.ltx у всех броников единый класс - E_STLK, однако, и это добавление вызывало вылет. Поискав это слово Тотал Коммандером (Слава Тотал Коммандеру), откликнулся единственный файл - class_registrator.script, который как бы даёт расшифровку классам. Что интересно, броня почему-то названа... equ_stalker_s, "сталкер". Главное, строчкой ниже шлемы и названы шлемами. ну чёрт знает, "я разработчик, я так вижу". Вот его добавление и проба игрой наконец-то позволила реализовать разброс прочности брони... Оооооох. Ещё раз спасибо. Я так подробно расписываю, дабы себе сохранить + мб кому это пригодится (хотя, если мне уже посоветовали...значит, и так знают). Добавлено Опричник, 25 Августа 2020 Для "Спасибо" в каждом сообщении справа-внизу есть кнопки. (п.2.1.1. правил форума) 1 Ссылка на комментарий
Norman Eisenherz 302 Опубликовано 25 Августа 2020 Поделиться Опубликовано 25 Августа 2020 6 hours ago, Zander_driver said: привязка вывода к номеру строки, если таки ее реализовать тем или иным способом, чревата проблемами в будущем Не к номеру – к порядку. Пять строк, десять – главное, чтобы они были выведены в подсказку в том же порядке, в котором перечислены. Про вариант со списком и я сам упоминал. Что касается задач сомнительной полезности, то именно из решения таких задач я получаю больше всего информации. Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
AndreySol 215 Опубликовано 27 Августа 2020 Поделиться Опубликовано 27 Августа 2020 25.08.2020 в 23:39, Norman Eisenherz сказал: я получаю больше всего информации. Не вопрос, всем понятно, что чем сложнее задачу ты решил, тем больше опыта\удовлетворения поимел с этого. Но Вы попробуйте мне, как потенциальному игроку в Ваш мод, объяснить, в чем разница для меня, если я буду видеть список доступных улучшений у техника в "правильном порядке"? А вдруг у меня иное понимание важности\правильности этих улучшений? 3 3 2 Ссылка на комментарий
mdm64 579 Опубликовано 27 Августа 2020 Поделиться Опубликовано 27 Августа 2020 (изменено) Доброго времени! Вопрос - в ТЧ за ограничения по количеству одновременного спавна "живности" на локации отвечает файл se_respawn.script, а что отвечает за то же самое в ЗП? В некоторых модах на ЗП есть файл mod_params.ltx, в котором можно прописать много чего полезного. Но какие ещё файлы отвечают за количество и ограничения спавна? Изменено 27 Августа 2020 пользователем mdm64 Ссылка на комментарий
Это популярное сообщение. Painter 3 368 Опубликовано 27 Августа 2020 Это популярное сообщение. Поделиться Опубликовано 27 Августа 2020 (изменено) @mdm64, В ЗП респавн сталкеров/мутантов настраивается для каждого смарта по отдельности. Необходимые файлы расположены здесь: gamedata/configs/scripts/zaton/smart/ gamedata/configs/scripts/jupiter/smart/ gamedata/configs/scripts/pripyat/smart/ Основные параметры: max_population - максимальное количество сквадов, которое может принять данный смарт. Определяет для скольких симуляционных сквадов в смарте найдётся работа. spawn_squads - наименования сквадов, которые будут респавниться. spawn_num - количество сквадов, которое будет респавниться в данном смарте. Время респавна задаётся в файле smart_terrain.script параметром RESPAWN_IDLE. Изменено 27 Августа 2020 пользователем Jurok 1 4 Портфолио Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти