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

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

07.06.2021 в 17:47, _Sk8_AsTeR_ сказал(а):

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

Есть какие-нибудь мысли, как это пофиксить?

Скорее всего, проблема в скриптах.

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

S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)


Подарки

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

    @WinCap эх, если бы такие были :(

    Все оригинальные, соляночные. Такая проблема была и в 10 соли и в 16 на  огср, например. 

    Я лишь модифицирую state_lib и state_mngr_animations_list, регистрируя новые анимки, после чего в gulag_уровень добавляю новые работы


    Подарки

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

    @WinCap проблема оказалась весьма специфична. Когда мы грузим сейв, то xr_gulag сразу берёт на себя всех НПС, что были в работе гулага в момент сохранения. И сразу же выдаёт им работу при условии, что они не находятся дальше контрольной точки гулага больше чем на 50 игровых метров. В такмо случае все НПС в момент загрузки сейва моментально получают работу и начинают её выполнение, без возможности сдвинуться с места (за исключением патрульных, у которых зацикленный набор вейпоинтов). Пробовал отключать перехват xr_gulag'а, в таком случае нпс доходят до точных координат, но работу не начинают. Казалось бы - вот он, выход из ситуации, задать небольшой таймер, чтобы гулаг сразу не перехватывал неписей, а давал им возможность дойти до точной координаты, чтобы после красиво сесть на стульчик, например.

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

    Эх


    Подарки

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

    @_Sk8_AsTeR_ 

    Откуда вообще уверенность, что перезапуск работы даст нужный результат? Ты ведь понятия не имеешь, как в движке работает алгоритм размещения моба на точке пути - что в приоритете: координата точки или аи-ноды, близкие этой координате. Точку пути ты в СДК ставил? Может она попала на границу двух аи-нод и движок периодически выбирает разные ноды для размещения объекта.

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

    @AndreySol ну я проверял опытным путём. Там оказалось всё хитрее даже, чем я предполагал. Те НПС, которые приходят из вне гулага, они регистрируются и спокойно проходят к тем вейпоинтам, которые заданы в path_walk, анимация отыгрывается верно.

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

    Я просто ковырял хр_гулаг и отключал обработку нпс во время загрузки сейва. В этом случае тот нпс, который при загрузке сместился, действительно отправился строго в ту точку, которую я прописал в path_walk, я отслеживал этот момент прям с точностью до ноль-десятых координат с помощью g_vertex_debug (OGSR). 

    Когда нпс приходит на точку он замирает, ожидая когда его обработает заранее мною отключенный xr_gulag. Ну, так и продолжает стоять. 

    Выходит что именно xr_gulag и заставляет всех нпс во время загрузки сейва моментально и без вариантов сразу приниматься за работу, не давая неписям даже шаг в сторону сделать (за исключением тех нпс. у кого в path_walk цепь вейпоинтов).

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


    Подарки

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

    @_Sk8_AsTeR_ 

    4 часа назад, _Sk8_AsTeR_ сказал(а):

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

    Ну так ты должен понимать, что спавн объектов делает движок, а не xr_gulag. Соответственно бесполезно дрючить xr_gulag, пытаясь в нем разрулить движковую проблему.

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

    @AndreySol Не спорю, что спавн объекта идет через движок, всё правильно. Но по поводу xr_gulag: из net_spawn при загрузке сейва идет вызов ф-ций в xr_gulag, после чего в этом же самом xr_gulag идет работа с нетпакетами, где проверяется работал ли НПС во время сейва. И если работал, то xr_gulag моментально заставляет этого НПС возобновить работату, не давая возможности сначала вернутсья на вейпоинт, если он немного сместился при сейв\лоаде. Вот что я наблюдал) 

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

    Есть нпс, которые находятся вне логики гулага, а стоят на своих личных path_walk'ax и path_look'ах, прописанных в саму логику непися. Они всегда со 100% вероятностью будут правильно отыгрывать анимацию в строго заданных координатах, всегда. Если при загрузке сейва они сместятся, то они сначала вернутся на вейпоинт. Потому что их не обрабатывает xr_gulag :)

    Опять таки, это всё лично мое наблюдение и мои выводы, которые я построил в результате экспериментов и изучения когда скрипта xr_gulag.

    Скрытый текст
    
    -- сохранения общего состояния гулага
    function gulag:save_common( packet )
    	packet:w_u8( self.casualities )
    	packet:w_u8( self.state )
    	utils.w_CTime( packet, self.stateBegin or smart_terrain.CTime_0 )
    
    	packet:w_u8(self.population)
    	packet:w_u8(self.population_comed)
    	packet:w_u8(self.population_non_exclusive)
    
    	packet:w_u8( #self.Job )
    
    	for i, job in ipairs( self.Job ) do
    		packet:w_u32( job.begin            or 0 )
    		packet:w_u32( job.fill_idle        or 0 )
    		packet:w_u32( job.idle_after_death_end or 0 )
    	end
    end
    
    -- восстановление общего состояния гулага
    function gulag:load_common( packet )
    	self.casualities = packet:r_u8()
    	self.state       = packet:r_u8()
    	self.stateBegin  = utils.r_CTime( packet )
    
    	self.population = packet:r_u8()
    	self.population_comed = packet:r_u8()
    	self.population_non_exclusive = packet:r_u8()
    
    	local n = packet:r_u8()
    	local job
    	for i = 1, n do
    		job = {}
    		table_insert( self.JobLoaded, job )
    
    		job.begin            = packet:r_u32()
    		job.fill_idle        = packet:r_u32()
    		job.idle_after_death_end = packet:r_u32()
    
    		if job.fill_idle == 0 then job.fill_idle = nil end
    		if job.idle_after_death_end == 0 then job.idle_after_death_end = nil end
    	end
    end
    
    -- сохранение информации об объекте
    function gulag:save_obj( packet, obj_id )
    	packet:w_bool ( self.Object_begin_job[obj_id] )
    	packet:w_bool ( self.Object_didnt_begin_job[obj_id] )
    	packet:w_u8   ( self.ObjectJob[obj_id] or 0 )
    end
    
    -- восстановление информации об объекте
    function gulag:load_obj( packet, obj_id )
    	self.Object[obj_id] = true
    	self.Object_begin_job[obj_id] = packet:r_bool()
    	--self.Object_didnt_begin_job[obj_id] = packet:r_bool()
    	local jobN = packet:r_u8()
    	if jobN ~= 0 then
    		self.ObjectJob[obj_id] = jobN
    	end
    end

     

     


    Подарки

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

    @_Sk8_AsTeR_, а функции save_obj/load_obj из xr_gulag используются где-нибудь?

    В них какой-то "непорядок" - сохраняются 3 переменные, а загружаются только 2.

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

    S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)


    Подарки

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

    @_Sk8_AsTeR_ , не там копаешь. Сохранение и загрузка гулага тут ни при чём. Неписи в баре сделаны с индивидуальной логикой, и они так же глючат порой. Тут либо вейпоинт-каллбэк рано срабатывает в move_mgr при загрузке, не давая неписю дойти до нужной точки, либо непись смещается уже после спавна на загрузке и срабатывания этого каллбэка. Или ещё что-то. В общем, в move_mgr смотреть надо.

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

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

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

    @naxac чёт я думал что в баре работы гулага. Хотя там же квестовики... 

    Окей, мерси за подсказку, буду мув менеджер ковырять) 


    Подарки

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

    Хотел добавить 2 кнопки при обыске трупов и ящиков! 1 кнопка выход(работает) в оригинале ее нету, 2 кнопка переместить всё из инвентаря ГГ в ящик\труп(не работает), нажимаю "переместить всё" результат 0 и вылетов нету. Может кто глянуть\посмотреть вот сам скрипт https://yadi.sk/d/dQ-plbh3CFkHSA

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

    Подарки

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

    @Colder, в вашем скрипте:

    1. Функция BodyAllclose - что это за переменная id?

    2. Функция get_items_from_box - переменная box откуда?

    • Нравится 1

    S.T.A.L.K.E.R. CoP Objects (upd 10.04.24)


    Подарки

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

    Не получаеться( или мозгов не хватает!

    Делаю так:

    Скрытый текст

    function transfer_all_to_box()
        local level_obj_by_id = level.object_by_id
        local box = level_obj_by_id(id)
        db.actor:iterate_inventory(function(actor, item)
        db.actor:transfer_item(item, box)
    end,
        db.actor)
    end

     

    Звук есть что перекладывает, но не чего не происходит.

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

    Подарки

  • Ссылка на комментарий
    7 часов назад, Colder сказал(а):

    Хотел добавить 2 кнопки

    Так в ЗП "взять всё" на кнопке Х забиндена, а в ТЧ легко в xml указывается кнопка на которой можно взять всё. Не проще ли посмотреть уже имеющееся в оригинале решение? Или это движковая фишка?

    Изменено пользователем Space.Marine
    Ссылка на комментарий

    Здрасьте.

     

    Задача: отсечь часть строки и преобразовать в число. При записи tonumber(str:gsub(…)) или tonumber(string.gsub(str, …)) вылет "bad argument #2 to 'tonumber' (base out of range)", при раздельной обработке ожидаемый результат – число. В чем причина?

    Spoiler
    
    local str = "abc_123"
    
    local id = tonumber( str:gsub("abc_", "") )			-- вылет
    local id = tonumber( string.gsub(str, "abc_", "") )		-- вылет
    
    local id = str:gsub("abc_", "")
    id = tonumber(id)						-- ок

     

     

    Мини-моды: ТЧ ЧН ЗП

    Шпаргалка

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

    Приветствую! Есть простой вопрос - как в скрипте получить сытость актора (ОП 2.1)?

    - вариант 1: log(db.actor:get_satiety()) -- вызывает краш - нет такого метода!

    - вариант 2: log(db.actor.satiety) -- тут всегда nil

    - вариант 3: ?

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

    @Norman Eisenherz , вторым аргументом в tonumber передаётся основание системы счисления (двоичная - 2, шестнадцатиричная -16 и т.д). string.gsub же вторым аргументом возвращает количество замен. Тут нужно отсечь второй аргумент, например так:

    tonumber( (string.gsub(str, …)) )

    • Полезно 1

    Аддон для ОП-2.09.2: Яндекс/Google/GitHub

    naxac.gif


    Подарки

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

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

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

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

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

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

    Войти

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

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

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

    AMK-Team.ru

    ×
    ×
    • Создать...