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 755 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 @Dennis_Chikin,В ЧН присутствует похожая проблема. После возвращения на пути своя непись втыкает не на точку, в которую следовал, а на следующую (continue), пропуская таким образом сигналы для ВГ. Да, в некоторых квестологиках, теоретически, точки могут оказаться обязательными к посещению, что не стоит упускать из внимания. Интересно что тут с этим не так. Ну и после загрузки сохранения по любому срывается на ближайшую. Ссылка на комментарий
AndrewMor 530 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 self.se_respawn:update_online() похоже работает только для некоторых сторилайновых квестов. Я вообще собираюсь вырезать сюжет и пилить свой, новый. Собсно, почему и вопрос задавал. А за ответ - благодарю. Вроде, как непись возвращается в предыдущую точку пути, с которого его сдернуло из схемы. Если путь длинный, а точек мало - выглядит не красиво... Именно так. Потому при сейв-лоаде и выглядит некрасиво. Чем больше точек пути - тем красивее выглядит. Да и по уму логичнее получается. А теперь пусть себе идет, куда шел. За кровососами - значит, за кровососами. Тут тоже косяк кроется. Если путь дальний, а точек мало, он может по АИ-сетке как угодно побежать. И попасть туда, куда не следует. К кровососу в гости, например. Сталкер - наше всё! Ссылка на комментарий
Dennis_Chikin 3 661 Опубликовано 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 3 661 Опубликовано 28 Января 2017 Поделиться Опубликовано 28 Января 2017 (изменено) [logic] active = walker@stalker_propusk [walker@stalker_propusk] path_walk = stalker_propusk_esc_walk Именно по-этому. Ему сказали, где быть при входе в онлайн - он там и есть. Если надо, чтоб был в другом месте - прописываем более другую работу с другой секцией и другим путем. Будет там. Изменено 28 Января 2017 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
gam 117 Опубликовано 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 3 661 Опубликовано 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 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Карлан 1 049 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Едем далее. Честно признаюсь, лень самому докапываться, хотя и не долго. Надо сравнить в "ИЛИ" три и более флага. bit_or(bit_or(bit_or... сразу понятно что это затея явно так себе, поэтому пока в голове у меня монструозные конструкции, типа сравнение каждого с каждым и конечной сравнение результатов, ну или сразу там break result. Upd: да, и через пространство флагов не предлагать, это еще муторнее чистых побитовых операций. Ссылка на комментарий
abramcumner 1 174 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Надо сравнить в "ИЛИ" три и более флага. bit_or(bit_or(bit_or...Попробуй переформулировать задачу на русском, через установлены все биты или там хотя бы один. Есть подозрения, что тебе и не bit_or вообще нужен. Ссылка на комментарий
Карлан 1 049 Опубликовано 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 1 174 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Иными словами нужно понять активен ли первый и не активен ли второй. local mask = bor(flag1, flag2) local test = band(value, mask) if test == flag1 then //значит flag1 установлен, а flag2 нет end Ссылка на комментарий
Карлан 1 049 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @abramcumner, а если в bor три и более флага положить нужно? Тут условно разумеется. И еще засыпался, как установить, что оба флага установлены, при учете что не установлены другие перед наибольшим, написал band(value,band(flag2, flag5)), а пространство скажем из восьми флагов, так вот мне надо проверить что активны только flag2 и flag5, а остальные НЕ активны. Короче конечная задача, есть: {flag1, flag2, flag3, flag4, flag5, flag6}. Мне надо проверить, что активен первый или второй и активен пятый, причем что все остальные должны быть НЕ активны. Мой условный код выше ошибается в том плане, что показывает true и в том числе когда активен flag3 и flag4. Твой способ не помогает определить установку конкретного флага из двух если они во множестве находятся, показывает true и, если, какие-то иные флаги стоят. Ссылка на комментарий
abramcumner 1 174 Опубликовано 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 Ссылка на комментарий
Карлан 1 049 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Так вот я о том и говорю, что получается какая-то монструозная конструкция из таких матрешек, ну раз по другому никак, тогда ладно, будет так, мы не привыкли отступать. Флаги конечно степени двойки, стал бы я тогда эти шарады гадать . Ужасного вида конструкция конечно на выходе. Ссылка на комментарий
losiara 13 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 Заметил одну неприятную вещь при использовании функции "set_gulag_enemy_actor(.....)" из xr.effects.script, если НПС в гулаге являются нейтралами, то функция делает их врагами для ГГ как и положено, а вот если они френды, то снижает их дружественность до нейтралов это так и задумано или у меня баг какой то??? Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
dsh 3 824 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @losiara, полагаю, что те, кто стали нейтралами, принадлежат группировке, у которой goodwill к актору очень большой. Так? dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
losiara 13 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 (изменено) Да они друзья изначально. +600 из 5000 возможных по таблице из "game_relations" Изменено 31 Января 2017 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
dsh 3 824 Опубликовано 31 Января 2017 Поделиться Опубликовано 31 Января 2017 @losiara, вот для этих друзей, что возвращают relation_registry.community_goodwill( npc:character_community(), db.actor:id() ) npc:goodwill( db.actor ) dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти