Balavnik 95 Опубликовано 3 Мая Поделиться Опубликовано 3 Мая 26.12.2018 в 22:50, dPlayer сказал: которая запоминает НПС Можно например сохранять на сейвы списочек уже сказанных фраз что-то типа list = { Идентификатор npc = {dialog1, dialog2 и т.д.}}. Потом написать скрипт, который проверяет, сказал ли конкретный текущий нпс какой-либо текст путём проверки list[Идентификатор npc] на предмет отсутствия ранее сказанной фразы. Если текст нпс говорил, то просто вставить в диалог через give_talk_message сообщение типа "Ничего сказать не могу." Или можно воспользоваться другим методом, описанным здесь. Сам про него пока что мало знаю, поэтому подробных объяснений дать не могу. Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
dPlayer 433 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая @Balavnik когда я писал этот вопрос у меня не было ребёнка. Теперь вот готовимся к школе Я тогда имел ввиду механизм, который в оригинале запоминал нпс в стандартных диалогах "расскажи что интересного" - делал квест в котором надо было расспрашивать рандомных сталкеров и через пару десятков человек найти ответ. Но решения тогда и не нашёл. Где-то моё поделие на флешке валяется.. 3 Ссылка на комментарий
Balavnik 95 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая Как можно получить id создаваемого объекта? Или сам объект. Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. 1 Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
CiberZold 142 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая 1 час назад, Balavnik сказал: но create похоже ничего не возвращает create создаёт причём серверный объект, alife() как бы намекает, id игра сама рандомно присваивает игровому объекту цепляя цифру к названию секции на которой создан объект, поэтому этим id никто обычно не заморачивается, а обращается к объекту или через стори ид, или по имени, по поиску нужной строки в имени секции. Ссылка на комментарий
Kirgudu 1 176 Опубликовано 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 95 Опубликовано 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 176 Опубликовано 4 Мая Поделиться Опубликовано 4 Мая В чём вопрос-то заключается? Чисто скриптовых ошибок не видно, а вот как движок воспринимает попытку удаления сразу после создания (в том же блоке исполнения кода) - сказать не могу. Пусть знатоки OGSR отвечают. 1 Инструмент Ссылка на комментарий
CiberZold 142 Опубликовано 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 286 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая @Kirgudu Я познал путь GSC: мало прописать новый класс и группу профилей для новых сталкеров – надо еще указать этот класс в [spawn_sections.ltx] со ссылкой… на тот же класс? При этом в логе вылета ссылка на движковую проверку с какими-то векторами – поди пойми, чего игра хочет. 4 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Kirgudu 1 176 Опубликовано 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 142 Опубликовано 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 176 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая Вот именно, что возникает много разных "если" и "но". 1 час назад, CiberZold сказал: в чём ошибка ,если как раз и нужно удалить всех неписей Где было написано про удаление всех? Ни в вопросе, ни в ответе ни единого слова, намекающего на это. Если хочешь принести пользу, необходимо объяснять свои ответы, иначе они могут трактоваться как ошибочные. 1 час назад, CiberZold сказал: особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс Вот я заспавнил скриптом одного НПС, мне больше не надо. Тоже будешь удалять перебором, или здесь возникнет ещё одно невысказанное "если"? Вопрос риторический, ответ не нужен. 1 Инструмент Ссылка на комментарий
CiberZold 142 Опубликовано 5 Мая Поделиться Опубликовано 5 Мая 2 часа назад, Kirgudu сказал: Где было написано про удаление всех? даже если надо удалить одного, секция bar_dolg_respawn_3 подразумевает, что это какой-то респавн, за то время пока дойдёт до ручного спавна и удаления, игра сама может наспавнить несколько неписей на этой секции и они будут с этой строчкой в имени, также как и нужный нам непись, потому можно и удалить их всех скопом вместе с нужным нам нпс, здесь делать выход из цикла после первого удалённого как раз приведёт к тому, что мы можем удалить левого нпс, а нужного нет, потому цикл надо довести до конца, чтоб он удалили всех с похожими именами (бесполезных сим неписей) и заодно и нужного на удаление 1 Ссылка на комментарий
Balavnik 95 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая Можно ли менять свойства объектов, например condition у оружия, просто делая равенство См.Пример., или существуют специальные методы? Скрытый текст weapon:condition() = 1 Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Norman Eisenherz 286 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая obj:set_condition(num) Возможно, в OGSR есть метод и для оффлайн-объектов. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Balavnik 95 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая @Norman Eisenherz А где-то можно список получить этих методов? Каждый раз спрашивать - засорять тему. Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Купер 2 759 Опубликовано 6 Мая Поделиться Опубликовано 6 Мая Базовые понятия: здесь или здесь/здесь/здесь (воспринимается проще, потому что спойлеры "не побиты" ). Многое можно найти непосредственно в lua_help.script непосредственно из ресурсов игры, правда, иногда не всё и не всегда соответствует действительности. Непосредственно по OGSR - естественно, на wiki проекта прежде всего, благо документация по проекту более чем подробная. 1 1 Ссылка на комментарий
Kirgudu 1 176 Опубликовано 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 95 Опубликовано 12 Мая Поделиться Опубликовано 12 Мая Каким образом лучше всего таймеры делать? В биндере прописывать или как-то иначе? Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти