Kirgudu 1 264 Опубликовано 2 Мая 2024 @Balavnik если объект клиентский (obj), всё просто: local cond = obj:condition() Если объект серверный (sobj), тогда либо сначала получить клиентский (объект должен находиться в онлайне): local obj = level.object_by_id(sobj.id) либо если онлайн объект отсутствует (obj = nil после получения из серверного) - действовать через нет-пакет. Пример с использованием m_netpk: local pk = get_netpk(sobj, 1) -- state часть нет-пакета local data = pk:get() local cond = data.condition Также, возможно, для серверных объектов есть что-то более удобное в OGSR. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Мая 2024 Без разницы. При этом объект в инвентаре всегда в онлайне, соответственно, можно плясать от клиентского объекта. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Мая 2024 @Balavnik совершенно верно. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Мая 2024 37 минут назад, Balavnik сказал: Можно ли как-то менять текст диалогов скриптово? Стоит начать использовать "Справочник по функциям и классам" здесь, на форуме. Диалоги: Часть 1. Форматы файлов, базовые сведения Часть 2. Скриптовые диалоги Часть 3. Тематическая подборка функций управления диалогами Читать, вникать и пробовать. И только если что-то непонятно, задавать предметные вопросы. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 3 Мая 2024 (изменено) @Norman Eisenherz посмотри squad_descr_escape.ltx На автобусной остановке спавнится (esc_quest_line.ltx) строго определённый отряд с такой секцией: [esc_smart_terrain_6_8_stalker_patrol_2] Новичков sim_default_stalker_0 в нём можно поменять на персонажей с любой другой подходящей секцией из состава spawn_sections_*.ltx, в том числе на самописно-уникальных. Изменено 3 Мая 2024 пользователем Kirgudu 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 4 Мая 2024 1 час назад, Balavnik сказал: Пробовал просто object= alife():create(...), но create похоже ничего не возвращает. Даже если просто порыться в скриптах оригинальной игры, можно увидеть как раз то, о чём ты спрашиваешь. Файл se_respawn.script, функция se_respawn:create(prob): obj = alife():create(...) и ниже использование obj.id - вот искомый идентификатор созданного объекта. Я тебе уже писал в личке, кажется, сейчас повторю ещё раз: не ленись исследовать файлы оригинала. Несмотря на то, что они пестрят ошибками, тем не менее, в них можно найти тонны работающих примеров. В данном случае банальный поиск по файлам подстроки "alife():create" как раз вернул бы место, где ты нашёл бы ответ на свой вопрос. 3 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 4 Мая 2024 В чём вопрос-то заключается? Чисто скриптовых ошибок не видно, а вот как движок воспринимает попытку удаления сразу после создания (в том же блоке исполнения кода) - сказать не могу. Пусть знатоки OGSR отвечают. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 5 Мая 2024 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 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 5 Мая 2024 Вот именно, что возникает много разных "если" и "но". 1 час назад, CiberZold сказал: в чём ошибка ,если как раз и нужно удалить всех неписей Где было написано про удаление всех? Ни в вопросе, ни в ответе ни единого слова, намекающего на это. Если хочешь принести пользу, необходимо объяснять свои ответы, иначе они могут трактоваться как ошибочные. 1 час назад, CiberZold сказал: особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс Вот я заспавнил скриптом одного НПС, мне больше не надо. Тоже будешь удалять перебором, или здесь возникнет ещё одно невысказанное "если"? Вопрос риторический, ответ не нужен. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 6 Мая 2024 @Купер уже набил примерно то же самое, но опоздал секунд на 20. @Balavnik от себя хочу добавить ещё один способ: поиск по форуму. Пример для "состояние предмета" с вхождением всех слов: https://www.amk-team.ru/forum/search/?&q=состояние предмета&quick=1&search_and_or=and&sortby=relevancy Каждый второй пост в результатах содержит искомую функцию set_condition. Немного брюзжания: раньше считалось хорошим тоном сначала поискать ответ на свой вопрос в старых постах, коих за столько лет накопилось изрядно, и только потом - писать. 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 20 Мая 2024 4 часа назад, Norman Eisenherz сказал: про OGSR не знаю В OGSR тоже есть. Везде есть, кроме оригинала ТЧ и основанных на нём без расширения или редактирования движка модов. 3 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 21 Мая 2024 @Balavnik function spawn_remkom(first_speaker, second_speaker) local sobj = alife():story_object(5003) alife():create("vodka", vector(), 0, 0, sobj.id) end Примечание: при спавне в контейнере точные координаты и вертексы указывать не обязательно, можно обойтись значениями по умолчанию. 1 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 31 Мая 2024 @Norman Eisenherz могу предположить только одно. В той же функции check_task немного выше есть условие if self.state == "counter_attack", в котором выдаётся ровно то же самое сообщение. Раз break и отсечка по флагу не срабатывает, единственное, что приходит в голову - это что последовательно срабатывает выдача сообщений из разных частей условия, с действующей контратакой и без оной. Рекомендую расставить флаги и логирование в обеих частях и проверить. Если я прав, дальше надо будет подумать, почему сначала запускается контратака, потом (видимо) практически сразу отменяется. Могу ошибиться, но на ранних этапах работы над OGSM CS 1.8 (народный патч) что-то такое мы встречали... но в последнее время это уже не проявлялось. Точно уже не помню, давно это было. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Июня 2024 5 часов назад, Norman Eisenherz сказал: Возможно ли сделать вывод текста непосредственно через логику NPC Возможно. В xr_meet.init_meet(npc, ini, section, st, scheme) добавить новый параметр для идентификатора кастомного сообщения, указав в соотв. блоках как дефолтное значение "nil", так и парсинг строки из конфига. В xr_meet.action_meet_wait:execute() при ненулевом значении прочитанного выше параметра добавить вывод сообщения параллельно со звуком и с учётом его условий. Оригинальное сообщение при этом отвязать от звука, а в секцию логики [meet@1] добавить строку с новым параметром. Это, конечно, не действия только с логикой, как, вероятно, хотелось, зато универсальное решение, которым можно будет воспользоваться и в других случаях. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 2 Июня 2024 1 час назад, Norman Eisenherz сказал: Это примерно то же решение через скрипты с отсеиванием всех других приветствий. Хочется сделать правку именно в логике Левши. Скорее решение наоборот. Не отсеивание ненужного с избыточными проверками "а то ли это", а адресная обработка нового параметра, который, разумеется, будет добавлен только там, где нужно. Впрочем, условия для этой "нужности" достаточно специфические, почти разовые, так что решил сделать по-другому - и ладно. @monk в Final Stroke вообще пошёл третьим путём: сократил расстояние (чтоб Левша не орал издалека) и убрал субтитры (за ненужностью, ибо лицом к лицу). Подходов может быть много, главное чтобы выбранный способ удовлетворял автора. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 7 Июня 2024 (изменено) 13 часов назад, Black_Raven_03 сказал: db.actor:inventory_for_each( function( temp_sil, db.actor) А мне вот эта строчка очень любопытна. Можно сказать, что второй параметр в функции-коллбэке не нужен, но не это главное. Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции? В любом случае делать так не стоит. Изменено 7 Июня 2024 пользователем Kirgudu 1 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 17 Июня 2024 (изменено) "Справочник", функция level.remove_call. Изменено 17 Июня 2024 пользователем Kirgudu 1 3 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 26 Июня 2024 Скорее всего нет, в деструкторе объекта в движке есть очистка соответствующего массива коллбэков. Но это не точно, пусть двигоправы скажут лучше, если я не прав. А вот при возможном уходе в оффлайн такого объекта хвосты останутся болтаться. 2 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 26 Июня 2024 Консольные команды должны поддерживаться движком, поэтому только через его редактирование. Но если всё, что требуется вывести, доступно в скриптах, совсем не обязательно лезть в движок. Можно, например, прикрутить кейлоггер (легко находится поиском по форуму) и повесить вывод в лог на какую-либо незадействованную клавишу. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 264 Опубликовано 1 Июля 2024 Параметр с условным наименованием "ammo_left" есть как в state, так и в update части нет-пакета пачки патронов. В таком модуле управления нет-пакетами, как m_netpk от Артоса, это предусмотрено. Что за функционал скрывается под капотом netpacket:modify, мне не известно, но я бы посмотрел в вышеупомянутую сторону. Инструмент Поделиться этим сообщением Ссылка на сообщение