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

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


Svoboда

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

Если вылет во время диалога, то есть, как я предполагаю, в момент получения инфопоршна, и инфопоршн зарегистрирован, то всё дело в секции [walker@walker1]. Если только в диалоге не используются какие-нибудь прекондишны и экшны. А лог вылета есть, хоть какой-нибудь?

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


Ссылка на сообщение
Igor88.89, именно. Кстати, можно и сразу "переодевать" NPC, используя эффект, например, кратковременного потемнения в глазах ГГ, или наоборот, яркой засветки (эффект телепорта), чтобы не было видно исчезновения/появления NPC. При "оживлении" трупов я такой эффект использую ;)...

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


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

Ну, это сделать совсем непросто, если вообще возможно: придётся создавать новые модельки сталкеров, с новыми анимациями, или прописывать новые анимации уже существующим. Вряд ли что выйдет :)...

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


Ссылка на сообщение
Ulman, ищи в файле watcher_act.script, место, где NPC добрался до трупа, и начинает непосредственно его обыскивать (включение анимации search). Вот сюда как раз и желательно засунуть проигрывание разового звука, исходящего от NPC. Интересная мысль, надо бы у себя тоже сделать :).

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


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

Ulman, если для "лечения" NPC используется т.н АИ-пак xStream'a (а скорее всего, так оно и есть), то в самом начале файла xrs_medic.script можно обнаружить табличку по имени excluded_npcs. Вот в неё и нужно заносить имена NPC, которых будут игнорировать NPC-"медики" - там, кстати, уже указаны несколько "беспомощных товарищей", так что разберёшься.

Что касается исключений для обыска, тут сложнее, т.к. автор (кто забыл - Red75, файл watcher_act.script) отчего-то не предусмотрел такой возможности (зато изначально есть возможность определить тех, кто мародёрствовать не станет ;)), но добавить условие по "отсеиваию" имён (или по story_id, например, или по названию группировки и т.д. и т.п.) совсем несложно.

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


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

Disord, я уже отписал, что изначально в схеме можно указывать тех, кто не будет работать под схемой "мародёры" (то есть не будет обшаривать трупы). Это и есть пресловутая переменная "zombi". Не веришь - обрати внимание, там прописаны как раз зомбированные, а они, в свою очередь, как раз мародёрством не занимаются :). Ну, это, конечно, исправить можно, если только у всех моделек зомбированных сталкеров имеется полный набор "сталкеровских" анимаций, иначе, как водится, будет стопудовый вылет.

А Ulman'u надо, чтобы указанных персонажей именно не обшаривали после смерти. Ulman, если уж совсем просто, то сделай так - добавь в самое начало функции checkCorpse(obj) (файл watcher_act.script) вот такую строчку:

if IsStalker(obj) and obj:name() == "stalker_name" then return false end

"stalker_name" следует заменить на имя того сталкера, труп которого не должны обшаривать мародёры - но только не на "Вася" или "Петя", а на такое же, как и в файле xrs_medic.script для раненого, которому "не требуется" помощь.

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


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

Ulman, вот так должна выглядеть таблица в файле xrs_medic.script (чистая версия, с добавлением одного "больного"):

local excluded_npcs={
    esc_fox=true,
    esc_vagon_wounded=true,
    gar_bandit_stroyka3=true,
    gar_wounded_bandit=true,
    val_sos_wounded=true,
    val_escort_bandit_halfdead=true,
    vasya_pupkin = true
}

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

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


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

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

Скрипт хStream'а просмотрел, ничего кривого не обнаружил. А к остальным "зарезервированным" персонажам медики тоже сбегаются, или нет?

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


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

*Shoker*, я как-то пытался "телепортировать" труп непися в ТЧ (как раз оффлайн). При просмотре с другой локации видно, что NPC переместился в заданную точку. Но стоит перебраться на "родную" для трупа локацию, как он (труп) тут же оказывается на прежнем месте. В общем, поковырялся с часик, и бросил эту затею (хотел эдакое "оффлайн-кладбище" сделать, но потом сделал свой уборщик трупостволов, и отказался от этой фишки :)).

Stalkersof, таких неписей (без использования оллспона) заспонить несложно. Стандартной функцией создаём нужных NPC на заданных позициях. Почему нельзя спонить "кучей", как обычно это делается, поясню ниже. Затем (ну, я так поступаю - просто и удобно :)) парой функций из набора АМК (read_salker_params/write_stalker_params) вписываем им в "кустодату" логику, основанную на схеме поведения remark, в которой нужно указать, что сталкеры должны смотреть в сторону игрока (target = actor). Вот почему нельзя спонить "кучей" - чтобы каждый сталкер под этой схемой находился на отдельной позиции (предполагаю, что это будет засада, не так ли ;)?) Там же в логике укажи условие перехода неписей в "боевое состояние" - то есть, как у тебя написано, при приближении игрока (скажем, on_actor_dist_le_nvis = 100| remark@bey_vragov %=здесь функция для "обижания" неписей на игрка, если их группировка не враждебна к игроку%). Собственно, всё. По итогам боя можно либо отправить неписей в какой-нибудь смарт, либо оставить под той же схемой, либо загнать в nil - тогда они тупо будут слоняться по местности, пока их кто-нибудь (или что-нибудь) не прикончит. Ну, я предполагаю, что по итогам боя они все должны погибнуть, верно ;)?

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


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

Stalkersof, делать можно как угодно, ты разработчик - тебе и карты в руки :).

Стандартная функция, создающая объекты в игре, в целом выглядт так:

alife():create("item_section_name", vector():set(x, y, z), level_vertex_id, game_vertex_id)

Но. С другой стороны, если ты собрался создавать рестриктор, при входе в который будет выдаваться команда на спон неписей, то всё равно придётся ковырять all.spawn. А если придётся ковырять all.spawn, то почему заодно не добавить нужных NPC на нужных позициях с заранее продуманной и настроенной логикой, которые "появятся" при входе в рестриктор?

Другое дело, если нужно, чтобы спон неписей происходил по условию (как ты вначале писал, по условной фразе в диалоге)... Стучись в личку.

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


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

Иногда самое интересное в логе вылета не всегда находится после "FATAL ERROR", а в предыдущих строках. Скинь полностью лог вылета.

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


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

лнкс, надо было выложить свою изменённую секцию, чтобы оценить, что к чему. В общем случае, если тебе нужно, чтобы на Кордоне спонились мастера-бандосы, сделай так:

[esc_bandit_respawn_2]:stalker
$spawn =  "respawn\esc_bandit_respawn_2"
character_profile = sim_bandit_master
spec_rank = master
community = bandit

И респонер при срабатывании выдаст тебе бандюгу-мастера. Но учти, что бандюги-мастера на Кордоне "жить" не смогут (в оргинале смарт "esc_fabrika_bandit"), т.к. в настройках сталкеры такого ранга не берутся в смарты Кордона (файл smart_terrain_presets.ltx). Поэтому, такой NPC заспонится только в случае, если где-то в каком-то "бандитском" смарте на бескрайних просторах Зоны имеется свободное место, подходящее по параметрам (группировка - бандит, ранг - мастер), и тогда, после своего "рождения", свеженький NPC тут же отправится в путешествие на ту локацию, где расположен пресловутый смарт.

А если тебе нужно, чтобы мастера-бандюги "жили" на Кордоне, в файле smart_terrain_presets.ltx измени (добавь) в секцию [l01_escape] бандитов-мастеров:

[l01_escape]
...
bandit = novice, experienced, master
...

 

Другое дело, как это скажется на общей картине (мастера на Кордоне крутовато-с :)), но тебе виднее, конечно... С другой стороны, можно, наверное, "поселить" одного бандюгу-мастера на Кордоне (ну, типа, это, "пахана" ;)). Как это сделать? Сделать это можно, добавив условие на какую-нибудь одну работу в гулаге смарта бандюков на АТП (файл gulag_escape.script), допускающее, что на эту самую работу может быть назначен либо сталкер (бандит) с рангом "мастер", либо, например, только NPC с именем "sim_bandit_master".

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


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

Artos, это я тебе возражу (и докажу) - т.к. в своё время всё то, о чём я говорил, неоднократно проверял, и всё это у меня и сейчас вполне так ничего себе работает :). Начнём сначала:

Файл 'smart_terrain_presets.ltx' является конфигом, который предназначен только для универсальных гулагов типа 'general_lager'

Для универсальных гулагов предназначен файл-пресет general_lager.ltx - а для "именных", как ты выразился :), предназначен тот, который я указал.

Далее:

респонеры NPC никаким местом не привязаны к каким-либо "гулагам". Поясняю ещё раз: любой респонер может плодить неписей для любых смарттеррейнов (или, если угодно, для "гулагов" :)), если он подходит по праметрам (повторюсь: в общем случае - группировка, ранг). Чтобы убедиться в этом, достаточно через некоторое время после начала игры (после срабатывания респонеров, это дело в разных модах реализовано совершенно по-разному) просмотреть глобальную карту (следует включить отображение всех NPC (или только сталкеров) на глобальной карте - как это сделать, пояснять, надеюсь, не потребуется?). В ярлычках неписей видно, что смарты наполнены совершенно разными респоновыми сталкерами, я имею в виду сталкерами, рождёнными совершенно разными респонерами. И не надо валить всё на алайф, "перегоняющий" сталкеров из одних смартов в другие, повторюсь: отслеживая путь любого NPC от респонера до смарта, становится очевидно, что никакие респонеры не привязаны ни к каким смартам. Единственные респонеры, срабатывающие в момент взятия NPC под гулаг (при условии, что условие для них прописано в смарте) - это респонеры, наполняющие ящики с барахлом в смартах. То есть, поменяв в конкретной секции "опытных" на "мастеров", ничего глобального ты не совершишь, т.к. в оллспоне есть куча других респонеров, которые наплодят и "опытных", и "новичков" в предостаточном количестве.

Далее:

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

Далее: ты, видимо, не знаком с тем фактом, что для любой работы в скриптовых файлах гулагов (тот же gulag_escape.script) можно создать условия "приёма на работу" (я частично уже отписывал, по каким параметрам это можно сделать - там ещё много чего можно "наусловить" :)). Эти условия называются predicate, и их, повторяю, можно применить к любой работе гулага. Если нужен конкретный пример - не поленись, загляни в этот файл (gulag_escape.script), и посмотри, как это реализовано для работы Волка или Фаната в смарте "лагерь новичков" (esc_lager). Таким образом, на работу "пахана" в смарте бандитов на АТП можно поставить условие, человеческим языком описываемое как "на работу принимается (назначается) только NPC с группировкой "бандит", с именем профиля "sim_bandit_master", и с рангом, равным 900 и более". Интересный факт: таким образом, кстати, можно обойти ограничение, выставленное для смартов Кордона в ltx-файле (конкретно smart_terrain_presets.ltx). Можно ещё кучу условий добавить :).

Заключение: в указанный смарт (esc_fabrika_bandit) в оригинальной игре принимаются NPC с группировкой "бандит", с рангами "новичок" (ранг менее 300), и "опытный" (ранг более 300 и менее 600). Никакие "мастера", заспоненные каким-то "назначенным именно для этого гулага" респонером под гулаг в смарте браться не будут. Чтобы изменить статус-кво, см. мой предыдущий пост - там всё для этого есть.

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


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

Artos, слово - не воробей, поэтому вот тебе тоже

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

Итак, пройдёмся сначала:

твоя реплика первого поста (главное выделено мной, =VENOM=) :

Именно для этого гулага в all.spawn'е организован респавнер 'esc2_respawn_bandits_fabrika', в котором и прописаны секции, которые будут спавниться (esc_bandit_respawn_1, esc_bandit_respawn_2)...

...и второго:

2. Где-то мною упомянута что респавнеры плодят объекты привязанные к гулагам? Само собою, отреспавненные объекты подчиняются тем конфигам, которые определены их секцией. Это кому-то нужно доказывать?

Не находишь странным, что сначала пишешь одно, а затем сам же от этого открещиваешься? Да ещё при этом неуклюже оправдываясь? Поэтому, специально для тебя (т.к. остальные в курсе) вот сделал несколько скринов (раз на словах с первого раза не доходит :D), доказывающие тот простой факт, что респонеры порождают NPC, не привязываясь ни к каким гулагам (локация Кордон, смарты esc_lager и esc_fabrika_bandit, второй после "зачистки", заполняемые сталкерами, порождёнными совершенно разными респонерами, и никаких "от ближайшей", как ты изволил выразиться):

8ec80c534d50aa7e25840e17d27bc820.jpg f6eb401b105a92f61d5ddcd8080cfd79.jpg e7321194863762ddcd23201ecef87b3b.jpg

 

А вот смарт esc_fabrika_bandit с изменёнными параметрами smart_terrain_presets.ltx - видно, что даже бандит "Фраер" прибежал через пол-Зоны, чтобы поселиться на Кордоне (остальные с рангом "мастер" порождены респонерами):

4b20cdeb2126d3abfb4476c260a9d178.jpg 051d90b8738bc67828c3c1030e16dd08.jpg daa55b72475385886363a3ad10cc94dd.jpg

 

Ну, и ещё кое-что, достойное внимания :D:

Простая правка строки респавнера, добавляющая иль заменяющая секции - и после перекомпиляции алл.спавна - АТП заматереит (после смерти существующих).

Что там "заматереит", гулаг или респонер? Гулаг от правки строки респонера ни на грамм не "заматереит", ни после смерти существующих, никогда вообще. А вот респонер станет плодить неписей с изменёнными парамертами.

 

Так что держи, Дружок, свой запал при себе, и запомни, что тема эта - не театр одного актёра, разглагольствующего о том, кому что стоит делать, а кому чего не не стоит, а для взаимопомощи моддеров.

[x]

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

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


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

Artos, насчёт модератора - это ты прав, пускай он даст оценку действиям - и моим, и твоим, в том числе.

А раз ты куратор темы, то ответь мне на вопрос (то есть, помоги разобраться).

Цитирую:

Слова о связи этого конкретного респавнера 'esc2_respawn_bandits_fabrika' упомянута именно из-за его закомментированной логики связанной с конкретным гулагом. И его близким расположением - ведь работа выбирается от ближайшей

...Прекрасно понятно (другим, а не тебе) что разработчиками этот респавнер предназначался именно для этого гулага. Хотя по сути, он также может служить и для других гулагов.

Говоря о том, что "разработчиками этот респавнер предназначался именно для этого гулага", ты связывался с разработчиками по этому вопросу, или это твои домыслы?

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

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


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

abramcumner, цитирую:

=VENOM=,

если хочешь, чтобы респавнеры работали в соответствии со своими названиями, то прописывай им respawn_radius. Но не уверен что это хорошая идея - может получаться как на свалке у ангара - непрерывный поток НПЦ. Сейчас от момента спавна до прибытия на точку проходит достаточно много времени именно из-за того, что НПЦ далеко идти от респавнера. А если бы все было как говорит Artos, то не успел бы обшмонать бандитов на АТП, как туда уже новые входят

Я, если честно, знаю об этом, и у меня в all.spawn уже давным-давно вообще нет тех респонеров, которые были в оригинальной игре (цель постановки вопроса была совсем в другом - и, в общем, достигнута ;)). Однако, с моей точки зрения, гораздо лучше оставить всё, как есть (т.е. оффлайновый респон всех NPC - и сталкеров, и... мутантов), иначе неудачно расположенные респонеры, подходящие по параметрам для смартов на текущей локации (достаточно далеко от "зачищаемого" смарта по respawn_radius) в некоторой степени лишат игру "симуляционной миграции" NPC между локациями. Что будет выглядеть не очень хорошо - как будто локации изолированы друг от друга. А насчёт "вербовщиков" - это, конечно, разработчику решать. Моё мнение - совсем уж сопливых новичков никто не ждёт в группировках - себе дороже обойдутся. Более логичным выглядело бы вербовать более опытных сталкеров, скажем, в Баре (тут, правда, есть проблема - в оригинальной игре Бар контролируют "долгари", как быть со "Свободой"?). Ну, а создать респонеры, срабатывающие по условию, проще простого. К примеру, у себя я сделал отслеживание продвижения игрока по локациям, и, по ходу игры - в соответствии с этими условиями - начинают включаться респонеры (чтобы они раньше положенного срока не плодили тех NPC, которые на ранних этапах не требуются). Ну, а некоторые, наоборот, отключаются. В значительной степни пришлось сделать это из-за АМК "оффлайн-алайфа", отключать который мне не хочется. Впрочем, можно чуточку "поколдовать", и сделать так, чтобы в зависимости от условий (функция, инфопоршн) один и тот же респонер будет порождать NPC селективно, а не по приоритетному выбору из нескольких секций, как сейчас.

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


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

В DLL-библиотеке оригинальной ТЧ просто-напросто нет функции teleport_npc (и подобных ей), поэтому ничего и не происходит.

  • Спасибо 1
  • Согласен 1

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


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

Проверка инфопоршна в простейшем случае, ("infoportion" - это имя инфопоршна):

 
if has_alife_info("infoportion") then
        --твой скрипт

end 

 

Что касается подобранного ГГ предмета. Если идти тем путём, как написано у тебя, то в файле bind_stalker.script найди функцию:

function actor_binder:on_item_take (obj)
        level_tasks.proceed(self.object)
        --game_stats.update_take_item (obj, self.object)
end

 

Так она выглядит в оригинальной ТЧ, у меня, по крайней мере.

И замени её на что-то вроде:

function actor_binder:on_item_take (obj)
        level_tasks.proceed(self.object)
        --game_stats.update_take_item (obj, self.object)
 
        if myscripts then
                myscripts.take_item(obj)
        end
 
end

 

Этим ты добавишь ссылку на свою функцию-обработчик взятия предмета. Можно, конечно, и прямо здесь вписать обработчик, но лучше хранить свои скрипты отдельно - потом проще будет найти, где чьи лапы и хвосты. Для этого нужно будет создать файл myscripts.script в папке с остальными скриптами, а уже в этом файле написать обработчик, примерно так:

function take_item(item)
        if item:section() == "section_name" then
                --твой скрипт
        end
end

 

Здесь функция будет срабатывать на взятие ГГ предмета с определённым названием (section_name).

  • Спасибо 1
  • Полезно 1

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


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

так?

Если проверку на взятие предмета в инвентарь ГГ тебе нужно проверять только после получения инфопоршна "vzial", так.

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


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

можно еще как нибудь так замутить:

 

Конечно, можно. Только надо учитывать, что функция-обработчик взятия предмета в инвентарь будет срабатывать в биндере актёра только в момент пополнения инвентаря после получения инфопоршна. В твоём варианте обработка всего инвентаря актёра (хотя и неявно) будет обрабатываться непрерывно, как только будет получен инфопоршн. В общем-то некритично, конечно - кому как...

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


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

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