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

Народная 2010 разработка


n6260

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

(изменено)
Куратор темы - sapsan

n6260, порадовал :good:

 

Надо просто запретить лечение в rx_ai.ltx

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

Вот как убедиться, что сделано то, что надо? Я игру запускал с правкой - внешне все как и было. Раненых правда не было в сейве, но и проблем вроде тоже никаких.

 

Monnoroch, а чего ты так уверен? Ну и что бы та ни было: вот нахрена нам аж три схемы лечения?

Ну с этим-то ты согласишься? Или считаешь, что они все нужны? :)

Кстати, причиной зависа может быть конфликт одновременно нескольких схем, вообще разных по направлению деятельности - смена визуала, оружия, и еще там какая-нибудь фигня... Но вот почему в нетпакет пишется мусор? Еще Камиказзе писал, что колбэки смертей глючат, но это - другой уже случай.

 

И давайте решать, чего делать будем. Все-таки, если уж на то пошло, наименее напряжным для самой игры будет, конечно, как Мон предложил: табличка всех квестовиков (по принципу Сяка секция№/стори_ид) - и вперёд. Повис квестовик - оживляем методом Сяка. Работает на-ура. Единственное - нужно будет убирать из диалогов проверки на инфо смерти, и все будет работать. Плюсом является то, что убиваем еще одного зайца: делаем наконец для ЖС список всех квестовиков, а не только тех ,что были по состоянию на апрель.

Второй вариант - опять же - Мон предложил :crazy: Делаем глобальную таблицу и пишем в нее все нетпакеты при спавне неписей, потом из нее восстанавливаем. У Станислава Лема, небось, подсмотрел ;) Для игры - напряжнее. Как еще применять - не знаю пока, но писанины и мучений будет будь здоров сколько.

 

проект глобального реинита всех схем раз скажем...в 10 минут?

Если возьмешься реализовать - я - за! :P

 

Мон, слова воровать - в моём вопросе не было. И, согласись, 1:1.

 

Это как ВСЕХ НПС в оффлайн убрать а потом резко вернуть.

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

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

 

а про 1:1 поподробнее пожалуйста)

Мон, Звездные дневники Йона Тихого, Путешествие четырнадцатое. Планета Интеропия. Бюро резервов. В инкубаторах хранятся данные все жителей планеты. Из-за частых метеоритных дождей очень вероятна неожиданная гибель индивидуума. Инкубатор тут же, в течение 15 минут поставляет резерв, и ты - как новенький :)

 

Йон - это единственная серия,которую я не читал у Лема

Ну, тогда - верю, что сам придумал! Тогда ваще - гений! :good:

 

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

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
я бы сказал - повально.

ага. Когда читаешь код - иногда волосы на голове шевелятся :rofl2:

 

Но одно дело - смеяться, и совсем другое - взять, да и переписать это все. Болото там уже такое, что увязнешь на первой же задаче - будь здоров.

 

при подходе к бару все проще.это уже решено
А поточнее? Где именно? Я не видел.

 

Ray, список имен - хорошо, конечно. Но нужна табличка как в срипте Сяка. Вот здесь:

local nepis={9501,4,5,6,7,9,22,32,92,104,107,115,302,370,400,406,505,506,507,516,702,7
07,728,734}
local nepis_id={8607,2509,2202,2165,2170,2183,2253,2233,2353,3069,3172,3090,3870,3902,
4857,4860,6063,6062,6064,6070,7100,7104,7105,7106}

Я в читспавнер чуток добавил (еще 12):

local nepis={9501,4,5,6,7,9,22,32,92,104,107,115,302,370,400,406,505,506,507,516,702,7
07,728,734,
9506,9510,9622,9800,9899,9509,9903,724,607,425,9613,777888}
local nepis_id={8607,2509,2202,2165,2170,2183,2253,2233,2353,3069,3172,3090,3870,3902,
4857,4860,6063,6062,6064,6070,7100,7104,7105,7106,
4199,3572,12458,2947,2949,3571,3668,7385,5957,4869,5871,7101}

(отбито новой строкой, что я добавил)

 

выяснить почему они не онлайнятся

Мон, ну да. И очень может быть что как раз потому, что подвешены, будь они неладны. Мы пстор-то переписали, а остальная, подводная часть айсберга - вот та вся офигеннейшая таблица со всякими там коммьюнити и прочими важными вещами?

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
Разберешься - проблема решена.

Monnoroch, и всего-то. Уже пытался. Кой-чего нашел, но все ли, что надо - хз.

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

 

dimos, выяснили уже про схемы лечения. Вот Мон уверен, что они не виноваты. И что-то мне подсказывает, что он может быть и прав.

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, тема та - про янтарь, на одну страницу. Про бар там - ни слова, я читал уже это.

 

прописать всем более-менее значащим челам СИДы.

Arhara, возможно, без сидов можно и обойтись... Хотя, по методу Сяка - вроде как нет. Но нам ведь никто не мешает назначать произвольный сид при переспавне. Главное - номер секции из аллспавн иметь. А если сида нет - назначаем заведомо не имеющийся в игре. Напимер, с миллионов каких-то. Там ведь неважна последовательность. К тому же, сид можно и прочитать у подвисшего и именно его и использовать - т.е. если в аллспавн его не было - в табличке будет пустое поле или запуск ф-ции вычисления, какой сид назначила игра :) Так что, Дима, не бери в голову. Я так понимаю, тебе и так есть чем заняться ;)

 

о, dimos, сделай доброе дело: собери из аллспавн номера секций - возьмешься ?

Я распишу, как и что делать, если согласен. И разобранный алл дам.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
Shadowman, отбой,Архара это дело уже поправил видимо...

На что отбой? На зависы, что ли?

 

А мелкие правки, которые каждый вносит для себя: видимый холодец, графические моды и т.д. С ними как быть?

Ray, элементрано! Рядом с упакованной геймдатой прилагается архивчик папок кофиг и скриптс, который весит 2 Мб :)

 

Arhara, а никак не сможешь выдать алл хотя бы? Или неокончательный вариант?

 

Monnoroch, А, на бар... Фух. Напугал. Три бессонные ночи - и коту под хвост? Было бы обидно :)

Monnoroch, так текстурка ведь в бинарнике модели самой запихнута. По-моему, так. Ее и не в игре не так-то просто поменять, не то что "на лету".

 

Хотя, есть идея! Файловые операции в луа ведь никто не отменял? Переименовываем скриптом файлик текстуры, кладем куда надо - вуаля! Во!

 

Monnoroch, кстати, с выводом в лог - будет выводиться не только что сейв коррапт, но и кто виновник. Очень удобно :)

А по выводу - он же теперь не в апдейте?

Monnoroch, Я тут ничего не изобретал. Ту отладку из апдейта убрал, а вот это

if reader:r_eof() then
    abort("SAVE FILE IS CORRUPT motivator_binder:load "..self.object:name())
  end

есть в 4-х скриптах, по неписям - в мотиваторе. Я добавил только ..self.object:name() :)

вот в этих:

.\aem_bind.script:174: abort("SAVE FILE IS CORRUPT aem_mob_binder:save "..self.object:name())

.\bind_monster.script:462: abort("SAVE FILE IS CORRUPT generic_object_binder:load "..self.object:name())

.\bind_stalker.script:780: abort("SAVE FILE IS CORRUPT actor_binder:load "..self.object:name())

.\xr_motivator.script:490: abort("SAVE FILE IS CORRUPT motivator_binder:load "..self.object:name())

 

Monnoroch, ну, во-первых, на момент выдачи этого лога - еще-таки коррапт :) А во вторых, мы еще это не победили, "не кажи гоп... "

 

Мда. Хорошо бы было конечно. Но пространство имен os из движка выкинули :(

 

C++ class FS {
    const FS_ClampExt = 4;
    const FS_ListFiles = 1;
    const FS_ListFolders = 2;
    const FS_RootOnly = 8;
    const FS_sort_by_modif_down = 5;
    const FS_sort_by_modif_up = 4;
    const FS_sort_by_name_down = 1;
    const FS_sort_by_name_up = 0;
    const FS_sort_by_size_down = 3;
    const FS_sort_by_size_up = 2;

    function get_file_age(string);
    function file_length(string);
    function file_rename(string, string, boolean);
    function r_open(string, string);
    function r_open(string);
    function append_path(string, string, string, number);
    function file_copy(string, string);
    function get_file_age_str(FS*, string);
    function dir_delete(FS*, string, number);
    function dir_delete(FS*, string, string, number);
    function update_path(FS*, string, string);
    function r_close(reader*&);
    function exist(string);
    function exist(string, string);
    function w_close(class IWriter*&);
    function file_list_open(FS*, string, number);
    function file_list_open(FS*, string, string, number);
    function path_exist(string);
    function file_list_open_ex(FS*, string, number, string);
    function get_path(string);
    function file_delete(string, string);
    function file_delete(string);
    function w_open(string, string);
    function w_open(string);
};

 

Так что, какой-никакой, а способ имеется :)

-noprefetch не поможет?

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Arhara, патч с НГ будешь выкладывать сейчас, или уже передумал?

Ну, я имею в виду, в ближайшее время :)

 

виснут, однозначно. от того. что пытаются осуществить сразу несколько действий

Я про это уже, кстати, сегодня писал:

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

 

Да никто и не ждет, что без НГ обойдется. По крайней мере, я - так точно.

Хочешь - могу на выходных с чем-нибудь повозиться. Со скриптами Бака, например (на пердмет добавления недостающих секций стволов и что там еще).

Только ты потом подскажи, что конкретно надо.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Я так и не увидел ответа на свой вопрос: так что, собственно с биндерами неписей делать?

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

Переспавнивать критичных, или пытаться по методу, что Монорох предложил (с глобальной таблицей нетпакетов)? Оба метода имеют свои недостатки (первый - аллспавн'о зависим, требует при каждой новой версии алл перезаполнения первой колонки цифр - номеров секций; второй - будет нагружать движок перезаписью глобальной таблицы и еще не разработан).

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

 

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

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

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
как их правильно юзать - фиг знает

Monnoroch, вот именно. Что писать? Чтоб вычислить как работает и потом проверить, что получается - придется написать гору отладки.

Мне на разработку понадобится не менее недели, даже если помощь чья-то с неба свалится вдруг (учитывая праздники - м.б. и более, еще возможно что уеду на неделю в начале года).

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

А сейчас, если Архара выпустит патч, включим в него первый вариант.

Все, сейчас ухожу. Буду вечером.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
ни одна запятая или идея не попадёт в солянку

Arhara, что-то я, видимо, пропустил... О чём была речь ? :crazy:

Сообщение от модератора меченый(стрелок)
и ты ,мой друг, можешь не беспокоится ;)

То, что выложено выше , было решено давно выложить, но никак не получалось , а вот сейчас получилось... А Дима, немного не в курсе ;)

Изменено пользователем меченый(стрелок)

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, я другое вчера пробовал. Теперь отхожу :)

 

Есть вопрос к скриптерам. Написал такую ф-цию.

function get_obj_name(obj)
    local s_name = ""
    local i = 0
    if (news_main.isGameObject(obj) and obj.section) then
        -- s_name = obj:section()
        i = string.find (obj:name(), tostring(obj:id())) --,1,true
        if i then
            -- get_console():execute("load ~#I#: начало id с символа "..i)
            s_name = string.sub(obj:name(),1,i-1)
        else
            s_name = string.sub(obj:name(),1,-1)
        end
    elseif (obj.section_name) then
        s_name = obj:name() --obj:section_name()
    end
    if (s_name == nil) then s_name = "" end    
    return s_name
end

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

 

И еще один вопрос. Есть ли способ скриптом проверить, есть ли объект в аллспавн и узнать номер его секции?

 

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

Сообщение от модератора меченый(стрелок)
Shadowman, да вроде нет, не велосипед ;)...
Изменено пользователем меченый(стрелок)

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, ну да, у меня эта ф-ция и есть. В скрипте со всеми таблицами уборщика

Просто уборщик получает имя всегда как серверного обжа, а когда понадобился игровой - оказалось, что obj:section() - это stalker, stalker_sakharov - у всех сталкеров поголовно. Не та секция короче. Вот, переписал. Решил уточнить - может, есть более простой путь. В чем лукавство-то усмотрел? :blink:

Ф-ция эта в таком виде, как я здесь показал - пока в единственном экземпляре, только на моем компе ;)

 

меченый(стрелок), то есть я так понял, что одобряешь? :D

По аллспавну - очень бы хотелось положительного ответа. Но, видимо, не судьба :(

 

Monnoroch, кстати, по нетпакету: ты сам понял, какую грандиозную вещь ты придумал? Это же фактически можно сейвы редактировать!

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

 

В личку кинуть, или запостить? ;)

Запостил.

А по файлам - вот Shoker такое написал.

-- Запись в таблицу 
function god_dialog:OnButton_btn2_clicked()
      pos_x = tostring(self.edit_box:GetText())
      pos_y = tostring(self.edit_box2:GetText())
      pos_z = tostring(self.edit_box3:GetText())
      pos_name = tostring(self.edit_box4:GetText())

if pos_x~="" and pos_y~="" and pos_z~="" and pos_name~="" then
    self.settingFileName = "gamedata\\teleports_coordinats.txt"
    local file = io.open( self.settingFileName, "a" )
    if file ~= nil then
        file:write( pos_name.."|"..pos_x.."|"..pos_y .."|"..pos_z.."\n")
        file:close()
    end
      self:ModeChanges()
end

end

Правда, это для ЗП. Работает ли в ТЧ - не проверял. Файл должен быть предварительно создан.

 

 

ха,я думал ты написал а потом забыл и снова написал))

Такая история у Дэна, по-моему наблюдается: у него в браад две функции ограбления ГГ одинакового назначения.

К тому же, список исключений, чего отбирать нельзя - был разный у каждой из ф-ций :)

 

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

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

Есть класс FS, но, похоже, записать файл нельзя, можно только прочитать...

Мон, спасибо, что поправил :) К сожалению, это не решает проблемы - файл в ТЧ не запишешь. Очень жаль. Можно только в лог записать.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
я кинул скрипт который облегчает работу с ини файлами до не хочу

меченый(стрелок), это тот, что для телепортов в спавнер? А все, понял amkII_ini. Классная штука!

Сообщение от модератора меченый(стрелок)
Точно , о нём! рад что он будет полезен! я , кстати, за то , чтобы каждый скрипт ,или почти, использовал свой фаил настройки(это позволяет пользователям настраивать скрипт под себя без знания Lua). Так сказать лояльное отношение к Юзерам ;)

 

Monnoroch, вечером попробую. Лог вполне может и навернуться от таких объемов. Хотя - попробую, конечно.

Да, я в курсе, что там у каждого непися по таблице. Это надо будет слегка поизвращаться, чтобы увидет ее в логе. Но должно получиться.

А лог, когда из апдейта шел - валил игру минут за 5-7 :)

 

Monnoroch, а зачем очищать табличку? А если при загрузке игры у непися уже мусор в пстор (тоже, кстати, надо как-то проверять предварительно и не писать, если уже биндер зависший)? Если в сейве ее не будет (т.е. она будет пустой) - то тогда и смысла нет ее создавать.

Кстати, ловлю вылет на несуществующий packet_table именно поэтому, наверное. (attempt to index global packet_table (a nil value)), хотя в мотиваторе объявил ее глобальной и вроде как запись туда в мотиваторе сработала. По-видимому, amk.write_stalker_params надо все-таки ставить внутрь условия if packet_table[npc_id] then

Изменено пользователем меченый(стрелок)

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
чтобы каждый скрипт ,или почти, использовал свой фаил настройки(это позволяет пользователям настраивать скрипт под себя без знания Lua)

Вообще-то хорошо бы. Только тормознутая это штука - чтение конфигов. Надо тогда внимательно смотреть, чтобы "с водой не выплестнуть и ребенка" ;)

В смысле, в каких-то скриптах чтение конфигов может сильно сажать быстродействие.

 

Arhara, не не в сидах дело. Все равно, раз начали - нужно довести до логического конца.

А СИДы - не помогут, что так - что эдак. Восстановление нужно делать с названием секции из аллспавн (цифровым). А СИД - можно либо взять из того же аллспавн, либо прочитать у зависшего непися перед переспавном. Димос подмогнет чуток с табличкой названий секций, я напишу что-нибудь для вытаскивания цифири из аллспавн (как Меченый предложил) - и будет этот вариант.

Если не получится фокус с нетпакетом - все равно будет этот запасной вариант :)

И что-то мне подсказывает, что фокус с нетпакетом должен получиться...

 

Monnoroch, я тут кстати подумал: а зачем, собственно, искусственно портить кому-то пстор после НГ. Я могу просто-напросто катануть зависшему неписю пстор аналогичного (я про свой конкретный пример - это охотник бар_охотник_респавн1), можно просто закатать ему нетпакет какого-нибудь рядом имеющегося, типа бар_охотник_респавн2. И, кстати, попортить пстор (именно мусором заполнить) - не так и просто. Нужно убирать зэкер из функции его записи. Так что непонятно, как тот мусор у него вообще мог появиться.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, а чем лучше записать скриптом в пстор что-то левое? В записи из хр_лождик стоит заглушка, там левого ничего писаться не должно.

И если я эту заглушку не сниму - то и сам ничего левого не запишу :)

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

 

меченый(стрелок), по поводу амк2_ини и того, что мне нужно сделать:

очень надеялся, что можно, зная параметр (например, name) из аллспавн (или любого другого конфига) получить имя секции. Но, по-видимому, можно только наоборот. Собственно, это к любому конфигу применимо.

Т.е. заполучить список всех секций, или с какими-либо условиями по параметрам - не судьба :(

Ну, можно, наверное, читать файл построчно и потом отсеивать, но это уже - вообще изврат.

Вобщем, придумал уже, как это сделать; не без изврата, то приемлемо :)

 

Monnoroch, не знаю. Пока что все это дело работает при загрузке сейва. Вся кухня вылетает уже после записи нетпакета в ф-ции gulag:removeObject( obj_id ) в строке if not self.npc_info[obj_id].exclusive then с ругательством на нил в поле '?'

Перезаписал нетпакетом аналогичного охотника. Этого точно делать нельзя. Хочешь, нетпакет непися покажу? ;)

! Cannot find saved game ~#i#: pstor_load_all:bar_ohotnik_respawn_1 id: 14026 ctr=4

! Cannot find saved game ~~~ updu8u2 => 0

! Cannot find saved game ~~~ updgroup => 0

! Cannot find saved game ~~~ class => sim_arhara_green_regular

! Cannot find saved game ~~~ updmodel => 1.9438806772232

! Cannot find saved game ~~~ upddir =>

! Cannot find saved game ~~~ y => -0

! Cannot find saved game ~~~ x => 1.9438806772232

! Cannot find saved game ~~~ z => 0

! Cannot find saved game ~~~ obs32u3 => -1

! Cannot find saved game ~~~ team => 20

! Cannot find saved game ~~~ killerid => 65535

! Cannot find saved game ~~~ charname => Герман Омут

! Cannot find saved game ~~~ money => 5000

! Cannot find saved game ~~~ crvu32u16u1 =>

! Cannot find saved game ~~~ updu16u1 => 1229

! Cannot find saved game ~~~ profile => stalker_green_bar1

! Cannot find saved game ~~~ smtrtaskactive => 0

! Cannot find saved game ~~~ lvid => 36450

! Cannot find saved game ~~~ infammo => 1

! Cannot find saved game ~~~ gvid => 1229

! Cannot find saved game ~~~ oflags => -65

! Cannot find saved game ~~~ group => 0

! Cannot find saved game ~~~ vsu8u1 => 0

! Cannot find saved game ~~~ obf32u1 => 10.5

! Cannot find saved game ~~~ updhealth => 1

! Cannot find saved game ~~~ upds32u4 => 1091317111

! Cannot find saved game ~~~ updteam => 20

! Cannot find saved game ~~~ huvu32u8u1 =>

! Cannot find saved game ~~~ 1 => 2

! Cannot find saved game ~~~ 2 => 1

! Cannot find saved game ~~~ 3 => 0

! Cannot find saved game ~~~ 4 => 1

! Cannot find saved game ~~~ 5 => 2

! Cannot find saved game ~~~ squad => 0

! Cannot find saved game ~~~ upds32u3 => 1091317111

! Cannot find saved game ~~~ game_death_time =>

! Cannot find saved game ~~~ 1 => 0

! Cannot find saved game ~~~ 2 => 0

! Cannot find saved game ~~~ 3 => 0

! Cannot find saved game ~~~ 4 => 0

! Cannot find saved game ~~~ 5 => 0

! Cannot find saved game ~~~ 6 => 0

! Cannot find saved game ~~~ 7 => 0

! Cannot find saved game ~~~ 8 => 0

! Cannot find saved game ~~~ smtrid => 10887

! Cannot find saved game ~~~ visual => actors\hunters\hunter1

! Cannot find saved game ~~~ baseinr =>

! Cannot find saved game ~~~ communityid => 16

! Cannot find saved game ~~~ updsquad => 0

! Cannot find saved game ~~~ reputation => 100

! Cannot find saved game ~~~ huvu32u8u2 =>

! Cannot find saved game ~~~ 1 => 1

! Cannot find saved game ~~~ 2 => 1

! Cannot find saved game ~~~ 3 => 2

! Cannot find saved game ~~~ 4 => 1

! Cannot find saved game ~~~ updpos =>

! Cannot find saved game ~~~ y => -0.00096631050109863

! Cannot find saved game ~~~ x => 132.68312072754

! Cannot find saved game ~~~ z => 70.187408447266

! Cannot find saved game ~~~ obs32u2 => 1

! Cannot find saved game ~~~ upds32u1 => 84648

! Cannot find saved game ~~~ baseoutr =>

! Cannot find saved game ~~~ custom => ; stalker_custom_data.ltx

[game_info]

 

! Cannot find saved game ~~~ updu16u2 => 1229

! Cannot find saved game ~~~ crvu32u16u2 =>

! Cannot find saved game ~~~ health => 1

! Cannot find saved game ~~~ sid => -1

! Cannot find saved game ~~~ rank => 622

! Cannot find saved game ~#i#:непись: bar_ohotnik_respawn_114026 записан в packet_table

 

 

 

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

Кстати, массив имен секций получить можно. Не совсем автоматически, к сожалению... сортировкой строк с последующим сохранением в табличку результата сортировки :D ..А потом перебрать уже эту табличку

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

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, а pstor_load_all работает единожды, при старте с сейва или при загрузке локи.

Отлов поставить раз в пару секунд - должно успевать отрабатывать.

 

А откуда же еще? Тогда при отлове зависа - будет принудительная перезапись нетпакета из твоего скрипта. При загрузке сейва будеть запись таблички, вот только если каким-то образом непись уже будет зависшим при загрузке сейва - тогда уже нужен вариант переспавна. А для этого Dimos потрудился: составил табличку секций ~240 неписей, имеющих квесты или влияющих на сюжет. Остальных, как ни жаль, но придется убить. Скрипт будет выдавать номера секций и сиды из таблицы (сиды, не прописанные в аллспавн - будут браться от тех, кого удаляем перед переспавном), остальное Сяк уже давно написал :)

 

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

Никогда специально такое не захватишь. Как предугадать, что непись зависнет в текущем сеансе?

И принудительно записать криво нетпакет - тоже не так-то просто, там, видимо, еще какая-то проблема параллельно встречается.

Имхо, зависает какой-то из колбэков или что-то такое, что никак в логе не отражается, да еще и в нетпакет без проверки попадает мусор. Вообще обалдеть. КАК?

 

V92, попробую, спасибо. Тут довольно частый вылет нарисовался: xrs_utils.script:888. Как раз со сменой визуала связанный. Так давно это уже в Соли - и видимо так же давно и глючит. И что интересно, у кого-то это ведь вылет вызывает, а получается, у кого-то неписи при этом виснут... Интересно.

 

Monnoroch, не понимаю одной вещи: вот мы при зависе проверяем в нетпакете содержимое переменной us, которую пишем в апдейтере.

Ну и почему этой переменной нет ни в одном нетпакете (а должна быть по идее =0 в каждом "здоровом" - ведь в конце апдейтера, т.е. при успешном завершений всех измывательств над неписем именно это ей и присваиваем)? Ведь если она равна 0, ее все равно должно быть видно? Если бы она была в пстор - я бы её тоже увидел...

Ведь "0" - тоже значение. Переменная удаляется сборщиком мусора ЛУА совсем, только если она "nil". Я, правда, вчера, включив вывод в отладку всех нетпакетов, не проверял по всем неписям... Может, у некоторых все же есть. Или... А, смотреть нетпакет надо, видимо, не на стадии его загрузки, а на стадии сохранения. В этом, наверное, дело.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, хорошо. Отладка Колмогора есть. Я бы не спрашивал, если бы ее не было.

В нескольких скриптах в апдейте неписей и мутантов проставлены значения этой переменной us.

Как НЕ ИЗ АПДЕЙТЕРА ловить зависших неписей прикажете? Вот мы нетпакеты на состояние загрузки сейва записали в табличку - и что дальше? Нет слежения - нет информации про текущее состояние нетпакетов. Мы увидим, что нетпакет побит при загрузке следующего сейва. Бессмыслица получается. Надо либо проверять при сохранении (что, кстати, и так делается при сохранении пстор, а вот нетпакета - возможно что и нет), либо апдейтом следить.

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

 

Monnoroch, "Итого, в районе мегабайта - сущие копейки." - несколько оптимистично :)

У меня получается раза в полтора больше (хотя, могу ошибаться). У меня весь лог после выдачи туда нетпакета - 6Мб, минус примерно 1/2 - 2/3 - служебка.

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

 

Кстати, ничто не запрещает пользоваться обоими путями: восстанавливать нетпакет, если есть в таблице и переспавнивать, если нет :)

 

Monnoroch, есть проблемка: даже если табличку принудительно не очищать, в процессе загрузки она пишется, а вот при сохранении - терается. :(

Я ее не очищаю, но при старте сейва табличка пуста. Нужно писать спец. функцию сохранения. И я так понимаю, на какой-то обж.

Есть вариант, что если глобальную переменную инитить не в глобальном скрипте (типа бинд_сталкер, амк или _г) - она в сейв не попадает.

Тут я понятия не имею - никогда не сталкивался с такими вещами.

 

Monnoroch, Так, но у нас ведь в начале скрипта пакет_тейбл стоит packet_table = {}. Это значит, что при каждом обращении к этому скрипту табличка обнуляется, так ведь? А нам нужно, чтобы она не обнулялась а обновлялась после успешной загрузки непися, и сохранялась в сейв. Т.е. инитить ее нужно явно не здесь. Или не так. Либо инитить, только если она не нил, либо только при НГ. Иначе она будет непуста только между обращениями к скрипту пакет_тейбл.

 

"записывать можно что угодно....через актор_биндер:сэйв()" - это ты предлагаешь сохранять эту таблицу в нетпакет ГГ ? :crazy:

Нужно делать биндер, как для нетпда. Задача-то по сути - такая же. Вот только количество данных на порядки больше. Короче - облом. Размер нетпакета одного объекта не может превышать 8Кб. У нас будет - хорошо, если менее 1Мб. Не знаю, что имел в виду malandrinus, но похоже проблема - того же уровня.

 

Monnoroch, Короче, оказыватеся, в таблицу вообще ничего не пишется. Почему - хз.

Опрашиваю размер таблицы сразу же после записи в нее - там всегда 0. Какие есть мысли?

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)
а как это ты размер ее смотреть умеешь?

Monnoroch,

function read_packet(npc)
    if _g.IsStalker(npc) then
        packet_table[npc:id()] = amk.read_stalker_params(alife():object(npc:id()))
        local text = "непись: "..npc:name().." записан в packet_table"
        get_console():execute("load ~#I#:"..string.format(text))
        local text = "размер таблички нетпакета: "..table.getn(packet_table)
        get_console():execute("load ~#I#:"..string.format(text))

первая строка всегда нормальным именем, вторая - всегда размер 0

 

Это та же история абсолютно, что и с нетпакетным ПДА. И прекрасно ты умеешь писать в сейв :) - так же, как и ПДА пишем - прибинденным к обжу и с ограничением на 8Кб. Иными словами - облом. И хер мы запишем в сейв что-то больше. Если я неправ - корифеи, поправьте :) Я буду только рад, если ошибаюсь.

Я вот сейчас с работы шел - дошло наконец. db.storage активируется только биндером объекта, и пофиг этому движку все наши таблицы и прочие попытки что-то туда писать. Так что - ручками всё :)

 

Остался один вопрос: имеет смысл это все делать для текущего аллспавн-а, или ждать патча?

Если имеет (а эта штука с табличкой сработает где угодно, что с сейва, что с НГ) - тогда делаю.

 

все равно с НГ все будут играть с патчем.
Ну, это спорное утверждение... Но голосование я устраивать не буду. :)

В принципе, неписи зависали уже давно, и все знают, как бороться. Как правило, квестовики этим редко страдают.

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

Ну а переспавн квестовика - это еще не все. Нужно убирать в диалогах проверки инфопоршней на его смерть, иначе все диалоги взятия квестов, где есть такая проверка, будут заканчиваться провалом квеста. Проблема - та же, что и при оживлении ЖС.

 

Monnoroch, я в шоке! Применил к зависшему неписю самый надежный метод: alife():release(npc,true).

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

Сейв без правки вылетает с ошибкой на строке pstor[varname] = pstor_custom_impl[classname]() с ругательством, что field '?' is nil (xr_logic:1516 у меня). Ну и как это понимать? (непись был из скриптового спавна, скорее всего: bar_ohotnik_respawn_1 ). Попробовал с ним поторговать - в инвентаре у него оказался Скат-9. Может, из-за неудачной попытки переодевания - и проблема? После загрузки сейва, следующего за "удалением" - опять сообщение про его же побитый пстор и снова все с ним нормально. Фигня какая-то. Получается, alife():release не срабатывает, но неписа отвешивает. Пока не пойму, что это значит - выдавать ничего не буду. Пстор у него после сейв/лоад - снова на 378947615 слов.

Проверяю это в хр_лоджик.pstor_load_all так:

local ctr = reader:r_u32()

и выдаю в лог tostring(obj:name()).." ctr="..ctr

получаю

'bar_ohotnik_respawn_114038 ctr=3356688384'

У меня есть еще парочка таких кривых сейвов, но только неписи там враждебные... Сейчас проверю.

 

Взываю к корифеям программинга под Сталкер: Колмогору, Меченому - как объяснить феномен, описанный в предыдущем абзаце?

Может, непися в оффлайн переводить перед удалением? Или если биндер у него не проинитился, то алайф:релиз ему до лампочки? Ну не понимаю я.

Сообщение от модератора меченый(стрелок)
alife():release(alife():object(npc:id()),true) - Нпс же в Онлайне?

Да в оффлайн переводить необязательно.. нужно просто его получить как объект alife-а .

Или если биндер у него не проинитился, то алайф:релиз ему до лампочки?

Нет , alife() - это объект для работы с объектами (Во как) любого рода...

И чтобы его (объект) удалить - нужно получить его alife() объект(если он онлайн) по его id который возвращается методом :id().. для оффлайн такого метода нету есть только property ( некое поле) которое можно получить так - .id

Как-то так

Изменено пользователем меченый(стрелок)

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Причина зависа ясна: толкнул такой же СКАТ-9 такому зеленому охотнику, и в логе тут же имею:

binder(bar_ohotnik_respawn_114026) zavis(982)

Метка 982 стоит в хрс_аи:

        db.storage[binder.object:id()].us = 982
        if xrs_armor then xrs_armor.npc_update(binder) end

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

 

нужно просто его получить как объект alife-а .

меченый(стрелок) обижаешь! Ну конечно же он у меня получен как объект алайфа. Я могу к свойствам этого объекта обратиться. Нпс - в онлайне.

Да и удаление по неполученному обжу вылет бы вызывало. А оно вроде как срабатывает, но действует на него так, как будно я ему "мозги промыл". Т.е. он становится полностью адекватен, диалоги работают, торговля. Что еще более странно. Сид - тот же. Делаю сейв в двух метрах от него, загружаю сейв (из игры выходил после сейва). Сейв грузится, снова у него пстор побит, и все по-прежнему. Мистика ?

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

 

Ray, как я понял, виснет ЛЮБОЙ непись при продаже ему определенного броника (не любого). Пример я привел.

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

Я еще такого еще не курил, под которым нужно составлять ту табличку suits_to_visuals :crazy:

Изменено пользователем меченый(стрелок)

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Все, разобрался с удалением. Удалял одного, потом - смотрел на другого. Другой такой же охотник становился на место убиенного, сволочь :)

Кто знает, что с визуалами делать? Других причин зависов не вижу.

Вобщем, прописывать в исключения этих зависающих неписей - и все в порядке будет.

То ли только непися с профилем bar_ohotnik_respawn_1, то ли всех с визуалом hunter4 - без понятия.

V92, я думал, что неправильно новый визуал определяется - а оказывается, текущий.

 

Вот, блин. Удаляется нормально только непись, находящийся далеко от ГГ.

Если рядом с ГГ - начинаются рандомные вылеты. Каждый раз - с новым логом.

 

sarcus, тут нужна универсальность. С правкой скриптов и конфигов - всегда можно что-то придумать.

Вылеты из-за зависших неписей? Раскомментируй в конце функции actor_binder:update(delta) в скрипте bind_stalker.script отладку Мона и посмотри.

-- by Monnoroch 
  --проверка зависания биндеров НПЦ и мобов раз в 1,5сек
  --закомментировано на случай разбора полётов
    if db and db.storage then
      for k,v in pairs(db.storage) do
        if v.us ~= nil and v.us ~= 0 then
          abort("binder(%s) zavis(%s)", db.creatures[k]:name(), v.us)
          v.us = nil                
          break
        end
      end
      self.is_saved = false
    end

увидишь, на какой стадии загрузки биндера непися идет завис. У меня сейчас постоянно с визуалами - на 982-й метке зависы.

Завис фактически вот в этом месте в xrs_armor.script:

        if suits_to_visuals and suits_to_visuals[com] then
            npc:iterate_inventory(check_armor,npc)
        end

не срабатывает check_armor.

 

 

Дальше ф-ция не возвращает управление и непись вызывает вылет на стадии загрузки пстор.

 

Monnoroch, с оффлайном - попробую. А вот с таблицей этой - точно можно вывих мозга заработать.

 

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


Ссылка на сообщение
(изменено)

Monnoroch, С переводом в оффлайн - починил удаление непися вблизи ГГ, но поломал при этом удаление вдали. Если он при этом в оффлайне (когда вдали) - тогда непонятно, должно работать одинаково, если в онлайне - непонятно, почему тогда глючит удаление вблизи. Короче, запутался окончательно.

Т.е. вопрос: что отличает непися, возле которого стоит ГГ в 3-х метрах от непися, находящегося на расстоянии около 120м от ГГ (свич стандартный, 140).

 

sapsan, здорово! Молодец, что нашел время!

И оригинальная идея есть. Интересно, у Сяка - такое же с ограблением? :D

local fov = device().fov
local wpn
if fov < 35 and xr_logic.pstor_retrieve(db.actor, "use_scope", 0) == 0 then
wpn = db.actor:item_in_slot(db.actor:active_slot())
if wpn and wpn:section() == "wpn_crossbow" then
level.add_pp_effector("bast.ppe", 1034, true)
get_console():execute ("r2_sun_lumscale_amb 3")
get_console():execute ("r2_mblur 0.6")
xr_logic.pstor_store(db.actor, "use_scope", 1)
end
elseif fov > 35 and xr_logic.pstor_retrieve(db.actor, "use_scope", 0) == 1 then
xr_logic.pstor_store(db.actor, "use_scope", 0)
level.remove_pp_effector(1034)
get_console():execute ("r2_sun_lumscale_amb 1")
get_console():execute ("r2_mblur 0.")
end

Это ж вроде как был аддон с ночным прицелом для арбалета?

Это разве относится к твоему моду?

 

amk.send_tip("%c[255,0,255,0]Помер ты, Меченый. Передавай привет Семецкому...%c[default]", "Уборщик", 0, 15, "gen_info")

Чего уборщик-то :) Раз Зона Адаптирующаяся, тогда - от Зоны и сообщение

 

 

sapsan, в поле sender предусмотрен вариант просто nil - тогда это будет типа системным сообщением. На иконке будет сталкер в противогазе.

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

Неплохо бы нарисовать иконку и уборщику - не последний ведь в Зоне, хоть и киборг ;)

Да, это надо художников просить... ничего, может, кто-нибудь и сделает при случае. Я бы дворника из "пластилиновой вороны" туда затусовал :crazy:

 

dimos, проблема не при переодевании в новую, а при определении визуала старой (в начальной стадии переодевания, конечно).

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

 

про таблицу что думаешь?

Monnoroch, про таблицу... я предлагаю такую заглушку

function check_armor(npc, item, just_report)

local com = npc:character_community()

local section = item:section()

local sini = system_ini()

local vis = utils.cfg_get_string(sini, section, "visual", false, false, false, "")

if vis ~= "" and (string.find(section,"outfit") or string.find(section,"exoskeleton") and not string.find(npc:name(),"bodi_pantera1") and not string.find(npc:name(),"bodi_pantera2") and not string.find(npc:name(),"atp_brigada1") and not string.find(npc:name(),"atp_brigada4")) then

vis = xrs_utils.str_explode("\\",vis)

vis = xrs_utils.str_explode(".",vis[2])

vis = vis[1]

if not vis or vis=="" then return end

if suits_to_visuals[com][vis] then

if just_report then

if table.getn(suits_to_visuals[com][vis])>0 and get_npc_current_visual_level(npc:id())<=armor_levels[vis] then

return true

end

else

if table.getn(suits_to_visuals[com][vis])>0 and get_npc_current_visual_level(npc:id())<=armor_levels[vis] then

if ((not db.actor:see(npc) and npc:position():distance_to(db.actor:position())>1) or

npc:position():distance_to(db.actor:position())>100) then

 

change_vis(npc:id(),"actors\\"..suits_to_visuals[com][vis][math.random(table.getn(suits_to_visuals[com][v

is]))],armor_levels[vis],true)

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

end

end

end

 

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

И, кстати, bodi_pantera1 и остальных неписей нужно перенести в табличку excluded_npcs - она как раз для этих исключений и создана. Здесь нужна только проверка, точно ли попал сюда именно броник, а не еще какая-то пурга.

 

Monnoroch, а ничего, что этот vis снова переназначается позже? И там этой проверки уже нет.

 

 

Monnoroch, ну тогда так чтобы наверняка - в исключения в ту же excluded_npcs - зеленых охотников и кто там еще в желтых экзоскелетах?

Интересно, что сообщение о зависе в консоли появляется в ту же секунду, как броник попадает ему в инвентарь, т.е. еще до проверки

if ((not db.actor:see(npc) and npc:position():distance_to(db.actor:position())>1) or npc:position():distance_to(db.actor:position())>100) then

(я привел код до конца, чтобы видно было)

---------

Может, и должна, но факт, что эта ф-ция работу не завершает и вешает ему биндер. Что интересно, поставил в исключения bar_ohotnik_respawn_1 - все равно завис у него биндер. Что за фигня?

---------

Вроде,так: попались на том же, на чем и я постоянно попадаюсь.

В условии, которое проверяет таблицу исключений по неписям, проверка имени работает неправильно. Именно из-за того, что ид приаттачивается в конце имени. Вернее, если непись с уникальным стори_ид, назначенным в аллспавн - тогда имя правильное, а вот если какой-то типа того охотника - тогда облом.

if not npc:alive() or npc:critically_wounded() or npc:wounded() or excluded_npcs[npc:name()] then return end

Не зря я все-таки писал свою функцию для этого :) (я ее где-то раньше здесь приводил). Если ее использовать, тогда сработает проверка как надо.

if not npc:alive() or npc:critically_wounded() or npc:wounded() or excluded_npcs[protected_items.get_obj_name(npc)] then return end

Ну это о том, почему проверка не сработала. А вот зависает где - искать надо, пока не нашел.

---------

Похоже, что рушится потому, что у непися СРАЗУ же после вручения ему броника визуал УЖЕ НОВЫЙ. Т.е. после проверки тек. визуала - я вижу, что у него уже не плащ охотника, а бандитский экзоскелет, а проверки по тем головоломным таблицам - вообще нет. Что за фигня?

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

--------

Так и сделал, а проблема - прекратилась. Совсем. Ни зависов, ничего. Уже раза три сейв грузил, продавал броник - не зависает биндер, и все тут.

--------

Исправил проверку исключений. Но в таблице охотников ведь нет...

 

Monnoroch, телепорты Сяка (вернее, переходы) так и сделаны - в нетпакет ГГ (теперь - на ПДА) записывается стори_ид телепорта. Удаляется после перехода с ПДА и сам переход с локи. Проверял переход Фаната - сейв/лоад не удалил.

Телепорт Скряги, кажется, удалялся после загрузки сейва на этой же локе. Но я в текущей допе не проверял и, кажется, не смотрел, как реализовано.

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

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

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


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

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

AMK-Team.ru

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