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

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


Svoboда

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

Добрый день!

Вопрос по характеристикам создаваемого смарт_террейна в аллспавне:

1) Каким образом правильно рассчитывать значение shape0:radius при создании нового смарт_террейна?

2) На что влияют вот эти два показателя (пример):

squad = х

groups = х

И как правильно выставлять значения (от чего зависят).

3) Как правильно выбирать тип:

restrictor_type = х

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

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


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

Real Wolf,

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

 

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

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


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

ФеНиКс,

Вылет из-за допустимо возможного веса инвентаря нового торговца (создавал нового торговца, признавайся?). Переводится как: --невозможно ходить из-за веса. Не установлены должным образом значения допустимого веса для торговца или не назначен ему класс trader.

 

Если укажешь при каких обстоятельствах вылет и на какой версии ТЧ делаешь эксперименты, то будет более ясно. Предположительно, работаешь на чистом ТЧ без АМК. Очень характерный, в этом случае, вылет, если назначить торговцем простого НПС без присвоения ему класса трейдера и "нагрузить под завязку" хабаром и оружием.

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

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


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

Добрый день!

Вопрос по вэйпойнтам walker_а:

Есть walker, который перемещается в точку №1, в которой отрабатывается анимация a=binocular (сотрит 5 секунд в бинокль в заданную точку look), затем он бежит по маршруту, состоящему из 3 точек, две просто пробегает, а в третьей точке ещё раз отыгрывается анимация a=binocular. Затем, продолжает свой маршрут ещё по трём точкам, две из который просто пробегает, а в третьей останавливается и смотрит в заданную точку look - это конец его маршрута, там он и должен остаться. Вот вэйпойнты данной схемы движения НПС:

[lesnik_look]

points = p0,p1,p2

p0:name = wp00|a=binocular

p0:flags = 0x1

p0:position = -165.067993164063,1.29299998283386,-54.8950004577637

p0:game_vertex_id = 3033

p0:level_vertex_id = 171004

 

p1:name = wp01|a=binocular

p1:flags = 0x2

p1:position = 132.341003417969,1.22800004482269,-127.251998901367

p1:game_vertex_id = 3085

p1:level_vertex_id = 472831

 

p2:name = wp02

p2:flags = 0x3

p2:position = 132.341003417969,1.22800004482269,-127.251998901367

p2:game_vertex_id = 3085

p2:level_vertex_id = 472831

 

 

[lesnik_walk]

points = p0,p1,p2,p3,p4,p5,p6

p0:name = wp00|a=run

p0:flags = 0x1

p0:position = -186.158004760742,0.848999977111816,-76.2170028686523

p0:game_vertex_id = 3033

p0:level_vertex_id = 149064

p0:links = p1(1)

 

p1:name = wp01|a=run

p1:position = -165.067993164063,1.29299998283386,-54.8950004577637

p1:game_vertex_id = 3033

p1:level_vertex_id = 171004

p1:links = p2(1)

 

p2:name = wp02|a=run

p2:position = -145.369003295898,2.41100001335144,-40.298999786377

p2:game_vertex_id = 3033

p2:level_vertex_id = 191929

p2:links = p3(1)

 

p3:name = wp03|a=run

p3:flags = 0x2

p3:position = -116.537002563477,1.24600005149841,-4.30299997329712

p3:game_vertex_id = 3046

p3:level_vertex_id = 224003

p3:links = p4(1)

 

p4:name = wp04|a=run

p4:position = -96.9739990234375,1.08000004291534,-1.39699995517731

p4:game_vertex_id = 3046

p4:level_vertex_id = 246426

p4:links = p5(1)

 

p5:name = wp05|a=run

p5:position = -26.0919990539551,1.08000004291534,54.3880004882813

p5:game_vertex_id = 3065

p5:level_vertex_id = 327759

p5:links = p6(1)

 

p6:name = wp06|a=run

p6:flags = 0x3

p6:position = 48.5219993591309,1.06900000572205,-28.6609992980957

p6:game_vertex_id = 3076

p6:level_vertex_id = 405556

 

 

Такая схема работает, но случается вылет, если во время пути сохраниться, а потом попытаться загрузить сохранение. В логе указывается на пути этого НПС, он как бы "теряется" при загрузке сэйва. Это первое. И второе, если НПС с такой схемой движения оказывается в оффлайне (ГГ от него уходит на расстояние алайфа), а потом снова переходит в онлайн при приближении актёра, то этот НПС заново отрабатывает весь путь от первой точки, ну, по крайней мере он оказывается в процессе перемещения к конечной точке. Понятно, что можно в логике НПС перевести его под [remark] или вначале под [remark], а потом опять под логику [walker], но с двумя новыми точками walk1 и look1 с теми же координатами, что были у последних точек walk и look предыдущего пути. Тогда этот НПС будет стоять на месте точно. Но хочется сделать более грамотно, в одной схеме.

Вопросы такие:

1) Вопрос №1: В конечной точке пути [lesnik_walk] (wp6 которая) прописана анимка |a=run. Возможно, это не совсем корректно. Что должно быть там? И ещё: в некоторых примерах путей "волкеров" в конечной точке прописаны такие анимки:

wp06|sig=final или

wp06|sig=return или

wp06|arrive

Что это за анимки и как они работают на финальной точке и на что влияют? Просто разницы большой не наблюдается.

2) Вопрос №2: Точек walk 7 штук, а точек look три. Эти три точки look флажками привязаны к трём точкам walk, которые не друг за другом идут. Надо ли в этом случае "связывать" точки look друг с другом линком, так же, как связаны точки walk?

Например, после первой и второй точки look будет так:

[lesnik_look]

points = p0,p1,p2

p0:name = wp00|a=binocular

p0:flags = 0x1

p0:position = -165.067993164063,1.29299998283386,-54.8950004577637

p0:game_vertex_id = 3033

p0:level_vertex_id = 171004

p0:links = p1(1)

 

p1:name = wp01|a=binocular

p1:flags = 0x12

p1:position = 132.341003417969,1.22800004482269,-127.251998901367

p1:game_vertex_id = 3085

p1:level_vertex_id = 472831

p1:links = p2(1)

 

p2:name = wp02

p2:flags = 0x22

p2:position = 132.341003417969,1.22800004482269,-127.251998901367

p2:game_vertex_id = 3085

p2:level_vertex_id = 472831

 

 

Предполагаю, что связывать в этом случае точки look не надо, но правильно ли это?

3) Вопрос №3: в точках walk флажки стоят только у тех точек, которые привязаны к точкам look, в которых отыгрывается анимация или в которой остановка и направление взгляда задаётся. У остальных точек walk pх:flags = не проставлены. Это правильно? Или же всё-таки надо проставлять флажки (с последовательными номерами) у всех точек walk?

Информации по таким тонкостям в сети практически нет, поэтому, думаю многим такая схема движения может быть интересна.

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

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


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

qwqwqw,

В твоей логике НПС находится под ремарком ([remark]). Ремарк - это переходное (временное) состояние, которое вставляется обычно как связующее между различными этапами логики. Под ремарком персонаж однозначно будет убегать в оффлайне, захватываться ближними, подходящими для него смарт_террейнами. Единственное,что его может удержать - это присвоить ему комьюнити = "trader". Чтобы НПС-сталкер был привязан к точке, у него должна быть логика, например, walker или camper и ещё обязательно прописать:

[smart_terrains]

none = true

Вот простенький пример, статичного НПС, который стоит на своём месте и никуда не дёргается (только на выброс реагирует, но потом возвращается на место):

[smart_terrains]

none = true

 

[logic]

active = camper@demon

combat_ignore = combat_ignore

 

[camper@demon]

path_walk = demon_walk

path_look = demon_look

meet = meet@demon

danger = danger_condition@demon

 

[danger_condition@demon]

ignore_distance = 0

ignore_distance_corpse = 0

 

[meet@demon]

use = true

use_wpn = true

meet_talk_enabled = true

 

 

path_walk = demon_walk

и

path_look = demon_look

Это пути данного персонажа. Они прописываются в соответствующий файл в acdc.

Вот так, например:

[demon_look]

points = p0

p0:name = wp00

p0:flags = 0x1

p0:position = -14.6759996414185,7.38600015640259,97.9469985961914

p0:game_vertex_id = 3061

p0:level_vertex_id = 340857

 

[demon_walk]

points = p0

p0:name = wp00

p0:flags = 0x1

p0:position = -12.9440002441406,7.38600015640259,95.0419998168945

p0:game_vertex_id = 3061

p0:level_vertex_id = 343200

 

 

path_walk - это точка, куда НПС приходит после своего спавна. Данная точка может совпадать с точкой спавна. В этом случае НПС заспавнится в точке своего назначения. А можно разнести точку спавна НПС и точку path_walk. Тогда НПС после своего спавна придёт в точку path_walk и в ней и останется потом.

path_look - это точка в которую напрвлен взгляд НПС.

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

[smart_terrains]

none = true

 

[logic]

active = walker@demon_ohr3

 

[walker@demon_ohr3]

path_walk = demon_ohr3_walk

path_look = demon_ohr3_look

danger = danger_condition@demon_ohr3

 

[danger_condition@demon_ohr3]

ignore_distance = 0

 

 

Вся разница в том, что в асдс прописаны две связанных точки пути walk и две точки look. Вот так:

[demon_ohr3_look]

points = p0,p1

p0:name = wp00

p0:flags = 0x1

p0:position = -54.443000793457,1.25100004673004,100.443000793457

p0:game_vertex_id = 3061

p0:level_vertex_id = 293842

 

p1:name = wp01

p1:flags = 0x2

p1:position = -27.3939990997314,1.25100004673004,69.2630004882813

p1:game_vertex_id = 3065

p1:level_vertex_id = 326060

 

[demon_ohr3_walk]

points = p0,p1

p0:name = wp00

p0:flags = 0x1

p0:position = -27.3939990997314,1.25100004673004,69.2630004882813

p0:game_vertex_id = 3065

p0:level_vertex_id = 326060

p0:links = p1(1)

 

p1:name = wp01

p1:flags = 0x2

p1:position = -54.443000793457,1.25100004673004,100.443000793457

p1:game_vertex_id = 3061

p1:level_vertex_id = 293842

p1:links = p0(1)

 

 

При такой логике, патрульный идёт в первую точку walk wp00, останавливается ненадолго и смотрит в "привязанную" к этой точке, с помощью flags, точку look и потом тоже самое во второй точке. Так и ходит бесконечно от точки к точке.

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

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


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

stalkers-life,

Ремарк бесусловно отличная схема, только не надо под ремаркой оставлять НПС. Если нужно вставить ремарку, чтобы, например, отыграть какую-нибудь анимацию или ещё что, то пожалуйста вставляйте, только потом опять надо перевести НПС под схему, например, walker.

Вот простой пример с включённой схемой [remark] в общую схему.

[smart_terrains]

none = true

 

[dont_spawn_loot]

 

[logic]

active = walker@postovoy

danger = danger_condition@postovoy

 

[walker@postovoy] --тут НПС стоит на месте, ждёт ГГ

path_walk = postovoy_walk

path_look = postovoy_look

meet = meet

danger = danger_condition@postovoy

on_info = {+skit_start_dialog_done} walker@postovoy1 --тут поговорили с этим НПС и после получения поршня, он бежит в назначенное место, сопровождая актёра.

 

[walker@postovoy1] --бежит.

path_walk = postovoy_walk1 --тут несколько точек пути прописано - маршрут следования

path_look = postovoy_look1

meet = no_meet --пока бежит, с ним поговорить не получится.

def_state_moving1 = run

def_state_moving2 = run

def_state_moving3 = run

danger = danger_condition@postovoy

on_info = {+skit_prishli} remark@postovoy --как добежал до точки, остановился и перешёл под ремарк

 

[remark@postovoy] --вот он ремарк №1, под которым НПС стоит временно на месте и с ним можно говорить.

anim = guard

target = actor

meet = meet --можно говорить

danger = danger_condition@postovoy

on_info = {+postovoy_first_dialog_done} walker@postovoy2 --после разговора, по факту получения поршня, НПС снова переходит в схему волкера и уходит на первую точку.

 

[walker@postovoy2] --возвращается на первую точку

path_walk = postovoy_walk2 --тут несколько точек пути, таких же, как и postovoy_walk1, но идущих в обратном порядке от маршрута postovoy_walk1

path_look = postovoy_look2

meet = no_meet --снова, пока бежит, с ним не поговорить

def_state_moving1 = run

def_state_moving2 = run

def_state_moving3 = run

danger = danger_condition@postovoy

on_info = {+postovoy_mesto} remark@postovoy1 --как добежал, то перешёл под вторую ремарку, под которой отыграется анимация для НПС - "смотреть в бинокль".

 

[remark@postovoy1]

anim = binocular --смотрит в бинокль

target = actor

meet = meet

danger = danger_condition@postovoy

on_timer = 10000 | walker@postovoy3 --через десять секунд переходит в первоначальное (исходное) стостояние валкера, стоящего на месте (в данном случае он постовой).

 

[walker@postovoy3] --вот в этом состоянии он и остаётся стоять на месте, так как точка пути postovoy_walk3 совпадает с последней точкой пути postovoy_walk2

path_walk = postovoy_walk3

path_look = postovoy_look3

meet = meet

danger = danger_condition@postovoy

 

[danger_condition@postovoy]

ignore_distance = 0

ignore_distance_corpse = 0

 

[meet]

use = true

use_wpn = true

meet_talk_enabled = true

 

 

 

qwqwqw ,

Это можно легко сделать в точках пути в аллспавне.

В нужной точке look, вставляешь анимацию. Пример:

[lesnik_look]

points = p0,p1,p2

p0:name = wp00|a=binocular

p0:flags = 0x1

p0:position = -165.067993164063,1.29299998283386,-54.8950004577637

p0:game_vertex_id = 3033

p0:level_vertex_id = 171004

Вот, он после того, как придёт в первую точку, посмотрит в бинокль, потом пойдёт лальше по своему пути. Если и в следующей точке look назначить анимацию "смотреть в бинокль", то и там он посмотрит в бинокль и пойдёт к следующей точке. Если точек walk и look всего две и они чётко связаны через flags, то патрульный будет ходить от точки к точке и в каждой точке будет останавливаться и смотреть в Бинокль. Главное, чётко назначить связи, между собой точек walk (через link) и привязку через flags точек look к точкам walk. Там, главное, чтобы "имена" flags совпадали по тем точкам, в которые НПС приходит (walk) и куда должен смотреть (look). Имеется ввиду вот это:

p0:flags = 0x1, затем, p3:flags = 0x2 и так далее. Точек walk может быть много, а точек look может быть всего две или три, например. ВОт и связи через флажки (flags) должны соответствовать чётко, не важно, это первая точка пути walk и первая точка look, или десятая точка walk и вторая точка look, главное, чтобы соответствовали флажки.

 

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

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


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

Arhara,

Да, всё именно так. Я же об этом и говорил, что нельзя оставлять НПС надолго под ремаркой. Обязательно надо переводить, если предполагается, что НПС уйдёт в оффлайн по сюжету, под схему волкера или кампера, напрмер. Но есть и одна хитрость: если хотите под ремаркой сделать НПС и чтобы он никуда не рыпался ни при каких обстоятельствах и опасностях, то, во-первых, можно назначить ему комьюнити торговца (trader), тогда и под ремаркой он всю игру будет игнорировать всё и вся.

И во-вторых, можно создать новую группировку (дело 10 минут) без гулагов. Присвоить НПС комьюнити новой группировки и всё.

 

Вот пример (так стоят на месте некоторые НПС в "Тайных Тропах" и никуда не уходят ни при каких обстоятельствах, так как принадлежат к комьюнити "stranger" или "trader"):

[smart_terrains]

none = true

 

[dont_spawn_loot]

 

[logic]

active = remark

trade = misc\trade_lektor.ltx --это, если торговец

combat_ignore = combat_ignore

 

[remark]

anim = probe_2 --ну, это для примера, крутит в руках прибор, если есть, а если нет, то оружие своё рассматривает.

target = actor

combat_ignore_cond = always

meet = meet

 

[meet]

meet_state = 10|guard@wait

meet_state_wpn = 10|backoff@threat_weap

victim = 10|actor

victim_wpn = 10|actor

use = true

use_wpn = false

syndata = backoff@threat_weap

 

[combat_ignore]

combat_ignore_cond = always

 

 

Но есть ещё выбросы, от которых тоже легко отстраниться, зарегистрировав отдельно взятого персонажа, или же целую группировку в исключения в файле: blowout_scheme.script

Вот тут:

function bind_scheme(npc,storage)

local evid_wounded=xr_evaluators_id.sidor_wounded_base

local monolith=npc:character_community()=="monolith"

local zombi=npc:character_community()=="zombied" or npc:character_community()=="trader" or npc:character_community()=="stranger" or npc:character_community()=="arena_enemy" or npc:name()=="mil_stalker0012" or npc:name()=="yantar_ecolog_general" or -- сумашедший на милитари и Сахаров

npc:name()=="mil_freedom_member0021" -- Скрягу в зомби!

Есть ещё масса способов оставить созданного скриптом НПС на месте.

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

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


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

Добрый день!

Есть вот такая нехитрая схема логики персонажа. НПС стоит на на одном месте и к нему по сюжету несколько раз возвращаемся:

;------------------------------------- haron --------------------------------------

[logic@haron]

active = walker@haron

 

[walker@haron]

path_walk = haron_walk

path_look = haron_look

meet = meet@haron

danger = danger_ignore@haron

on_actor_dist_le_nvis = 5 | remark@haron

 

[remark@haron]

anim = guard

target = actor

snd = haron_hello --это первый приветственный звуковой фрагмент персонажа

on_signal = sound_end| remark@haron2

meet = no_meet

 

[remark@haron2]

anim = guard

target = actor

meet = meet@haron

on_info = {+haron_burer_first} walker@haron2

 

[walker@haron2]

path_walk = haron_walk

path_look = haron_look

meet = meet@haron

danger = danger_ignore@haron

on_info = {+haron_doktor_done} remark@haron_and_mahon

 

[remark@haron_and_mahon]

anim = guard

target = actor

snd = haron_and_mahon --это второй звуковой фрагмент, получаемый в определённый момент по сюжету.

on_signal = sound_end| remark@haron_and_mahon2

meet = no_meet

 

[remark@haron_and_mahon2]

anim = guard

target = actor

meet = meet@haron

on_info = {+haron_naem_start} walker@haron3

 

[walker@haron3]

path_walk = haron_walk

path_look = haron_look

meet = meet@haron

danger = danger_ignore@haron

 

[danger_ignore@haron]

ignore_distance = 0

 

[meet@haron]

use = true

use_wpn = true

meet_talk_enabled = true

 

 

Проблема в том, что первый звуковой фрагмент говорится персонажем не один раз, а постоянно. И, после того, как по сюжету (после получения заданного инфопоршня) возникает второй звуковой фрагмент, то он дальше опять же зацикливается, а точнее, эти два фрагмента теперь идут друг за другом, при каждой встрече с этим НПС, после того как актёр поговорил, вышел в оффлайн и, затем, снова возвращается в онлайн к этому НПС.

Хотя, в схеме логики, после каждого этапа, присутствует переход в другую (следующую) схему walker. Что здесь не так?

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


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

Добрый день!

Возможно ли в логике отдельно взятого НПС запретить ему обыскивать трупы, когда они встречаются на его пути, чтобы он четко шел по своему маршруту, не отвлекаясь на это? Может быть, это нужно делать и не в логике, а в глобальном профиле персонажей, в файлах типа m_stalker.ltx?

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


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

Добрый день!

В аллспавне есть в секции респавна такой блок:

[respawn]

respawn_section = flesh_weak, flesh_normal,dog_normal

max_count = 8

min_count = 3

max_spawn = 3

idle_spawn = medium

conditions = {+agroprom_military_case_done} 80, 0

END

За что отвечают две цифры после "вероятности", выделенные синим?

Если 80 - понимать как вероятность в процентах, то на что тогда влияет значение "0".

gruber,

Хорошо, тогда, если вообще убрать эти цифры, тогда будет по умолчанию спавн всегда?

Или можно так:

conditions = {+agroprom_military_case_done} 100,

что, по сути, то же самое, по всей видимости.

 

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

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


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

Garry_Galler,

Полезная вещь, спасибо!

А можно ли и по шкале "Y" сделать скриптовую привязку?

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

Заранее спасибо!

 

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


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

Добрый день!

Существует ли такая схема логики для НПС в ТЧ 1.0004,

чтобы этот самый НПС следовал за актёром, пока актёр не дойдёт в назначенную точку?

Т.е нужна логика "догоняющего" НПС.

 

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


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

Добрый день!

Вопрос к специалистам:

Каким образом можно привязать старт диалога (появление диалогового окна с заданным диалогом) не к НПС, а к ситуации, то есть:

ГГ попадает в рестриктор рядом с каким-либо объектом (например с камазом, ну это не важно) и стартует диалог. Получается, как бы ГГ говорит с объектом. Видимо, в прекондишне к диалогу надо вызвать какую-то скриптовую функцию, которая принудительно открывала бы диалоговое окно, если я правильно понимаю. Вот вопрос, что за функция должна быть в этом случае?

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

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


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

malandrinus ,

Нет, нужно именно без собеседника.

Имитация разговора с неживым объектом нужна.

Диалоговое окно с заданным диалогом в отсутствие собеседника-НПС.

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


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

AKKK1,

Я, к сожалению, не специалист в таких тонких вопросах.

На сегоднящний момент пока присутствует "невидимка", которую любезно сделал по моей просьбе amik и которая выполняет простую функцию - присутствие диалога с объектом. Всё хорошо и всё правдоподобно кроме одного: объект большой, а невидимка-НПС маленький и не сразу получается отыскать точку, где нажатием кнопки открывается диалоговое окно. И ещё, если подойти под углом к невидимке, то точка активации

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

Если кто-то может помочь сделать функцию, которая бы автоматически открывала диалоговое окно с этим "невидимкой", когда ГГ заходит в рестриктор (2 метра радиус рестриктора от точки спавна НПС-невидимки) я был бы очень признателен! Нужна только функция и пояснения, если там надо на апдейт что-нибудь ставить. Всё остальное уже есть.

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

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


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

Министр,

Я конечно же читал статьи по ссылкам в шапке темы Маландринуса, поэтому и прошу помощи, так как сам не могу этого сделать, не понимаю многих моментов.

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

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


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

Добрый день!

Вопрос к специалистам.

Присутствует вот такой лог общеизвестного вылета, сделанный с помощью отладчика:

(привожу большую часть лога, так как там суть вопроса)

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0001'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0001'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0000'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0000'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0002'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0002'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0003'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0003'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0004'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0004'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0005'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0005'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0006'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0006'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0007'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0007'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0008'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0008'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0009'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0009'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0010'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0010'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='light_alarm_glass_0001'

! Unknown command: ZAMET:_bp:___init():___name='light_gas_r2_0000'

! Unknown command: ZAMET:_bp:___init():___name='light_gas_r2_0001'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0011'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0011'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='lights_camp_fire_omni_r1_r2_0012'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0012'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0000'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0001'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0003'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0004'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0005'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0006'

! Unknown command: ZAMET:_bp:___init():___name='pri_surprise_box_0008'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0000'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0001'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0002'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0003'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0004'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0005'

! Unknown command: ZAMET:_bp:___init():___name='level_prefix_inventory_box_0006'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0011'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

! Unknown command: ZAMET:restrictor_binder:load

! Unknown command: ZAMET:load_obj:___obj:name()='camp_fire_0011'

! Unknown command: ZAMET:load_obj:___ini_filename='<customdata>'

! Unknown command: ZAMET:load_obj:___section_logic='logic'

! Unknown command: ZAMET:load_obj:___active_section='nil'

! Unknown command: ZAMET:load_obj:___gulag_name='<nil>'

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : WinMain

[error]File : E:\stalker\patch_1_0004\xr_3da\x_ray.cpp

[error]Line : 736

[error]Description : <no expression>

[error]Arguments : stack overflow

 

 

Это вылет на ТЧ + АМК в Припяти. Вылет происходит при синхронизации (в самом её конце)

при переходе с Радара в Припять.

Как видно из текстового массива, полученного отладочным способом,

в процессе сканирования происходит возврат к одному и тому же рестриктору-пустышке под номером 0011,

на нём и происходит крэш игры без возможности продолжить игру никакими способами.

Вопрос собственно вот в чём:

Что такое этот самый рестриктор без логики, секция которого в аллспавне выглядит следующим образом:

[6565]

; cse_abstract properties

section_name = space_restrictor

name = camp_fire_0011

position = -4.02209758758545,3.58234667778015,200.165649414063

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 2117

distance = 0

level_vertex_id = 73868

object_flags = 0xffffff3e

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = 1.7837952375412,0,0

shape0:axis_y = 0,1.93420171737671,0

shape0:axis_z = 0,0,1.7837952375412

shape0:offset = 0,0,0

 

; cse_alife_space_restrictor properties

restrictor_type = 2

 

 

Подобных рестрикторов в Припяти 12 штук.

В чём смысл их работы и каково их назначение?

Увязаны ли такие рестрикторы как-то с секциями типа:

[6559]

; cse_abstract properties

section_name = lights_hanging_lamp

name = light_alarm_glass_0000

--или с секциями:

[6567]

; cse_abstract properties

section_name = zone_flame_small

name = zone_flame_small_0013

 

Может ли удаление из аллспавна объекта: lights_hanging_lamp

или zone_flame_small повлиять на такие последствия?

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

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


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

Добрый день!

Можно ли удалить скриптовой функцией спейс_рестриктор. Вот такой:

[6565]

; cse_abstract properties

section_name = space_restrictor

name = camp_fire_0011

position = -4.02209758758545,3.58234667778015,200.165649414063

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 2117

distance = 0

level_vertex_id = 73868

object_flags = 0xffffff3e

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = 1.7837952375412,0,0

shape0:axis_y = 0,1.93420171737671,0

shape0:axis_z = 0,0,1.7837952375412

shape0:offset = 0,0,0

 

; cse_alife_space_restrictor properties

restrictor_type = 2

 

 

Если да, то как должна выглядеть функция в этом случае?

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

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


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

Добрый день!

Помогите разобраться в одной ситуации:

Собрали пак локаций для ТЧ 1.0004 (для чистой игры). В паке убраны несколько оригинальных локаций и добавлены несколько новых. На чистом ТЧ 1.0004 всё работает, всё хорошо.

Провели адаптацию под АМК 1.4.1

Игра загружается, но получаем вылет при любом сэйв/лоад (сохранки не грузятся) или при переходе на другую локацию (вылет на синхронизации). Лог вылета (с отладчиком ZAMET):

* [x-ray]: economy: strings[6629 K], smem[28666 K]

! Unknown command: ZAMET:file____________:___system.ltx

! Unknown command: ZAMET:section___:___space_restrictor

! Unknown command: ZAMET:lines_________:___4

! Unknown command: ZAMET:line___0___:___$spawn___=___"ai\space_restrictor"

! Unknown command: ZAMET:line___1___:___GroupControlSection___=___spawn_group_restrictor

! Unknown command: ZAMET:line___2___:___class___=___SPC_RS_S

! Unknown command: ZAMET:line___3___:___script_binding___=___bind_restrictor.bind

! Unknown command: ZAMET:actor_binder:load():___self.object:name()='single_player'

! Unknown command: ZAMET:actor_binder:object_binder.load():___self.object:name()='single_player'

! Unknown command: ZAMET:ERROR:___[bind_stalker.script]SAVE___FILE___IS___CORRUPT

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description : <no expression>

[error]Arguments : LUA error: d:\st\008_tt2_final\gamedata\scripts\_g.script:20: bad argument #2 to

 

'format' (string expected, got no value)

 

 

Путём "научного" тыка определили, что виной всему всего одна функция в файле amk.script, которая вызывается из bind_stalker.script из функции actor_binder:net_spawn(data) (в самом конце этой функции).

Имя этой злополучной для нас функции: function on_game_load() . Как я уже сказал, она в файле amk.script

Вот эта функция:

--загружаем все переменные, которые нужно, вызывается загрузке игры, автоматически; вручную не вызывать

function on_game_load()

amk.mylog("on_game_load begin")

amk.mylog("object 2972 is "..((alife():object(2972) and alife():object(2972):name()) or "") )

amk.mylog("object 2975 is "..((alife():object(2975) and alife():object(2975):name()) or "") )

 

if db.storage[db.actor:id()].pstor == nil then

db.storage[db.actor:id()].pstor = {}

end

 

npc_spawner=unpack_array_from_string(load_variable("x_npc_spawner","") )

 

mod_call("first_run")

convert_timers() -- исправим старые названия таймеров

-- Метки теперь ставятся на серверные объекты. Обновлять их не нужно

--[[

local tmp,tmp1

for a=1,65534,1 do

tmp=load_variable("x_marker_type_"..a,nil)

if tmp~=nil then

tmp1=load_variable("x_marker_text_"..a,nil)

level.map_add_object_spot(a, tmp, tmp1)

end

end

]]

 

--user area

if system_ini():r_float("gg_kick","enabled")>0.0 then gg_kick=true else gg_kick=false end

mod_call("test_sleep_pp")

mod_call("check_spawn")

-- local str=string

if has_alife_info("val_actor_has_borov_key") and not has_alife_info("val_borov_dead") then

db.actor:give_info_portion("val_borov_dead")

end

 

amk_mod.on_repbox()

 

-----------

amk.mylog("on_game_load end")

gps_habar.on_game_load() --idler++--

end

 

Комментируем эту функцию в bind_stalker.script и всё становится нормально. Игра запускается, сэйвы работают, переходы тоже. Но это, ясно, что не панацея.

Вот тут и возникли вопросы:

1) Для чего эта функция? Что она делает?

2) Если её закомментировать, с чем столкнёмся в дальнейшем?

(Предполагаю, что убирать её нельзя).

3) Что, на ваш взгляд, может не нравиться игре в этой функции?

4) Что за объекты: (2972) и (2975), которые присутствуют в самом начале этой функции?

5) Как можно адаптировать эту функцию под нашу сборку, на что обратить внимание?

Заранее спасибо!

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

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


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

Kirag, Artos,

Спасибо за ответы!

"Глючными" оказались два колбэка функций из amk_mod.script:

mod_call("first_run")

mod_call("check_spawn")

function first_run()

if amk.load_variable("x_first_run",true) then

amk.g_start_timer("gg_need_sleep",0,0,6)

amk.g_start_timer("show_news",0,0,10)

amk.spawn_item_in_inv("matras")

amk.save_variable("x_first_run",false)

end

 

if amk.load_variable("amk_12",0)==0 then

amk.spawn_item("amk_zapiska",vector():set(-126.96,-28.41,-379.12),27,125181)

amk.spawn_item("amk_zapiska",vector():set(21.6,-3.94,-18.28),1140,5991)

amk.spawn_item("amk_zapiska",vector():set(-126.92,23.27,-36.98),1543,7083)

amk.save_variable("amk_12",1)

end

 

if amk.load_variable("amk_13",0)==0 then

-- pri_space_restrictor_0011

local obj = alife():story_object(830)

if obj then

alife():release(obj)

alife():create(7373)

end

amk.save_variable("amk_13",1)

end

 

if amk.load_variable("amk_13",0)==0 then

-- pri_space_restrictor_0011

local obj = alife():story_object(830)

if obj then

alife():release(obj)

alife():create(7373)

end

amk.save_variable("amk_13",1)

end

 

if amk.load_variable("amk_version",0)<1400 then

tmp_intro=true

amk.save_variable("amk_version",1400)

amk_anoms.pre_blow_off()

amk_anoms.after_blow_on()

spawn_military_btr()

spawn_fuel()

end

 

end

 

 

Тут как бы ясно, что у нас в сборке не совпадали стори_айди удаляемого рестриктора на стадионе в Припяти, который пролёт камеры активировал в оригинале, и вместо которого спавнилась в АМК аномалия, и стори_айди этой аномалии. Но вот непонятно, это нормально, что два раза одно и тоже условие присутствует в функции? Имеется ввиду: if amk.load_variable("amk_13",0)==0

function check_spawn()

amk_anoms.init()

spawn_unspawned_respawners()

if (news_main) then

news_main.init()

end

if (amk_offline_alife) then

amk_offline_alife.init()

end

if (amk_corpses) then

amk_corpses.init()

end

if (amk_objects) then

amk_objects.init()

end

 

--спавним аномалии

--initial_spawn()

local obj = alife():story_object(6000)

if not obj then

alife():create(2)

obj = alife():story_object(6000)

end

 

if amk.load_variable("freeplay",0)==1 then

amk.save_variable("freeplay",2)

elseif amk.load_variable("freeplay",0)==2 and (not has_alife_info("cit_fail_first_task")) then

db.actor:give_info_portion("cit_fail_first_task")

end

 

if not db.actor:has_info("val_chase_start") then

local objt = alife():story_object(6002)

if objt then

alife():release(objt)

end

end

 

--level_changers section

local lname = level.name()

local sname = amk.load_variable("level_on_save","")

 

if (amk_offline_alife) then

amk_offline_alife.update_npc_tables()

end

if (amk_corpses) then

amk_corpses.update_all_corpses()

end

if lname ~= sname and amk_objects then

amk_objects.update()

end

 

-- Выдадим сообщения при переходе на уровень.

if news_main then

if (lname ~= sname and sname ~= "") then

if (news_main.isIsolatedLevel(lname)== true and news_main.isIsolatedLevel(sname) == false) then -- Спустились под землю.

news_main.on_disconnect()

elseif (news_main.isIsolatedLevel(lname) == false and news_main.isIsolatedLevel(sname) == true) then -- Выбрались из-под земли.

news_main.on_connect()

end

if (amk_offline_alife) then

amk_offline_alife.update_trade()

end

end

end

 

if lname=="l01_escape" and sname=="l04_darkvalley" then

local obj = alife():story_object(6002)

if not obj then

alife():create(0)

end

end

 

if sname=="l01_escape" and lname=="l04_darkvalley" then

db.actor:set_actor_position(vector():set(-44.38, 0.43, -541.47))

end

 

--spots section

obj = alife():story_object(6001)

if obj then

level.map_add_object_spot(obj.id, "level_changer", "to_pripyat")

end

obj = alife():story_object(6002)

if obj then

level.map_add_object_spot(obj.id, "level_changer", "to_darkvalley")

end

if weather_types[lname]==0 then

w=amk.load_variable("dynweather",nil) or level.get_weather()

else

w=level.get_weather()

end

if amk.load_variable("blowout",0)>0 then amk.save_variable("weather",level.get_weather()) end

level.set_weather("amk_for_blow",true)

game.start_tutorial("restore_sun")

 

if amk.load_variable("blowout",0)>0 and amk.load_variable("blowout",0)<4 then

local bt=blowout_type()

level.add_cam_effector("camera_effects\\earthquake.anm", 2002, true, "")

if bt<1 then

level.set_weather("amk_for_blow",true)

level.add_pp_effector("vibros.ppe", 2001, true)

blowout_psy_sound("start")

end

end

 

if db.actor and not has_alife_info("game_over") then

local flame = db.actor:object("wpn_flame")

if flame then

db.actor:iterate_inventory(

function(dummy,item)

if item:section()=="wpn_flame" then

alife():release(alife():object(item:id()))

end

end

,db.actor)

 

end

end

end

 

 

А тут, по всей видимости, идёт мониторинг локаций, которые мы "выбросили": Кордон и Тёмная Долина, на которых спавнится левел_ченджер, по определённому условию появления перехода ЧАЭС-2 - Припять при выходе во Фриплей. Так?

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

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


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

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