losiara 13 Опубликовано 5 Декабря 2016 Поделиться Опубликовано 5 Декабря 2016 Добрый день господа программисты!!! Прошу помощи вот по какому вопросу. Имеется мысль "сдружить" два класса представленных в игре монстров и НПС, а конкретно зомби гражданского и зомбированного сталкера "zombie" и "zombied" соответственно. Сделать это путем редактирования конфиг-файла "game_relations.ltx" не представляется возможным т. к такая возможность там попросту не предусмотрена. Подружить либо рассорить всех и вся можно только с ГГ, а необходимо именно с вышеописанными неписями при этом с ГГ они должны по прежнему оставаться врагами. Покопавшись в файле "xr_effects.script" я обнаружил там две стандартные функции: function set_friends(actor, npc, p) local npc1for i, v in pairs(p) donpc1 = level_object_by_sid(v)if npc1 and npc1:alive() then--printf("_bp: %d:set_friends(%d)", npc:id(), npc1:id())npc:set_relation(game_object.friend, npc1)npc1:set_relation(game_object.friend, npc)endendendfunction set_enemies(actor, npc, p)local npc1for i, v in pairs(p) do--printf("_bp: set_enemies(%d)", v)npc1 = level_object_by_sid(v)if npc1 and npc1:alive() thennpc:set_relation(game_object.enemy, npc1)npc1:set_relation(game_object.enemy, npc)endendend Однако если я правильно понял, то во-первых для их реализации необходимо присвоить всем участникам сценки SIDы (не так уж принципиально). Во-вторых работают ли они на монстрах??? В-третьих отношение ГГ к ним также будет меняться положительное или нет, мне надобно что бы они остались врагами для актора и друзьями между собой. Предполагаю использовать сии наработки через логику, хотя если это невозможно, то можно и по старинке с активацией через диалог либо другую функцию например... Вот собственно суть проблемы, кто знает подскажите пожалуйста!!! Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
naxac 2 447 Опубликовано 5 Декабря 2016 Поделиться Опубликовано 5 Декабря 2016 (изменено) @losiara, если тебе нужно помирить их только на время одной сцены, то используй оверрайды в логике (combat_ignore и т.п.). Или можно зомбированным сталкерам сделать отдельную секцию, в которой прописать в species вместо human - zombie. Изменено 5 Декабря 2016 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
losiara 13 Опубликовано 5 Декабря 2016 Поделиться Опубликовано 5 Декабря 2016 naxac да, на одну сцену, но можно ли использовать "combat_ignore" в логике монстров, она работает??? Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
UnLoaded 313 Опубликовано 5 Декабря 2016 Поделиться Опубликовано 5 Декабря 2016 @losiara Для монстров есть оверрайды: actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.braindead = true/false - если true, то монстр игнорирует любые атаки. 1 1 Ссылка на комментарий
losiara 13 Опубликовано 5 Декабря 2016 Поделиться Опубликовано 5 Декабря 2016 Спасибо я знаю, потому и уточнил работают ли для монстров секции типа "combat_ignore", а имеющиеся указанные тобою в посте не подходят для моей задумки. "combat_ignore" вполне бы подошла... Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
losiara 13 Опубликовано 6 Декабря 2016 Поделиться Опубликовано 6 Декабря 2016 Отвечаю на свой же предыдущий вопрос. Просматривая статьи по логике мы видим, что действительно секция [combat_ignore] рекомендована как бы только для сталкеров (НПС), по крайней мере никаких пояснений относительно использования ее у монстров в статьях нет, для монстров же разработчиками были придуманы так называемые оверрайды: actor_friendly = true/false - если true, то монстр не атакует актера, до первой атаки на него.npc_friendly = true/false - если true, то монстр не атакует сталкеров и монстров, до первой атаки на него.friendly = true/false - если true, то монстр не атакует никого до первой атаки на него.braindead = true/false - если true, то монстр игнорирует любые атаки. Однако они весьма однобоки и неразнообразны, поэтому я в тестовом режиме прописал двум игровым классам в логику секцию [combat_ignore] следующим образом: Для зомби гражданского:[smart_terrains]none = true[logic]active = mob_remark@holdcombat_ignore = combat_ignore[mob_remark@hold]anim = stand_idle_0time = 50000combat_ignore_cond = true[combat_ignore]Для зомбированного сталкера (класс НПС)[smart_terrains]none = true[logic]active = remarkcombat_ignore = combat_ignore[remark]target = actoranim = probe_1combat_ignore_cond = true[combat_ignore] На выходе стоят два красавца и друг к другу абсолютно равнодушны, что и требовалось собственно для сценки. Правда конечно это был тестовый режим поэтому я прописал по быстрому им РЕМАРК дабы не ковырять all.spawn и не создавать пути. Потребуется присвоить им SIDы и задать игнорирование боя только в отношении друг друга, но это уже детали. Получается что вопрос решаем только лишь стандартными средствами данными нам разработчиками. Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
losiara 13 Опубликовано 14 Декабря 2016 Поделиться Опубликовано 14 Декабря 2016 Доброго дня господа!!! Вот хотел посоветоваться. В процессе создания и собственно даже тестирования своего детища, при переходе на другую локацию стал возникать вылет следующего содержания: Expression : no_assertFunction : CALifeStoryRegistry::addFile : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cppLine : 30Description : Specified story object is already in the Story registry! Ну я конечно же бросился перепроверять своих SID-овских НПС, монстров и др. но как вы понимаете никаких дубликатов и повторных спавнов не обнаружил. Пришлось переверстывать весь мод весом 354мг, понятное дело я западозрил скрипты и нашел одну вещь которую предположительно и считаю виновником сией проблемы. Это универсальная функция дающая возможность повторного спавна чего (кого) либо на локации, привожу ее: function list_new_funcs()--this.level_active()this.level_active_c()this.level_active_a()--this.level_active_b()--this.level_active_d()endfunction level_active()if not has_alife_info('level_active') and level.name() == "l01_escape" thenmonsters_spawn.bloodsucker_esc()monsters_spawn.esc_zombie_1()db.actor:give_info_portion('level_active')elseif has_alife_info('level_active') and level.name() ~= "l01_escape" thendb.actor:disable_info_portion ('level_active')endendfunction level_active_c()if not has_alife_info('level_active_c') and level.name() == "l03_agroprom" thenrandom_spawn.random_spawn_agr_dog()db.actor:give_info_portion('level_active_c')elseif has_alife_info('level_active_c') and level.name() ~= "l03_agroprom" thendb.actor:disable_info_portion ('level_active_c')endendfunction level_active_a()if not has_alife_info('level_active_a') and level.name() == "l04_darkvalley" then--random_spawn.random_spawn_td_krovosos()--random_spawn.random_spawn_dar_bandit1()db.actor:give_info_portion('level_active_a')elseif has_alife_info('level_active_a') and level.name() ~= "l04_darkvalley" thendb.actor:disable_info_portion ('level_active_a')endendfunction level_active_b()if not has_alife_info('level_active_b') and level.name() == "l06_rostok" thennpc_spawn.rostok_killer()npc_spawn.ros_ecolog()db.actor:give_info_portion('level_active_b')elseif has_alife_info('level_active_b') and level.name() ~= "l06_rostok" thendb.actor:disable_info_portion ('level_active_b')endendfunction level_active_d()if not has_alife_info('level_active_d') and level.name() == "l12_stancia_2" thenmonsters_spawn.aes_zombie()npc_spawn.stalker_zombied_aes2_2()--actor_spawn_items.main_spawn2()db.actor:give_info_portion('level_active_d')elseif has_alife_info('level_active_d') and level.name() ~= "l12_stancia_2" thendb.actor:disable_info_portion ('level_active_d')endend На комментарии не обращайте внимания это я тестил... Соот. создаются инфопоршни и активируется через биндер актора. Ну все бы ничего она работает, но при ПОВТОРНОМ заходе на локу где обозначен спавн чего нибудь происходит этот надоедливый вылет. Вот собственно можно ли как то это поправить (если дело все таки в этом коде, ну может по типу: проверки какой нибудь... если НПС были убиенны кем нибудь, то спавнить, в противном случае не спавнить...) как то так теоретически или как нибудь еще просто ничего более не приходит на ум. Возможно дело вообще не в этом, а глючит какой то другой скрипт (но здесь я тестил и без этого кода вроде все работает), Либо вообще отказаться от сего замечательного изменения и выбросить скрипт (что крайне не желательно)... Благодарю за внимание!!! Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
BeTep366 9 Опубликовано 14 Декабря 2016 Поделиться Опубликовано 14 Декабря 2016 Хочу сделать вызов карты через предмет и назначить карте особую текстуру.. Можно ли это сделать без движка? Ссылка на комментарий
MegaStalker 66 Опубликовано 14 Декабря 2016 Поделиться Опубликовано 14 Декабря 2016 (изменено) Срочно нужна помощь! Как можно уменьшить нагрузку от аномалий в ЗП? Многие люди говорят, что из-за огромного количества аномалий на локациях ЗП бывают лаги при включении урона неписям от аномалий. Вот я и хочу поправить данный глюк, ибо нормальную симуляцию хочу - без поблажек неписям. Второй вопрос - можно ли в ЧН отредактировать что-то, чтобы заставить неписей во время выброса прятаться по укрытиям или получать урон?а то пофигисты какие-то все, кроме ГГ... Изменено 14 Декабря 2016 пользователем MegaStalker Все зовут меня Пришедший из Ниоткуда...Почему?Потому что я пришел из ниоткуда и иду в никуда... Ссылка на комментарий
AndrewMor 527 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 losiara, приведенная тобой функция сама по себе ничего и никого не спавнит, она только вызывает соответствующие функции для спавна чего/кого (monsters_spawn.bloodsucker_esc, monsters_spawn.esc_zombie_1, random_spawn.random_spawn_agr_dog, random_spawn.random_spawn_td_krovosos, random_spawn.random_spawn_dar_bandit1, npc_spawn.rostok_killer, npc_spawn.ros_ecolog, monsters_spawn.aes_zombie, npc_spawn.stalker_zombied_aes2_2). Копай их, явно там назначается story_id, и при повторном вызове функции ты получаешь вылет. Сталкер - наше всё! Ссылка на комментарий
losiara 13 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 (изменено) AndrewMor Спасибо что отозвался! Я конечно же знаю что данная функция ничего не спавнит, почему я собственно заподозрил ее в подобном вылете, из за ее прямого назначения повторного спавна объектов в игре при заходе на локу (одних и тех же объектов но без SIDа). Что такое SID как я его понимаю? Это ПРИНУДИТЕЛЬНО зарезервированный для игрового объекта ключ (номер) дабы игрок мододел мог в дальнейшем производить с ним какие либо действия... Но в игре существует еще так называемый ID-объектов всех абсолютно!!! Этот номер назовем его так присваивается самой игрой каждому объекту. Возможно ли повторение этих ID игрой и получение ошибки с соот. логом как я привел в предыдущем посте, или подобный вылет возможен только лишь у игровых объектов именно с SIDом??? Но точно скажу что все эти функции ничего и никому не присваивают, они только спавнят один и тот же набор объектов, например zombie_normal - 10 шт. или dog_strong и т. д. Для примера приведу эти функции что бы было понятней: local zombie_types = {"zombie_esc", "zombie_esc_1", "zombie_esc_2", "zombie_esc_3", "zombie_esc_4"} -- лежачие зомби -- function spawn_zombies( position,lvx,gvx,total)local zombie_indexlocal new_pos, x_offset, z_offsetfor zombie_index=1, total dox_offset = math.random(5)z_offset = math.random(5)new_pos = positionnew_pos.x = new_pos.x + x_offsetnew_pos.z = new_pos.z + z_offsetalife():create(zombie_types[math.random(5)],new_pos,lvx,gvx)endendfunction esc_zombie( actor, npc ) -- Зомбяки на отдыхе на Кордоне возле остановки --local spawn_point = vector():set( 21.074, 1.78, 30.096 )spawn_zombies( spawn_point,299445,90,10 )end Соответственно в spawn_sections.ltx: [zombie_esc]:zombie_weak$spawn = "respawn\zombie_esc"custom_data = scripts\moy_logic\zombie_legat.ltx[zombie_esc_1]:zombie_normal$spawn = "respawn\zombie_esc_1"custom_data = scripts\moy_logic\zombie_legat.ltx[zombie_esc_2]:zombie_strong$spawn = "respawn\zombie_esc_2"custom_data = scripts\moy_logic\zombie_legat.ltx[zombie_esc_3]:zombie_immortal$spawn = "respawn\zombie_esc_3"custom_data = scripts\moy_logic\zombie_legat.ltx[zombie_esc_4]:zombie_ghost$spawn = "respawn\zombie_esc_4"custom_data = scripts\moy_logic\zombie_legat.ltx Логика: [smart_terrains]none = true[logic]active = mob_fake_death[mob_fake_death]on_actor_dist_le_nvis = 5 | nil Благодарю за ответ! Изменено 15 Декабря 2016 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
UnLoaded 313 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 Возможно ли повторение этих ID игрой и получение ошибки с соот. логом как я привел в предыдущем посте, или подобный вылет возможен только лишь у игровых объектов именно с SIDом??? Насчет возможности повторов ID'ов - ни разу об этом нигде и ничего не попадалось. А раз информации такой нет - значит у движка с этим все нормально. А в приведенном тобой логе достаточно понятно сказано про дублирование SID. Ищи внимательно, где у тебя может происходить более одного спавна объекта, который имеет назначенный SID. 1 Ссылка на комментарий
AndrewMor 527 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 losiara, тогда вспоминай, после чего у тебя стал возникать вылет. Чего делал перед тем, как вылет словить. На первый взгляд, в приведенных тобой функциях нет намека на присвоение SID. Сталкер - наше всё! Ссылка на комментарий
losiara 13 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 (изменено) После чего вспомнить трудно ибо очень много изменений было сделано в том числе и скриптовых. А вот вылечился он после отключения этой функции, я всю игру не проходил конечно, но пару тройку локаций пробежал вылета не было!!! И точно не вспомню где, но точно видел что лог вылета не всегда соответствует аргументации, т. е. возможно что косяк в чем то другом, однако факт остается фактом, отключил вылет пропал. Вот и задачка... как полечить, вроде бы и ничего такого сложного и функция простейшая как бы, а глючит... SIDы я присваиваю конечно, через скрипт: function esc_propusk () -- На входе в лагерь новичков помощник -- local obj = alife():create("stalker_esc_propusk",vector():set(247.277,-19.60,-146.528),11347,8)local tbl = amk.read_stalker_params(obj)tbl.sid = 5495amk.write_stalker_params(tbl, obj)endПонятно что мод с использованием АМК файлов. но там все четко, иногда классическим способом через all.spawn. Изменено 15 Декабря 2016 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
dPlayer 499 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 (изменено) Имеется несколько функций в одном файле *.script, выполняющие роль предусловий в диалоге. Как написать ещё одну функцию, которая возвращала бы true, если остальные вернули false, т.е. ни одно из предусловий не выполнено. ЗЫ составил такую конструкцию, кажись работает function test() if файл.функция1() ~= true and файл.функция2() ~= true and файл.функция3() ~= true and then return true else return false end end Изменено 15 Декабря 2016 пользователем dPlayer Ссылка на комментарий
Charsi 440 Опубликовано 15 Декабря 2016 Поделиться Опубликовано 15 Декабря 2016 @dPlayer, у тебя третий and лишний. function test() return not( файл.функция1() or файл.функция2() or файл.функция3() ) end 1 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
AndrewMor 527 Опубликовано 16 Декабря 2016 Поделиться Опубликовано 16 Декабря 2016 возможно что косяк в чем то другом, однако факт остается фактом, отключил вылет пропал. Лог врать не будет. Если есть объект с таким же SID-ом, будет этот вылет. Каким-то образом твоя функция пересекается с другой/другими, присваивающими СИД Сталкер - наше всё! Ссылка на комментарий
dPlayer 499 Опубликовано 16 Декабря 2016 Поделиться Опубликовано 16 Декабря 2016 @Charsi, спасибо, and случайно поставил А как передать текущий параметр в диалог оригинальными средствами? К примеру ремонтник говорит цену за ремонт. Ссылка на комментарий
Zander_driver 10 334 Опубликовано 16 Декабря 2016 Поделиться Опубликовано 16 Декабря 2016 @dPlayer, использовать метод give_talk_message. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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. Ссылка на комментарий
dPlayer 499 Опубликовано 16 Декабря 2016 Поделиться Опубликовано 16 Декабря 2016 (изменено) Посмотрел в этой теме как его используют, но результата нет, хотя ф-ция работает - если написать то, чего не существует - вылетит с руганью. Вызов через диалог. function mess() local mess = "text" db.actor:give_talk_message(mess) end Изменено 16 Декабря 2016 пользователем dPlayer Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти