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 Ссылка на комментарий
Bak 757 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 @Dennis_Chikin,В ЧН присутствует похожая проблема. После возвращения на пути своя непись втыкает не на точку, в которую следовал, а на следующую (continue), пропуская таким образом сигналы для ВГ. Да, в некоторых квестологиках, теоретически, точки могут оказаться обязательными к посещению, что не стоит упускать из внимания. Интересно что тут с этим не так. Ну и после загрузки сохранения по любому срывается на ближайшую. Ссылка на комментарий
AndrewMor 533 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 self.se_respawn:update_online() похоже работает только для некоторых сторилайновых квестов. Я вообще собираюсь вырезать сюжет и пилить свой, новый. Собсно, почему и вопрос задавал. А за ответ - благодарю. Вроде, как непись возвращается в предыдущую точку пути, с которого его сдернуло из схемы. Если путь длинный, а точек мало - выглядит не красиво... Именно так. Потому при сейв-лоаде и выглядит некрасиво. Чем больше точек пути - тем красивее выглядит. Да и по уму логичнее получается. А теперь пусть себе идет, куда шел. За кровососами - значит, за кровососами. Тут тоже косяк кроется. Если путь дальний, а точек мало, он может по АИ-сетке как угодно побежать. И попасть туда, куда не следует. К кровососу в гости, например. Ссылка на комментарий
Dennis_Chikin 3664 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 "И попасть туда, куда не следует. К кровососу в гости, например." Я пытаюсь обход аномалий таки сделать. Вот там, где непись под логикой перемещается. На тех самых длинных дистанциях. Где у него, как я понимаю, job.position_threshold == "graph", или со всей дури выставлено n сотен метров, или которые вообще безсмартовые. Тоннель у меня сейчас Круглов тот же проходить почти научился, но как только аномалии заканчиваются - тут же бежит опять на старт. ГДЕ конкретно его туда отправляют ? Вот нифига это место не вижу. Ссылка на комментарий
losiara 13 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) Как раз вопрос близко к теме. Если непись заспавнен на одной точке валкером (1 точка пути), а затем по получению инфопоршня переходит на другую точку в патрулирование (2 точки пути), то по уходу в оффлайн например при переходе с одной локации на другую и опять обратно почему он оказывается вновь на первой точке??? Он конечно переходит на патрульный путь, но уже при приближении ГГ только, это некрасиво, он должен находиться на второй точке патрульной, а находится в первой??? Или так и должно быть, по уходу в оффлайн возвращается сначала в место спавна, а потом уже куда требуется??? Логика на всякий случай: [smart_terrains] none = true[logic]active = walker@stalker_propuskcombat_ignore = combat_ignore@stalker_propuskon_hit = hit@stalker_propuskon_death = death@stalker_propusk[walker@stalker_propusk]path_walk = stalker_propusk_esc_walkpath_look = stalker_propusk_esc_lookmeet = meet@stalker_propuskon_actor_dist_le_nvis = 10 |remark@stalker_propuskdanger = danger_condition[remark@stalker_propusk]anim = wardsnd = esc_guard_campno_move = truetarget = actoron_actor_dist_ge_nvis = 5 | {-esc_propusk_done} walker@stalker_propusk, {+esc_propusk_done} walker@stalker_propusk1;on_info = {+esc_propusk_done} walker@stalker_propusk1meet = meet@stalker_propuskcombat_ignore_cond = truedanger = danger_condition[walker@stalker_propusk1]path_walk = stalker_propusk_esc_walk1path_look = stalker_propusk_esc_look1danger = danger_condition[danger_condition]ignore_distance = 0ignore_distance_hit = 30ignore_distance_sound = 10[meet@stalker_propusk]use = trueuse_wpn = true[combat_ignore@stalker_propusk]combat_ignore_cond = true[hit@stalker_propusk]on_info = {=hit_by_actor} %=actor_enemy%[death@stalker_propusk]on_info = {+boar1_dead +boar2_dead +boar3_dead +boar4_dead +boar5_dead} %+esc_propusk_done%;"esc_propusk_done" - поршень свидетельствующий о выполнении квеста и соот. изменения схемы патрулирования! СПАСИБО!!! Изменено 28 Января 2017 пользователем losiara Ссылка на комментарий
Dennis_Chikin 3664 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) [logic] active = walker@stalker_propusk [walker@stalker_propusk] path_walk = stalker_propusk_esc_walk Именно по-этому. Ему сказали, где быть при входе в онлайн - он там и есть. Если надо, чтоб был в другом месте - прописываем более другую работу с другой секцией и другим путем. Будет там. Изменено 28 Января 2017 пользователем Dennis_Chikin 1 Ссылка на комментарий
gam 118 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) losiara. Возможно попробовать так... [smart_terrains]none = true[logic]active = walker@stalker_propuskcombat_ignore = combat_ignore@stalker_propuskon_hit = hit@stalker_propuskon_death = death@stalker_propusk[walker@stalker_propusk]path_walk = stalker_propusk_esc_walkpath_look = stalker_propusk_esc_lookon_actor_dist_le_nvis = 10 | {-esc_propusk_done} remark@stalker_propuskon_info = {+esc_propusk_done} walker@stalker_propusk1meet = meet@stalker_propusk1danger = danger_condition[remark@stalker_propusk]anim = wardtarget = actorsnd = esc_guard_campon_signal = sound_end | walker@stalker_propusk1meet = no_meet[walker@stalker_propusk1]path_walk = stalker_propusk_esc_walk1path_look = stalker_propusk_esc_look1combat_ignore = combat_ignore@stalker_propuskdanger = danger_condition[danger_condition]ignore_distance = 0ignore_distance_hit = 30ignore_distance_sound = 10[meet@stalker_propusk]meet_state = 10 | guard@waitmeet_state_wpn = 10 | backoff@threat_weapvictim = 10 | actorvictim_wpn = 10 | actoruse = trueuse_wpn = true[combat_ignore@stalker_propusk]combat_ignore_cond = true[hit@stalker_propusk]on_info = {=hit_by_actor} %=actor_enemy%[death@stalker_propusk]on_info = {+boar1_dead +boar2_dead +boar3_dead +boar4_dead +boar5_dead} %+esc_propusk_done% думаю должно работать. [smart_terrains]none = true[logic]active = walker@stalker_propuskcombat_ignore = combat_ignore@stalker_propuskon_hit = hit@stalker_propuskon_death = death@stalker_propusk[walker@stalker_propusk]path_walk = stalker_propusk_esc_walkpath_look = stalker_propusk_esc_lookon_actor_dist_le_nvis = 10 | {-esc_propusk_done} remark@stalker_propuskon_info = {+esc_propusk_done} walker@stalker_propusk1meet = meet@stalker_propuskdanger = danger_condition[remark@stalker_propusk]anim = wardtarget = actorsnd = esc_guard_campon_signal = sound_end | remark@stalker_propusk2meet = no_meet[remark@stalker_propusk2]anim = wardtarget = actoron_info = {+esc_propusk_done} walker@stalker_propusk1meet = meet@stalker_propusk[walker@stalker_propusk1]path_walk = stalker_propusk_esc_walk1path_look = stalker_propusk_esc_look1combat_ignore = combat_ignore@stalker_propuskdanger = danger_condition[danger_condition]ignore_distance = 0ignore_distance_hit = 30ignore_distance_sound = 10[meet@stalker_propusk]meet_state = 10 | guard@waitmeet_state_wpn = 10 | backoff@threat_weapvictim = 10 | actorvictim_wpn = 10 | actoruse = trueuse_wpn = true[combat_ignore@stalker_propusk]combat_ignore_cond = true[hit@stalker_propusk]on_info = {=hit_by_actor} %=actor_enemy%[death@stalker_propusk]on_info = {+boar1_dead +boar2_dead +boar3_dead +boar4_dead +boar5_dead} %+esc_propusk_done% Изменено 28 Января 2017 пользователем gam 1 Ссылка на комментарий
UnLoaded 313 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) Или так и должно быть, по уходу в оффлайн возвращается сначала в место спавна, а потом уже куда требуется??? У тебя непись работает под собственной логикой, а логика работает только в онлайне. Причем сделано так, что при входе объекта в онлайн логика инициализируется с начала. Решений несколько, первое - дробить логику как-то так: [logic] active = walker@stalker_reset [walker@stalker_reset] path_walk = stalker_propusk_reset on_info = {+info1} walker@stalker_место_работы_1 on_info2 = {+info2} walker@stalker_место_работы_2 on_info3 = {+info3} walker@stalker_место_работы_3 т.е. смысл в том, что создается первая схема-"развилка", из которой толкаем непися в соответствующую предыдущим действиям(и выданным инфо-порциям) следующую схему. Второе решение - поставить непися на работу в гулаг, а гулаг более "красиво" раскидывает неписей по схемам при выходе в онлайн. Изменено 28 Января 2017 пользователем UnLoaded 1 Ссылка на комментарий
losiara 13 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) Да под собственной, потому как это проще, на нем висит 1 квест (пропуска в лагерь) и более ничего, дальше он уже просто патрулирует. А если его в гулаг поместить, то это придется all.spawn вскрывать, скрипты гулаговские под него делать что бы только его на эту работу посылали ибо он именно в таком виде и с таким профилем должен это место занять. Но суть я понял на будущее. Спасибо!!! Перепишу схемку не сложно. Я потому в том числе здесь недавно спрашивал о том как можно задавать условие в том числе и персональной логике: [logic] active = {+...........} walker@............. ; в этой секции, так было бы усе гораздо проще. [logic] active = {+поршень} walker1, {-поршень} walker2 ;к сожалению в оригинале не работает, не предусмотрена! А советы которые дали вызывали вылет, ну подумал не буду больше людей донимать одним и тем же, не переспрашивал... Изменено 28 Января 2017 пользователем losiara Ссылка на комментарий
Dennis_Chikin 3664 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) В общем, с необходом аномалий ларчик ломом открывался. 5 ошибок в слове из 3-х букв. 1. evid_anomaly никогда нельзя делать true. После того, ка она вернулась обратно в false 99% остальных скриптов сходят с ума, и идут на reset() (возвращая начальные настройки в т.ч. начальную точку пути). Остальные 146% - неправильный стэйт, тип пути, позиции и что еще кому в голову придет в зависимости от качества скуренной авторами травы. 2. Далее, не все state одинаково полезны. Что, кстати, логично: в боевом состоянии неписю не до аномалий. 3. Связка state_manager и move_manager - это адский ад, где сотона и скрежет зубовный, а также - типичный случай хронического антисемитизма. 4. как раз patrol_path аномалии обходит, level_path - 90% затыкается. Следовательно, move_mgr позволять его выставлять - нельзя. 5. Проверку близости аномалий переносить непосредственно в него, и врубать state_walk. Хотя все равно спасает не всегда, ибо см. пп 1 и 3. Изменено 28 Января 2017 пользователем Dennis_Chikin Ссылка на комментарий
Карлан 1050 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Едем далее. Честно признаюсь, лень самому докапываться, хотя и не долго. Надо сравнить в "ИЛИ" три и более флага. bit_or(bit_or(bit_or... сразу понятно что это затея явно так себе, поэтому пока в голове у меня монструозные конструкции, типа сравнение каждого с каждым и конечной сравнение результатов, ну или сразу там break result. Upd: да, и через пространство флагов не предлагать, это еще муторнее чистых побитовых операций. Ссылка на комментарий
abramcumner 1229 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Надо сравнить в "ИЛИ" три и более флага. bit_or(bit_or(bit_or...Попробуй переформулировать задачу на русском, через установлены все биты или там хотя бы один. Есть подозрения, что тебе и не bit_or вообще нужен. Ссылка на комментарий
Карлан 1050 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Да нужно много чего. Есть несколько флагов, надо получить если там хотя-бы один какой-то есть, вчера в принципе засунул bit_or в ключи, где сверка идет с флагом который в движке и так из себя представляет flag1|flag2|flag3... . Теперь думаю как узнать что вообще никакой не установлен, это решается конечно сверкой с нулем, но каноничнее вроде bit_not, только вот с чем этот bit_not делать я пока не понимаю. Можно начать с простого, в движке-бы это выглядело как-то так: flag1&(flag2|flag3|flag4). У меня пока как я выше и сказал конструкция примитивная, т.е. bit_and(flag1, bit_or(flag2,flag3)), где flag2 это, например, flag2|flag3 из примера выше, а flag3 это flag4. Но вот как это все в чистом луа перевязать пока не понял. Я думаю, что я не могу больше думать. Надо различить два события. Есть два флага, если первый есть, то мой band(flag,bor( дает true, если есть и второй флаг, то разумеется тоже true. Но как тут отличить первый от второго тогда, при условии что второй может активироваться только в случае если активен первый. Иными словами нужно понять активен ли первый и не активен ли второй. КАК?! Ну очень желательно в band вторым аргументом что-нибудь поставить. Ссылка на комментарий
abramcumner 1229 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Иными словами нужно понять активен ли первый и не активен ли второй. local mask = bor(flag1, flag2) local test = band(value, mask) if test == flag1 then //значит flag1 установлен, а flag2 нет end Ссылка на комментарий
Карлан 1050 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @abramcumner, а если в bor три и более флага положить нужно? Тут условно разумеется. И еще засыпался, как установить, что оба флага установлены, при учете что не установлены другие перед наибольшим, написал band(value,band(flag2, flag5)), а пространство скажем из восьми флагов, так вот мне надо проверить что активны только flag2 и flag5, а остальные НЕ активны. Короче конечная задача, есть: {flag1, flag2, flag3, flag4, flag5, flag6}. Мне надо проверить, что активен первый или второй и активен пятый, причем что все остальные должны быть НЕ активны. Мой условный код выше ошибается в том плане, что показывает true и в том числе когда активен flag3 и flag4. Твой способ не помогает определить установку конкретного флага из двух если они во множестве находятся, показывает true и, если, какие-то иные флаги стоят. Ссылка на комментарий
abramcumner 1229 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 (изменено) @abramcumner, а если в bor три и более флага положить нужно? Тут условно разумеется.Если флаги настоящие флаги, то есть степени двойки, то bor эквивалентен сложению. И можно написать просто flag1 + flag2 + flag3А правильно bor(bor(flag1, flag2), flag3) И еще засыпался, как установить, что оба флага установлены, при учете что не установлены другие перед наибольшим, написал band(value,band(flag2, flag5)), а пространство скажем из восьми флагов, так вот мне надо проверить что активны только flag2 и flag5, а остальные НЕ активны. local mask = bor(flag1...flagN)//bor по всем флагам, которые надо проверять на установленность/неустановленность //если это вообще все флаги, то можно оставить только if local test = band(value, mask) if test == bor(flag2,flag5) then //сюда войдет, только если установлены флаг2 и 5 и не установлены остальные флаги из маски end Короче конечная задача, есть: {flag1, flag2, flag3, flag4, flag5, flag6}. Мне надо проверить, что активен первый или второй и активен пятый, причем что все остальные должны быть НЕ активны. Мой условный код выше ошибается в том плане, что показывает true и в том числе когда активен flag3 и flag4. Твой способ не помогает определить установку конкретного флага из двух если они во множестве находятся, показывает true и, если, какие-то иные флаги стоят. На band`ах и bor`aх можно изобразить, но условие получится не кислое. Возможно стоит написать функцию типа такой: function test(template) end //где template строка вида "011100XX0", в которой указываешь какие биты(флаги) должны быть установлены, не установлены, и на какие можно не обращать внимание. Изменено 31 Января 2017 пользователем abramcumner 1 Ссылка на комментарий
Карлан 1050 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Так вот я о том и говорю, что получается какая-то монструозная конструкция из таких матрешек, ну раз по другому никак, тогда ладно, будет так, мы не привыкли отступать. Флаги конечно степени двойки, стал бы я тогда эти шарады гадать . Ужасного вида конструкция конечно на выходе. Ссылка на комментарий
losiara 13 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Заметил одну неприятную вещь при использовании функции "set_gulag_enemy_actor(.....)" из xr.effects.script, если НПС в гулаге являются нейтралами, то функция делает их врагами для ГГ как и положено, а вот если они френды, то снижает их дружественность до нейтралов это так и задумано или у меня баг какой то??? Ссылка на комментарий
dsh 3824 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @losiara, полагаю, что те, кто стали нейтралами, принадлежат группировке, у которой goodwill к актору очень большой. Так? Ссылка на комментарий
losiara 13 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 (изменено) Да они друзья изначально. +600 из 5000 возможных по таблице из "game_relations" Изменено 31 Января 2017 пользователем losiara Ссылка на комментарий
dsh 3824 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @losiara, вот для этих друзей, что возвращают relation_registry.community_goodwill( npc:character_community(), db.actor:id() ) npc:goodwill( db.actor ) Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти