Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Zander_driver 10 343 Опубликовано 16 Января 2017 Поделиться Опубликовано 16 Января 2017 (изменено) Вообще, я бы советовал так не делать. Обозначенное большое число возвращается тогда, когда никакой слот не активен, т.е. это аналогично значению -1 допустим. Или nil. Это фактически "шум". На практике для каких либо действий, обычно требуется проверить активность определенного слота. Ее и выясняйте, if a:active_slot() == то_число_которое_вам_надо. Все практически используемые слоты имеют номера в пределах вполне скромных чисел. Вообще, вдумался в ваш вопрос поглубже, и созрел встречный. Требуется сделать что-то при условии, когда никакой из слотов не активен? Тогда проверяйте active_item, он как раз в этом случае будет возвращать nil, а не числовой шум. Изменено 16 Января 2017 пользователем Zander_driver 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. Ссылка на комментарий
losiara 13 Опубликовано 16 Января 2017 Поделиться Опубликовано 16 Января 2017 (изменено) naxac Это имя профиля, только сейчас обратил внимание!!! Получается, что для того что бы работало надо имя профиля вбивать??? Изменено 16 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Marafon6540 789 Опубликовано 17 Января 2017 Поделиться Опубликовано 17 Января 2017 Требуется сделать что-то при условии, когда никакой из слотов не активен?Имено.Как я уже писал выше - выбросил оружие, проверил слот (получил 4294967296), проверил есть ли в инвентаре еще оружие под слот, из которого выбросил и, если есть такое - вставил и активировал.Почему спрашиваю - сейчас пробую X-Ray extensions и соответственно входящие в него новые функции on_belt, on_ruck, on_slot. Вот и хотелось бы сразу разобраться. Проверил по вашему совету "if a:active_item() == nil then" - да, проверка срабатывает и дальнейшая функция полностью себя отрабатывает. Спасибо! Трилогия Апокалипсис. Упавшая звезда. Честь наемника. v. 1.2 УЗЧН v.1.3 + ОГСРх64 Последний сталкер v. 1.2 ПС v. 1.3 + ОГСРх64 Ссылка на комментарий
losiara 13 Опубликовано 21 Января 2017 Поделиться Опубликовано 21 Января 2017 (изменено) Добрый вечер!!! Подскажите, секция логики "[spawner]" работает только на сталкерах, монстрах, вертолетах??? Ее возможно прописать например как условия существования смарта или нет? Если нет, тогда как можно прописать условия для появления и начала работы smart_terrain? И еще вопрос если можно, активация схемы в логике поддерживает условия: [logic]active = {+поршень или функция} walker, {+поршень или функция} walker2 Если прописываю, вылетает на "клиент синхронизация", со ссылкой на _g.script:20 может патч не тот? Использую также файлы АМК "amk.script и amk_mod.script + правленный xr_logic.script" что дает возможность в логике прописывать активацию из любых скриптов, а не только "xr_effects.script". В статьях пишут вроде как должно работать... игра на патче1.0004 СПАСИБО!!! Изменено 21 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
UnLoaded 313 Опубликовано 22 Января 2017 Поделиться Опубликовано 22 Января 2017 (изменено) Ее возможно прописать например как условия существования смарта или нет? Для смартов используется "cond" в настройках смарта, смотри тут. активация схемы в логике поддерживает условия: Это называется "кондлист". Для гулагов добавляется крайне просто: в xr_gulag.script находишь ф-цию function gulag:get_job_path_name( job ), в ней меняешь строку local active_section = self.ltx:r_string( section, "active" ) на такую local active_section_cond = xr_logic.cfg_get_condlist(self.ltx, section, "active", self).-- добавлено чтение кондлиста Для персональной логики, я думаю, можно исправить по аналогии... Изменено 22 Января 2017 пользователем UnLoaded 1 1 Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 23 Января 2017 Поделиться Опубликовано 23 Января 2017 (изменено) Что это сейчас было ? function determine_section_to_activate(npc, ini, section_logic, actor) if not ini:section_exist(section_logic) then return "nil" end -- Распарсить строку выбора активной секции с учетом команд, заключенных в %% local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc) local active_section if not active_section_cond then abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic) else active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist) if not active_section then abort("object '%s': section '%s': section 'active' has no conditionless else clause", npc:name(), section_logic) end end return active_section end- из оригинала. "может патч не тот?" - Ага. Несовместимая версия драйвера /dev/hands Изменено 23 Января 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
losiara 13 Опубликовано 23 Января 2017 Поделиться Опубликовано 23 Января 2017 У меня она выглядит иначе (правки АМК видимо): -- Вызывается биндером с целью определить первую активную схему function determine_section_to_activate(npc, ini, section_logic, actor) if not ini:section_exist(section_logic) then return "nil" end -- Распарсить строку выбора активной секции с учетом команд, заключенных в %% local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc) local active_section if not active_section_cond then abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic) else active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist) if not active_section then abort("object '%s': section '%s': section 'active' has no conditionless else clause", npc:name(), section_logic) end end if active_section and db.storage[npc:id()].stype and db.storage[npc:id()].stype<=1 and db.storage[npc:id()].stype~=stypes[utils.get_scheme_by_section(active_section)] then -- вот здесь -- Блокируем активацию схемы для зверушек в человеческих гулагах. Dirty Hack. return "nil" else return active_section end end Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
dukekan 5 Опубликовано 24 Января 2017 Поделиться Опубликовано 24 Января 2017 Можно ли скриптово узнать, есть ли в шлеме/костюме ПНВ и какого он поколения (ЗП)? Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 (изменено) что-то совсем лыжи не едут... local lvid = npc:vertex_in_direction( npc:level_vertex_id(), npc:direction(), 10 ) if npc:accessible( lvid ) then npc:set_dest_level_vertex_id( lvid ) log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s", npc:name(), lvid, self.object:level_vertex_id() ) else ...! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dest reached! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dist: 2.9374704360962 to amk_zone_gravi_zone_strong0777 ! Cannot find saved game ~info~ [blowout_scheme] action_anomaly(bar_ecolog_professor):execute, accessible: 41085, current: 41085 и в такой позе стоит. - это так и должно быть ? Я почему-то думал, что npc:vertex_in_direction() - это не тот вертекс, в котором непись сейчас, а какой-то другой, "в ту сторону". Изменено 25 Января 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 174 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 - это так и должно быть ? Я почему-то думал, что npc:vertex_in_direction() - это не тот вертекс, в котором непись сейчас, а какой-то другой, "в ту сторону". Значит в ту сторону нет аи-нод или они накрыты запрещающим рестриктором. Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
abramcumner 1 174 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?Не совсем. В принципе функция задумана, что она возвращает или доступную ноду в заданном направлении или ноду, на которой объект стоит. Но в начале влепили 2 проверки, которые возвращают -1 Ссылка на комментарий
gam 117 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ? Возможно ошибаюсь, но мне кажется эта конструкция должна выглядеть чуть иначе: local lvid = npc:level_vertex_id() if npc:accessible( lvid ) then lvid = npc:vertex_in_direction( lvid, npc:direction(), 10 ) npc:set_dest_level_vertex_id( lvid ) log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s", npc:name(), lvid, self.object:level_vertex_id() ) else ... В принципе функция задумана, что она возвращает или доступную ноду в заданном направлении или ноду, на которой объект стоит. Полностью согласен. Ссылка на комментарий
losiara 13 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 (изменено) Функция для "combat_ignore", написана специально для одной сценки, хотя в принципе можно использовать по желанию. function check_fighting_by_community(actor, npc, p) if p[1] == nil then abort("Wrong string of params in check_fighting_by_community") end local npc = db.storage[npc:id()].enemy local community if npc and npc:alive() then community = npc:character_community() for i, v in pairs(p) do if type(v) == 'string' and community == v then return true end end end return false end Себя отрабатывает, бой неписи как и положено игнорируют некоторое время, а потом вылет через 1-2 минуты, даже не представляю по какой причине. Оговорюсь, что файл "game_relations.ltx" в полном порядке, несколько раз перепроверил, думаю что все таки из за скрипта вылет случается. Если выключить это условие, вылет исчезает... Вызов так: "combat_ignore_cond = {=check_fighting_by_community(freedom:dolg)}", ну или какие то другие группировки по желанию... Expression : fatal error Function : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetByIndexFile : e:\stalker\patch_1_0004\xr_3da\xrgame\ini_id_loader.hLine : 147Description :Arguments : item by index not found in section game_relations, line communities Благодарю за внимание!!! Изменено 25 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
gam 117 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 Вызов так: "combat_ignore_cond = {=check_fighting_by_community(freedom:dolg)}", ну или какие то другие группировки по желанию... Попробуйте таким образом: combat_ignore_cond = {=check_fighting_by_community} losiaraЕсли не сработает, попробуйте в xr_conditions.script вписать собственную функцию как-то: function my_check_fighting(actor, npc, p)if p[1] == nil thenabort("Wrong string of params in check_fighting_by_community")endlocal npc = db.storage[npc:id()].enemylocal communityif npc and npc:alive() thencommunity = npc:character_community() for i, v in pairs(p) doif type(v) == 'string' and community == "ваша" then return true endendendreturn falseend и уже потом смело использовать ее в своих *.ltx. combat_ignore_cond = {=my_check_fighting} 1 Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 А вылет точно в этой функции ? Или ошибка все-таки в game_relations, line communities ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
losiara 13 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 (изменено) Нет, в game_relations, точно все нормально, я думал может проверка(доработка) какая нужна дополнительно в функцию, группировки я использую разрабовские так что не должно быть по game_relations. gam, в этом варианте получится разовое использование на определенную группировку, для сценки однократно. Тоже можно в принципе. Попробую сейчас. Изменено 25 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
dsh 3 824 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 @losiara, вылет явно не из-за этой функции. Точнее, может и из-за нее, но только косвенно. Проблема явно в game_relations.ltx. Возможно, какая-то группировка там не указана. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
losiara 13 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 (изменено) dsh- у меня действительно есть группировки, но они указаны и прописаны во всех файлах, гуляют их представители, разговаривают и выполняют квесты. При убиении обыскиваются, при нанесении хитов выдают поршни, логику отрабатывают, вылетов не было ни разу!!! Единственное что меня смущало в game_relations, это вот это: ;названия группировокcommunities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, zone, 18, osoznanyie, 19 две последнии мои Почему при добавлении новой группировки номера не по порядку, вроде бы пишут в статьях что так необходимо. названия группировок communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других. Изменено 25 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
AndrewMor 530 Опубликовано 25 Января 2017 Поделиться Опубликовано 25 Января 2017 Единственное что меня смущало в game_relations, это вот это: Я добавлял новые группировки, продолжая нумерацию без пропусков. Полагаю, в твоем случае нужно делать то же самое. 1 Сталкер - наше всё! Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти