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

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

Люди добрые, проблема возникла.

(если важно, действие происходит на подключённом к ТЧ Затоне)

 

Создаю спейс_рестриктор

[8886]

; cse_abstract properties

section_name = space_restrictor

name = osvedomitel_space_restrictor

position = -313.689331054688,9.79648113250732,413.422393798828

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 3665

distance = 0

level_vertex_id = 321903

object_flags = 0xffffff3e

custom_data = <<END

[logic]

active = sr_idle1

 

[sr_idle1]

on_info = %+osvedomitel_restrictor_info%

END

 

; cse_shape properties

shapes = shape0

shape0:type = box

shape0:axis_x = -313.689331054688,9.79648113250732,413.422393798828

shape0:axis_y = -313.689331054688,0,0

shape0:axis_z = 0,9.79648113250732,0

shape0:offset = 0,0,413.422393798828

 

; cse_alife_space_restrictor properties

restrictor_type = 3

 

 

Но инфопоршен выдаётся при заходе на локацию, а не в установленном рестрикторе месте.

?

Ссылка на комментарий

А какое имя смарткавера? Как в примере выше? Измени его на другое, т.к. имена смарткаверов типа смарттеррейн_animpoint_1 и.т.д используются как раз для автоматического "заполнения" нпс смарт-каверов в смарт-террейне.

Ссылка на комментарий

Ренсон, переделай логику:

[logic]
active = sr_idle
[sr_idle]
on_actor_inside = %+osvedomitel_restrictor_info%

Не бойтесь совершенства. Вам его не достичь.
C. Дали
Ссылка на комментарий

bf5f419c8991554901d7b47b2d82af605573f892281415.jpg

 

 

 

--------------------------------------------

Опытным путем выяснил что при use_camp = false всё срабатывает.... Но ведь при этом они будут молчать всё время....

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

Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

Ссылка на комментарий

Странно, вроде все ок, почему не работает - непонятно. Ну и последний вопрос - смарткавер на аи-сетке стоит?

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

[camp]

cfg = scripts\camp.ltx

 

Ссылка на комментарий

Смарт кавер стоит на аи сетке, накрыт камп зоной, всё работает нормально, но мне надо чтобы сталкеры сидели у костра как в тенях чернобыля, но анимация прописаная avail_animations = sit_ass срабатывает только при use_camp = false, но ведь при этом это уже не будут посиделки у костра.


Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

Ссылка на комментарий

Ну это то, о чем я говорил, нужно менять скрипты для анимпоинтов. Короче, если решишься, делаешь так:

Качаем вот это архив - http://depositfiles.com/files/4ijntt4ly, там скрипты. Заменяешь ими в папке gamedata/scripts в игре и обязательно в СДК-шной геймдате, иначе у тебя не появится в списке доступных анимаций для смарткавера sit_ass и sit_knee.

Далее перезагружаешь сдк, ставишь смарт-каверы, называешь как положено смарт_animpoint_1 и.т.д. Выбираешь для них сидячие анимации sit_ass и sit_knee. На sit_ass СДК начнет матюкаться красным что дескать отсутствует loopholes, не обращай внимания. Сними галку loopholes, чтобы потом при загрузке уровня каждый раз эти логи красные не видеть, в игре все равно анимация будет работать.

Обязательно снять галки с is combat caver и can fire, иначе при компиляции спавна с камп-зоной будут вылеты компилятора. Ну а дальше накрываешь это дело кампом, как грил выше, у кампа выберешь тип рестриктора NOT A restrictor (незнаю почему, но у пысов так), компилишь, спавн, наслаждаешься посиделками у костра, покупаешь мне и nuclia коньяк :)

 

Да, еще, направление взгляда нпс в этих каверах будет куда флажок в сдк показывает. Удачи!

Ссылка на комментарий

Clayman и nuclia спасибо огромнейшее.

Теперь другой вопрос:

Как заставить обозлится на ГГ НПЦ в нескольких смарт террайнах, когда гг атакует каго либо в одном из этих смартов?

И ещё

На sit_ass СДК начнет матюкаться красным что дескать отсутствует loopholes

А как добавить эти loopholes? Или хотябы в каких файлах смотреть примеры?

Зарание зпасибо.

 

Добавлено через 240 мин.:

И ещё, такая проблема:

Многие НПЦ с логикой walker в смартах часто становятся спиной к пути look. Что может быть причиной? Как исправить?

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


Команда ReWrite Team. От сталкера отошли. Пересели за другую платформу.

 

Ссылка на комментарий

Поиск не помог, потому и спрашиваю: как отследить то, что мини-карта включена/выключена? Например, при прицеливании через оптику или при диалоге она отключается. (Сталкер ЗП)

Жду ли я Сталкер 2? Хм...
Ссылка на комментарий
Gektor, надо связывать флаги точек путей walk и look, т.е в режиме редактирования point mode кликаешь на точке и отмечаешь галочку на флаге 0 например и тоже самое на точке look пути. Вобщем опять же учим матчасть на сталкервики "Логика НПС", там все это есть.
Ссылка на комментарий

PavelSnork

Попробуй по косвенным признакам - как раз по прицеливанию с оптикой - по db.actor:accuracy(), и для проверки наличия оптики вроде какая-то функция в ЗП появилась - и всяким окнам - диалог, инвентарь и т.д. - они по идее все сводятся к (level.main_input_reciever() ~= nil) - значит, что-то включено.

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий

PavelSnork

Для диалогов копай скрипт pda.script

Для прицеливания можно по device().fov - возвращает ширину зрения игрока, но тока учти что потом могут быть проблемы с модами, которые fov меняют, в оригинале фоу кажись толе 65 толи 55

 

Но вообще лучше забить на это всё.

 

> level.main_input_reciever()

Вроде в ЗП как раз вырезали его.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий
*Shoker*, да, сначала я использовал device().fov, но миникарта исчезала раньше, чем начинает уменьшаться этот fov, и мой элемент не успевал вовремя убраться. А с помощью проверки db.actor:accuracy(), которую посоветовал товарищ Kirag и моего шаманства, текстура миникарты исчезает чуть позже (хотя и успевает убраться до появления текстуры прицельной сетки), но синхронно с моим новым элементом худа. А с проверкой на диалог гг с НПСом мне уже помогли. С инвентарем проблем тоже нет (в ЗП миникарта не убирается при открытом инвентаре). А окно торговли и ПДА открываются поверх миникарты.
Жду ли я Сталкер 2? Хм...
Ссылка на комментарий

Добрый день!

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

Собрали пак локаций для ТЧ 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
Ссылка на комментарий

Хм... На первый взгляд все безобидно...

 

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

Просто так комментить - часть функций АМК не запустится или запустится с левыми параметрами, результат непредсказуемый.

 

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

Я так понимаю, это объекты, когда-то вызывавшие вопросы у разработчиков. Собственно, кроме вывода в лог инфы, что это за объекты, если они есть, ничего с ними больше не делается.

 

В общем, что могу посоветовать - продолжить поиски по Методу Научного Тыка, но уже комментируя отдельные блоки кода в этой функции. Точнее, сначала закомментировав все, раскомментировать их по очереди. Предполагаю, проблемы начнутся после раскомментирования одного из вызовов функций, с той функцией и надо разбираться...

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий

antreg

При запуске игры, в момент спавна актора в АМК вызывается 'on_game_load()' для первичных проверок/настроек и пр.

 

alife():object(2972) - проверка наличия объекта в игре с номером секции из all.spawn'a. В АМК 1.41 секции 9272 и 9275 - аномалии в ТД. (можно выкинуть)

 

Далее идет проверка и если требуется - предустановка pstor'аджа актора (хранилище сохраняемых в сэйвах переменных).

 

npc_spawner= из сэйва считывается массив заспавненных , но еще не инициализированных объектов (если таковые были в момент сохранения игры).

 

mod_call("first_run") - важный(!) вызов 'first_run()'первичных настроек в amk_mod.script ...

 

convert_timers() -- исправим старые названия таймеров - Можно выкинуть, это конвертер для старого формата из старых сэйвов сохранений игры.

 

gg_kick - флаг для алгоритма "шальная пуля" - можно выкинуть

 

mod_call("test_sleep_pp") - вызов 'test_sleep_pp()' из amk_mod.script ... (спальник)

 

mod_call("check_spawn") вызов 'check_spawn()' из amk_mod.script ... (ре)спавн объектов (npc_spawner, динамич.аномалии, ...)

 

val_actor_has_borov_key - пробуждение Кочерги ...

 

amk_mod.on_repbox() - это уже чье-то левое ...

 

gps_habar.on_game_load() - ну а это мод GPS-маячков для тайничков с пометками на карте

 

---

ERROR:___[bind_stalker.script]SAVE___FILE___IS___CORRUPT - говорит о том, что из пакет актора был некорректно считан из сэйва. У АМК есть свои нюансы работы чтения/записи пакета. Вполне вероятно проблема в упаковке в сэйв массива 'npc_spawner' ...

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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
Ссылка на комментарий

antreg

 

Но вот непонятно, это нормально, что два раза одно и тоже условие присутствует в функции? Имеется ввиду: if amk.load_variable("amk_13",0)==0

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

 

Что бросилось в глаза, что в обеих функциях упоминается конструкция alife():create(N), N - номер в алл.спавне. Но эти номера меняются при пересборке алл.спавна, тем более, что перебрали вы его серьезно. Вероятно, при попытке заспавнить что-то (но уже не то, что задумано) происходит конфликт...

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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