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

Скриптование


Svoboда

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

@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.

Поделиться этим сообщением


Ссылка на сообщение

Без разницы. При этом объект в инвентаре всегда в онлайне, соответственно, можно плясать от клиентского объекта.

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
37 минут назад, Balavnik сказал:

Можно ли как-то менять текст диалогов скриптово?

Стоит начать использовать "Справочник по функциям и классам" здесь, на форуме.
Диалоги:

Часть 1. Форматы файлов, базовые сведения

Часть 2. Скриптовые диалоги

Часть 3. Тематическая подборка функций управления диалогами

Читать, вникать и пробовать. И только если что-то непонятно, задавать предметные вопросы.

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

@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, в том числе на самописно-уникальных.

Изменено пользователем Kirgudu
  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
1 час назад, Balavnik сказал:

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

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

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

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

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
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

Поделиться этим сообщением


Ссылка на сообщение

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

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

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

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

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

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

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

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

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

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

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

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

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

 

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

  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение
4 часа назад, Norman Eisenherz сказал:

про OGSR не знаю

В OGSR тоже есть. Везде есть, кроме оригинала ТЧ и основанных на нём без расширения или редактирования движка модов.

  • Полезно 3

Поделиться этим сообщением


Ссылка на сообщение

@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

Поделиться этим сообщением


Ссылка на сообщение

@Norman Eisenherz могу предположить только одно.

В той же функции check_task немного выше есть условие if self.state == "counter_attack", в котором выдаётся ровно то же самое сообщение. Раз break и отсечка по флагу не срабатывает, единственное, что приходит в голову - это что последовательно срабатывает выдача сообщений из разных частей условия, с действующей контратакой и без оной. Рекомендую расставить флаги и логирование в обеих частях и проверить.

Если я прав, дальше надо будет подумать, почему сначала запускается контратака, потом (видимо) практически сразу отменяется.

Могу ошибиться, но на ранних этапах работы над OGSM CS 1.8 (народный патч) что-то такое мы встречали... но в последнее время это уже не проявлялось. Точно уже не помню, давно это было.

  • Нравится 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
5 часов назад, Norman Eisenherz сказал:

Возможно ли сделать вывод текста непосредственно через логику NPC

Возможно.

В xr_meet.init_meet(npc, ini, section, st, scheme) добавить новый параметр для идентификатора кастомного сообщения, указав в соотв. блоках как дефолтное значение "nil", так и парсинг строки из конфига.

В xr_meet.action_meet_wait:execute() при ненулевом значении прочитанного выше параметра добавить вывод сообщения параллельно со звуком и с учётом его условий.

Оригинальное сообщение при этом отвязать от звука, а в секцию логики [meet@1] добавить строку с новым параметром.

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

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
1 час назад, Norman Eisenherz сказал:

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

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

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

@monk в Final Stroke вообще пошёл третьим путём: сократил расстояние (чтоб Левша не орал издалека) и убрал субтитры (за ненужностью, ибо лицом к лицу).

Подходов может быть много, главное чтобы выбранный способ удовлетворял автора.

  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение
13 часов назад, Black_Raven_03 сказал:
db.actor:inventory_for_each( function( temp_sil, db.actor)

А мне вот эта строчка очень любопытна. Можно сказать, что второй параметр в функции-коллбэке не нужен, но не это главное.

Что-то я даже затрудняюсь сказать, что будет с глобальной кеширующей актора переменной db.actor, если её использовать в качестве выходного параметра. Обнулится со всеми вытекающими? Или будет создана локальная одноимённая переменная, не влияющая на глобальную, поскольку существует только внутри этой функции?

В любом случае делать так не стоит.

Изменено пользователем Kirgudu
  • Согласен 1
  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение

"Справочник", функция level.remove_call.

Изменено пользователем Kirgudu
  • Согласен 1
  • Полезно 3

Поделиться этим сообщением


Ссылка на сообщение

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

  • Полезно 2

Поделиться этим сообщением


Ссылка на сообщение

Консольные команды должны поддерживаться движком, поэтому только через его редактирование.
Но если всё, что требуется вывести, доступно в скриптах, совсем не обязательно лезть в движок. Можно, например, прикрутить кейлоггер (легко находится поиском по форуму) и повесить вывод в лог на какую-либо незадействованную клавишу.

  • Согласен 1
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Параметр с условным наименованием "ammo_left" есть как в state, так и в update части нет-пакета пачки патронов. В таком модуле управления нет-пакетами, как m_netpk от Артоса, это предусмотрено.

Что за функционал скрывается под капотом netpacket:modify, мне не известно, но я бы посмотрел в вышеупомянутую сторону.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...