Перейти к контенту

Рекомендуемые сообщения

26.12.2018 в 22:50, dPlayer сказал:

которая запоминает НПС

Можно например сохранять на сейвы списочек уже сказанных фраз что-то типа list = { Идентификатор npc = {dialog1, dialog2 и т.д.}}. 

 

Потом написать скрипт, который проверяет, сказал ли конкретный текущий нпс какой-либо текст путём проверки list[Идентификатор npc] на предмет отсутствия ранее сказанной фразы. Если текст нпс говорил, то просто вставить в диалог через give_talk_message сообщение типа "Ничего сказать не могу." 

 

Или можно воспользоваться другим методом, описанным здесь. Сам про него пока что мало знаю, поэтому подробных объяснений дать не могу.

Устал.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

@Balavnik когда я писал этот вопрос у меня не было ребёнка. Теперь вот готовимся к школе:biggrin:

Я тогда имел ввиду механизм, который в оригинале запоминал нпс в стандартных диалогах "расскажи что интересного" - делал квест в котором надо было расспрашивать рандомных сталкеров и через пару десятков человек найти ответ. Но решения тогда и не нашёл.

Где-то моё поделие на флешке валяется..:ph34r:

  • Смешно 3
Ссылка на комментарий

Как можно получить id создаваемого объекта? Или сам объект. Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. 

  • Не согласен 1

Устал.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий
1 час назад, Balavnik сказал:

но create похоже ничего не возвращает

create создаёт причём серверный объект, alife() как бы намекает, id игра сама рандомно присваивает игровому объекту цепляя цифру к названию секции на которой создан объект, поэтому этим id никто обычно не заморачивается, а обращается к объекту или через стори ид, или по имени, по поиску нужной строки в имени секции.

Ссылка на комментарий
1 час назад, Balavnik сказал:

Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. 

Даже если просто порыться в скриптах оригинальной игры, можно увидеть как раз то, о чём ты спрашиваешь.

Файл se_respawn.script, функция se_respawn:create(prob):

obj = alife():create(...)
и ниже использование obj.id - вот искомый идентификатор созданного объекта.
 

Я тебе уже писал в личке, кажется, сейчас повторю ещё раз: не ленись исследовать файлы оригинала. Несмотря на то, что они пестрят ошибками, тем не менее, в них можно найти тонны работающих примеров. В данном случае банальный поиск по файлам подстроки "alife():create" как раз вернул бы место, где ты нашёл бы ответ на свой вопрос.

  • Нравится 3
  • Согласен 1
Ссылка на комментарий

@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. Я видимо ещё не до конца понял многих тонкостей концепции алайфа.

Изменено пользователем Balavnik

Устал.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

В чём вопрос-то заключается? Чисто скриптовых ошибок не видно, а вот как движок воспринимает попытку удаления сразу после создания (в том же блоке исполнения кода) - сказать не могу. Пусть знатоки OGSR отвечают.

  • Полезно 1
Ссылка на комментарий
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
Ссылка на комментарий

@Kirgudu Я познал путь GSC: мало прописать новый класс и группу профилей для новых сталкеров – надо еще указать этот класс в [spawn_sections.ltx] со ссылкой… на тот же класс? При этом в логе вылета ссылка на движковую проверку с какими-то векторами – поди пойми, чего игра хочет.

:WhiteVoid_2:

  • Смешно 4

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий
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
Ссылка на комментарий
2 часа назад, Kirgudu сказал:

"Обычно" наоборот, стараются так не делать

в данном примере когда один раз надо удалить что-то вполне себе вариант, постоянно конечно такой цикл вешать не стоит.

 

2 часа назад, Kirgudu сказал:

Первая: после нахождения объекта с именем "bar_dolg_respawn_3" цикл не остановлен и продолжится до достижения максимального числа 65535.

в чём ошибка ,если как раз и нужно удалить всех неписей, пример с bar_dolg_respawn_3 был не для повторения вслепую, а для общего шаблона так сказать.

 

особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс) потому что те нпс которые спавнятся через аллспавн им можно задать имя в самом алл-спавне и к ним можно обращаться по этому уникальному имени, а те что созданы через alife():create им игра сама назначает имя, прибавляя числа случайные к названию секции на которой они созданы, поэтому неписей с именем частью которого будет секция bar_dolg_respawn_3 вполне может наспавниться много, и вот чтоб их всех удалить их разом мой метод как раз самое то ,ну если я правильно понял задачу автора вопроса)

Изменено пользователем CiberZold
Ссылка на комментарий

Вот именно, что возникает много разных "если" и "но".

1 час назад, CiberZold сказал:

в чём ошибка ,если как раз и нужно удалить всех неписей

Где было написано про удаление всех? Ни в вопросе, ни в ответе ни единого слова, намекающего на это. Если хочешь принести пользу, необходимо объяснять свои ответы, иначе они могут трактоваться как ошибочные.

1 час назад, CiberZold сказал:

особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс

Вот я заспавнил скриптом одного НПС, мне больше не надо. Тоже будешь удалять перебором, или здесь возникнет ещё одно невысказанное "если"?

Вопрос риторический, ответ не нужен.

  • Нравится 1
Ссылка на комментарий
2 часа назад, Kirgudu сказал:

Где было написано про удаление всех?

даже если надо удалить одного, секция bar_dolg_respawn_3 подразумевает, что это какой-то респавн, за то время пока дойдёт до ручного спавна и удаления, игра сама может наспавнить несколько неписей на этой секции и они будут с этой строчкой в имени, также как и нужный нам непись, потому можно и удалить их всех скопом вместе с нужным нам нпс, здесь делать выход из цикла после первого удалённого как раз приведёт к тому, что мы можем удалить левого нпс, а нужного нет, потому цикл надо довести до конца, чтоб он удалили всех с похожими именами (бесполезных сим неписей) и заодно и нужного на удаление:)

  • Жуть! 1
Ссылка на комментарий

Можно ли менять свойства объектов, например condition у оружия, просто делая равенство См.Пример., или существуют специальные методы?

 

Скрытый текст
weapon:condition() = 1

 

 

Устал.

img.php?nick=Balavnik&sert=2&text=t6

Ссылка на комментарий

Базовые понятия: здесь или здесь/здесь/здесь (воспринимается проще, потому что спойлеры "не побиты" :biggrin:). Многое можно найти непосредственно в lua_help.script непосредственно из ресурсов игры, правда, иногда не всё и не всегда соответствует действительности. Непосредственно по OGSR - естественно, на wiki проекта прежде всего, благо документация по проекту более чем подробная.

  • Нравится 1
  • Полезно 1
Ссылка на комментарий

@Купер уже набил примерно то же самое, но опоздал секунд на 20. :laugh:

@Balavnik от себя хочу добавить ещё один способ: поиск по форуму. Пример для "состояние предмета" с вхождением всех слов:

https://www.amk-team.ru/forum/search/?&q=состояние предмета&quick=1&search_and_or=and&sortby=relevancy

Каждый второй пост в результатах содержит искомую функцию set_condition.

 

Немного брюзжания: раньше считалось хорошим тоном сначала поискать ответ на свой вопрос в старых постах, коих за столько лет накопилось изрядно, и только потом - писать.

  • Полезно 2
Ссылка на комментарий

https://imgur.com/5mgNkfl

То что выделено в квадрат это как я понял имя на которое отсылаются другие скрипты, но это не точно что то тут не так и из-за того что механика переехала в движок я теперь не знаю как мне здесь указать имя на которое в дальнейшем отсылаюсь что вывести на худ в процентах, подскажите что не так

 

А ниже скрины где это используется, и укажите может где ошибся

Цитата

 

Изменено пользователем 1_Draken_1

1_Draken_1.gif

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

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   1 пользователь

×
×
  • Создать...