antreg 178 Опубликовано 25 Июня 2010 (изменено) Добрый день! Вопрос по характеристикам создаваемого смарт_террейна в аллспавне: 1) Каким образом правильно рассчитывать значение shape0:radius при создании нового смарт_террейна? 2) На что влияют вот эти два показателя (пример): squad = х groups = х И как правильно выставлять значения (от чего зависят). 3) Как правильно выбирать тип: restrictor_type = х Изменено 25 Июня 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 25 Июня 2010 (изменено) Real Wolf, Да читал, и не только там. Вопрос мой возник потому, что там, где Вы указали, ответов нет. Если знаете теорию в этом вопросе и конкретный ответ, то подскажите здесь. Спасибо. Изменено 28 Июня 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 18 Августа 2010 (изменено) ФеНиКс, Вылет из-за допустимо возможного веса инвентаря нового торговца (создавал нового торговца, признавайся?). Переводится как: --невозможно ходить из-за веса. Не установлены должным образом значения допустимого веса для торговца или не назначен ему класс trader. Если укажешь при каких обстоятельствах вылет и на какой версии ТЧ делаешь эксперименты, то будет более ясно. Предположительно, работаешь на чистом ТЧ без АМК. Очень характерный, в этом случае, вылет, если назначить торговцем простого НПС без присвоения ему класса трейдера и "нагрузить под завязку" хабаром и оружием. Изменено 18 Августа 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 2 Сентября 2010 (изменено) Добрый день! Вопрос по вэйпойнтам 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? Информации по таким тонкостям в сети практически нет, поэтому, думаю многим такая схема движения может быть интересна. Изменено 2 Сентября 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 14 Сентября 2010 (изменено) 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 и потом тоже самое во второй точке. Так и ходит бесконечно от точки к точке. Изменено 14 Сентября 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 14 Сентября 2010 (изменено) 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, главное, чтобы соответствовали флажки. Изменено 15 Сентября 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 18 Сентября 2010 (изменено) 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" -- Скрягу в зомби! Есть ещё масса способов оставить созданного скриптом НПС на месте. Изменено 18 Сентября 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 21 Сентября 2010 Добрый день! Есть вот такая нехитрая схема логики персонажа. НПС стоит на на одном месте и к нему по сюжету несколько раз возвращаемся: ;------------------------------------- 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. Что здесь не так? "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 9 Октября 2010 Добрый день! Возможно ли в логике отдельно взятого НПС запретить ему обыскивать трупы, когда они встречаются на его пути, чтобы он четко шел по своему маршруту, не отвлекаясь на это? Может быть, это нужно делать и не в логике, а в глобальном профиле персонажей, в файлах типа m_stalker.ltx? "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 4 Декабря 2010 (изменено) Добрый день! В аллспавне есть в секции респавна такой блок: [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, что, по сути, то же самое, по всей видимости. Изменено 4 Декабря 2010 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 10 Января 2011 Garry_Galler, Полезная вещь, спасибо! А можно ли и по шкале "Y" сделать скриптовую привязку? Просто необходимо переместить отображение на худе аптечек в правый верхний угол. Заранее спасибо! "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 25 Января 2011 Добрый день! Существует ли такая схема логики для НПС в ТЧ 1.0004, чтобы этот самый НПС следовал за актёром, пока актёр не дойдёт в назначенную точку? Т.е нужна логика "догоняющего" НПС. "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 31 Января 2011 (изменено) Добрый день! Вопрос к специалистам: Каким образом можно привязать старт диалога (появление диалогового окна с заданным диалогом) не к НПС, а к ситуации, то есть: ГГ попадает в рестриктор рядом с каким-либо объектом (например с камазом, ну это не важно) и стартует диалог. Получается, как бы ГГ говорит с объектом. Видимо, в прекондишне к диалогу надо вызвать какую-то скриптовую функцию, которая принудительно открывала бы диалоговое окно, если я правильно понимаю. Вот вопрос, что за функция должна быть в этом случае? Изменено 31 Января 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 31 Января 2011 malandrinus , Нет, нужно именно без собеседника. Имитация разговора с неживым объектом нужна. Диалоговое окно с заданным диалогом в отсутствие собеседника-НПС. "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 31 Января 2011 (изменено) AKKK1, Я, к сожалению, не специалист в таких тонких вопросах. На сегоднящний момент пока присутствует "невидимка", которую любезно сделал по моей просьбе amik и которая выполняет простую функцию - присутствие диалога с объектом. Всё хорошо и всё правдоподобно кроме одного: объект большой, а невидимка-НПС маленький и не сразу получается отыскать точку, где нажатием кнопки открывается диалоговое окно. И ещё, если подойти под углом к невидимке, то точка активации диалога будет оказываться напрвленной не на физобъект. Не очень это красиво получается, хотя компромисный вариант работает. Мод готов, осталась вот только эта мелочь. Если кто-то может помочь сделать функцию, которая бы автоматически открывала диалоговое окно с этим "невидимкой", когда ГГ заходит в рестриктор (2 метра радиус рестриктора от точки спавна НПС-невидимки) я был бы очень признателен! Нужна только функция и пояснения, если там надо на апдейт что-нибудь ставить. Всё остальное уже есть. Изменено 31 Января 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 31 Января 2011 (изменено) Министр, Я конечно же читал статьи по ссылкам в шапке темы Маландринуса, поэтому и прошу помощи, так как сам не могу этого сделать, не понимаю многих моментов. Изменено 31 Января 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 11 Февраля 2011 (изменено) Добрый день! Вопрос к специалистам. Присутствует вот такой лог общеизвестного вылета, сделанный с помощью отладчика: (привожу большую часть лога, так как там суть вопроса) ! 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 повлиять на такие последствия? Изменено 11 Февраля 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 12 Февраля 2011 (изменено) Добрый день! Можно ли удалить скриптовой функцией спейс_рестриктор. Вот такой: [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 Февраля 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 7 Июля 2011 (изменено) Добрый день! Помогите разобраться в одной ситуации: Собрали пак локаций для ТЧ 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) Как можно адаптировать эту функцию под нашу сборку, на что обратить внимание? Заранее спасибо! Изменено 7 Июля 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение
antreg 178 Опубликовано 7 Июля 2011 (изменено) 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 - Припять при выходе во Фриплей. Так? Изменено 7 Июля 2011 пользователем antreg "Тайные Тропы 2" техподдержка "Ф.О.Т.О.Г.Р.А.Ф" техподдержка Поделиться этим сообщением Ссылка на сообщение