Balavnik 86 Опубликовано 3 Мая Поделиться Опубликовано 3 Мая 26.12.2018 в 22:50, dPlayer сказал: которая запоминает НПС Можно например сохранять на сейвы списочек уже сказанных фраз что-то типа list = { Идентификатор npc = {dialog1, dialog2 и т.д.}}. Потом написать скрипт, который проверяет, сказал ли конкретный текущий нпс какой-либо текст путём проверки list[Идентификатор npc] на предмет отсутствия ранее сказанной фразы. Если текст нпс говорил, то просто вставить в диалог через give_talk_message сообщение типа "Ничего сказать не могу." Или можно воспользоваться другим методом, описанным здесь. Сам про него пока что мало знаю, поэтому подробных объяснений дать не могу. Устал. Ссылка на комментарий
dPlayer 423 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая @Balavnik когда я писал этот вопрос у меня не было ребёнка. Теперь вот готовимся к школе Я тогда имел ввиду механизм, который в оригинале запоминал нпс в стандартных диалогах "расскажи что интересного" - делал квест в котором надо было расспрашивать рандомных сталкеров и через пару десятков человек найти ответ. Но решения тогда и не нашёл. Где-то моё поделие на флешке валяется.. 3 Ссылка на комментарий
Balavnik 86 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая Как можно получить id создаваемого объекта? Или сам объект. Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. 1 Устал. Ссылка на комментарий
CiberZold 141 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая 1 час назад, Balavnik сказал: но create похоже ничего не возвращает create создаёт причём серверный объект, alife() как бы намекает, id игра сама рандомно присваивает игровому объекту цепляя цифру к названию секции на которой создан объект, поэтому этим id никто обычно не заморачивается, а обращается к объекту или через стори ид, или по имени, по поиску нужной строки в имени секции. Ссылка на комментарий
Kirgudu 1 152 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая 1 час назад, Balavnik сказал: Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. Даже если просто порыться в скриптах оригинальной игры, можно увидеть как раз то, о чём ты спрашиваешь. Файл se_respawn.script, функция se_respawn:create(prob): obj = alife():create(...) и ниже использование obj.id - вот искомый идентификатор созданного объекта. Я тебе уже писал в личке, кажется, сейчас повторю ещё раз: не ленись исследовать файлы оригинала. Несмотря на то, что они пестрят ошибками, тем не менее, в них можно найти тонны работающих примеров. В данном случае банальный поиск по файлам подстроки "alife():create" как раз вернул бы место, где ты нашёл бы ответ на свой вопрос. 3 1 Инструмент Ссылка на комментарий
Balavnik 86 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая (изменено) @Kirgudu Хм. Может я неправильно пишу? Прикладываю код. Скрытый текст Объект в онлайне. local dolg = create("bar_dolg_respawn_3",-212.095703125,-23.186395645142,-122.46632385254,41290,59, 1) release_dolg_kordon(dolg) function release_dolg_kordon(obj) send_message("HI") // Отладка if obj ~= nil then local objid = alife():object(obj.id) alife():release(objid, true) end end P.s. Я видимо ещё не до конца понял многих тонкостей концепции алайфа. Изменено 4 Мая пользователем Balavnik Устал. Ссылка на комментарий
Kirgudu 1 152 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая В чём вопрос-то заключается? Чисто скриптовых ошибок не видно, а вот как движок воспринимает попытку удаления сразу после создания (в том же блоке исполнения кода) - сказать не могу. Пусть знатоки OGSR отвечают. 1 Инструмент Ссылка на комментарий
CiberZold 141 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая 9 часов назад, Balavnik сказал: Я видимо ещё не до конца понял многих тонкостей концепции алайфа. чтоб не париться с id (там проблема что id можно получить от объекта к которому обращаешься в конкретной функции), а если тебе надо удалить в влюбой время ,в любом месте на любой локации серверный объект обычно юзают цикл перебора всех алайф объекту и по имени удаляем. for a=1,65635 do local obj=alife():object(a) if obj and string.find(obj:name(),"bar_dolg_respawn_3") then alife():release(obj, true) end end 1 Ссылка на комментарий
Norman Eisenherz 276 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая @Kirgudu Я познал путь GSC: мало прописать новый класс и группу профилей для новых сталкеров – надо еще указать этот класс в [spawn_sections.ltx] со ссылкой… на тот же класс? При этом в логе вылета ссылка на движковую проверку с какими-то векторами – поди пойми, чего игра хочет. 4 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 152 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая 4 часа назад, CiberZold сказал: обычно юзают цикл перебора всех алайф объекту Порочный совет. "Обычно" наоборот, стараются так не делать, а если советовать такое, неплохо бы объяснять все минусы этого подхода. Да ещё и пример написан с ошибками (об этом ниже). @Balavnik, минус, причём жирный, заключается именно в переборе 65 тысяч (в примере) или в среднем 33 тысяч объектов. Что если такой поиск нужно делать периодически? А если он сам находится внутри другого цикла и/или содержит в себе достаточно внушительный код? Подход "процессор вывезет" сработает у одного, а у другого - приведёт к фризам. Скрытый текст Если тебе необходимо удалить кого-то совершенно определённого и никого больше таким образом не удалять - лучше адресоваться к story_id и получать объект по этому признаку. Если необходимо удалить случайного персонажа, но при этом создаваемого в строго определённый момент строго определённым образом - лучше как-то запомнить его точный идентификатор, а потом использовать его при удалении. Если необходимо удалить одного или всех НПС по какому-то фиксированному признаку - лучше проверить признак и запомнить этих персонажей в момент загрузки из сейва или их спавна, а потом, опять же, удалять адресно. Да, так сложнее, но при этом правильнее. Способ же с полным перебором следует использовать тогда и только тогда, когда никакой другой в принципе применить нельзя. Для целей обучения он, конечно, подойдёт, но на будущее необходимо чётко представлять последствия. А пример выше, как я уже сказал, содержит в себе как минимум 2 ошибки. Первая: после нахождения объекта с именем "bar_dolg_respawn_3" цикл не остановлен и продолжится до достижения максимального числа 65535. После alife():release() следовало выполнить break или return. Вторая: если в игре существуют объекты с именем "bar_dolg_respawn_31", "bar_dolg_respawn_345" или, допустим, "foobar_dolg_respawn_3" - будут удалены все, поскольку все эти имена содержат одно и то же, а именно то, что ищется, а паттерн, использованный для поиска, неточен. Не ошибки это только в одном случае: если необходимо удалить все объекты, содержащие в своём имени "bar_dolg_respawn_3". Но об этом надо сообщать особо. 3 Инструмент Ссылка на комментарий
CiberZold 141 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая (изменено) 2 часа назад, Kirgudu сказал: "Обычно" наоборот, стараются так не делать в данном примере когда один раз надо удалить что-то вполне себе вариант, постоянно конечно такой цикл вешать не стоит. 2 часа назад, Kirgudu сказал: Первая: после нахождения объекта с именем "bar_dolg_respawn_3" цикл не остановлен и продолжится до достижения максимального числа 65535. в чём ошибка ,если как раз и нужно удалить всех неписей, пример с bar_dolg_respawn_3 был не для повторения вслепую, а для общего шаблона так сказать. особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс) потому что те нпс которые спавнятся через аллспавн им можно задать имя в самом алл-спавне и к ним можно обращаться по этому уникальному имени, а те что созданы через alife():create им игра сама назначает имя, прибавляя числа случайные к названию секции на которой они созданы, поэтому неписей с именем частью которого будет секция bar_dolg_respawn_3 вполне может наспавниться много, и вот чтоб их всех удалить их разом мой метод как раз самое то ,ну если я правильно понял задачу автора вопроса) Изменено 5 Мая пользователем CiberZold Ссылка на комментарий
Kirgudu 1 152 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая Вот именно, что возникает много разных "если" и "но". 1 час назад, CiberZold сказал: в чём ошибка ,если как раз и нужно удалить всех неписей Где было написано про удаление всех? Ни в вопросе, ни в ответе ни единого слова, намекающего на это. Если хочешь принести пользу, необходимо объяснять свои ответы, иначе они могут трактоваться как ошибочные. 1 час назад, CiberZold сказал: особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс Вот я заспавнил скриптом одного НПС, мне больше не надо. Тоже будешь удалять перебором, или здесь возникнет ещё одно невысказанное "если"? Вопрос риторический, ответ не нужен. 1 Инструмент Ссылка на комментарий
CiberZold 141 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая 2 часа назад, Kirgudu сказал: Где было написано про удаление всех? даже если надо удалить одного, секция bar_dolg_respawn_3 подразумевает, что это какой-то респавн, за то время пока дойдёт до ручного спавна и удаления, игра сама может наспавнить несколько неписей на этой секции и они будут с этой строчкой в имени, также как и нужный нам непись, потому можно и удалить их всех скопом вместе с нужным нам нпс, здесь делать выход из цикла после первого удалённого как раз приведёт к тому, что мы можем удалить левого нпс, а нужного нет, потому цикл надо довести до конца, чтоб он удалили всех с похожими именами (бесполезных сим неписей) и заодно и нужного на удаление 1 Ссылка на комментарий
Balavnik 86 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая Можно ли менять свойства объектов, например condition у оружия, просто делая равенство См.Пример., или существуют специальные методы? Скрытый текст weapon:condition() = 1 Устал. Ссылка на комментарий
Norman Eisenherz 276 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая obj:set_condition(num) Возможно, в OGSR есть метод и для оффлайн-объектов. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Balavnik 86 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая @Norman Eisenherz А где-то можно список получить этих методов? Каждый раз спрашивать - засорять тему. Устал. Ссылка на комментарий
Купер 2 690 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая Базовые понятия: здесь или здесь/здесь/здесь (воспринимается проще, потому что спойлеры "не побиты" ). Многое можно найти непосредственно в lua_help.script непосредственно из ресурсов игры, правда, иногда не всё и не всегда соответствует действительности. Непосредственно по OGSR - естественно, на wiki проекта прежде всего, благо документация по проекту более чем подробная. 1 1 Ссылка на комментарий
Kirgudu 1 152 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая @Купер уже набил примерно то же самое, но опоздал секунд на 20. @Balavnik от себя хочу добавить ещё один способ: поиск по форуму. Пример для "состояние предмета" с вхождением всех слов: https://www.amk-team.ru/forum/search/?&q=состояние предмета&quick=1&search_and_or=and&sortby=relevancy Каждый второй пост в результатах содержит искомую функцию set_condition. Немного брюзжания: раньше считалось хорошим тоном сначала поискать ответ на свой вопрос в старых постах, коих за столько лет накопилось изрядно, и только потом - писать. 2 Инструмент Ссылка на комментарий
1_Draken_1 2 Опубликовано 10 Мая Поделиться Опубликовано 10 Мая (изменено) https://imgur.com/5mgNkfl То что выделено в квадрат это как я понял имя на которое отсылаются другие скрипты, но это не точно что то тут не так и из-за того что механика переехала в движок я теперь не знаю как мне здесь указать имя на которое в дальнейшем отсылаюсь что вывести на худ в процентах, подскажите что не так А ниже скрины где это используется, и укажите может где ошибся Цитата https://imgur.com/h7XU1ra https://imgur.com/DWAd2Ky https://imgur.com/undefined Изменено 10 Мая пользователем 1_Draken_1 AMD FX (tm)-6300 Six-Core (6 X 3.50GHz); RAM 16Gb; GeForce GTX 1660 Super (6Gb).Windows -10 Home (х64) My ArtStation - https://www.artstation.com/artem344 Ссылка на комментарий
Balavnik 86 Опубликовано 12 Мая Поделиться Опубликовано 12 Мая Каким образом лучше всего таймеры делать? В биндере прописывать или как-то иначе? Устал. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти