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

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

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

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

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

Изменено пользователем Dennis_Chikin
  • Нравится 2
  • Полезно 1
Ссылка на комментарий

Shadowman, нет.зачем в сейв то,я не понимаю?

А отлов это не вариант.Во первых он ловит только уже зависшего а во-вторых апдейтер грузить....не,не вариант.

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

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

Ссылка на комментарий
Shadowman, хочешь сэйвы с зависами неписей? Погуляй по припяти, попутно сохраняясь, там очень любят виснуть нейтралы подобравшие броник и пытавшиеся его одеть. Только погуляй подольше заглядывая в лог - и не пройдет и часа как будет тебе счастье. Главное чтоб этим нейтралам хабар собирать было с кого.

 

Мой музыкальный аддон для ОП-2 + Музыкальные флешки для плеера - для тех, кому не нравится оригинальная музыка. Более 150 новых треков различных направлений и исполнителей, каждый найдёт музыку на свой вкус. Апдейт 1.1 от 30.03.2015 - в плеер добавлены записи реальных радиостанций + наиболее подходящие миксы. Торрент.
Пак измененных локаций из ОГСЕ 0.6.9.3 для ОП-2. Скачать можно здесь.

Ссылка на комментарий
Shadowman, Про us ее придумал колмогор :) Была его отладка - была и us.Но я еще рз скажу - не надо возвращать отладку в апдейтер.Только для тестов....
Ссылка на комментарий

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

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

Shadowman, Ааа...ты так..

 

Короче я так понял есть 2 пути.

1)Апдейтом нетпакеты выслеживать битые и переписывать с помощью моей таблицы.

2)При загрузке сейва переспавнивать по олл.спавну непися.

 

Но почему ты не хочешь допустим в сейв мою табличку сунуть (убрав коллбэк на чистку через нет_дестрой и поставив коллбэк на чиску ВСЕЙ таблицы после отработки во время загрузки)?

 

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

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

 

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

 

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

Shadowman, я думаю в сейв не пойдет мегобайт.килобайт 200...там ж 1)не так много НПС - ну 20-25 максимум обычно + в сейве оно довольно плотненько поместится,ужато.

 

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

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

 

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

Shadowman, мда.

а как это ты размер ее смотреть умеешь? :)

нету в сталкере таких функций.

Сообщение от модератора меченый(стрелок)
Ошибаетесь :)

table.getn

===

ладно,в общем-то согласен...бред получается...

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

Изменено пользователем меченый(стрелок)
Ссылка на комментарий
а как это ты размер ее смотреть умеешь?

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

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

Shadowman, мнээ,наверное не имеет.прикинь,потом все переделывать через пару дней.надо оно?все равно с НГ все будут играть с патчем.

сделай сейчас удаление НПСя - там ничо делать не надо.а с патчем полностью сделаешь с таблицей.

 

Стрелок,я имел ввиду колличество бит.

Сообщение от модератора меченый(стрелок)
Количество бит чего? table.getn - возвращает "длину" таблицы ...Сори если я не в тему

 

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

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

 

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

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

Причина зависа ясна: толкнул такой же СКАТ-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

Ссылка на комментарий
Shadowman, ты немного неправ. В моем сэйве виснут только нейтралы имеющие визуал светло-желтой экзы, получившие броник (без разницы какой и каким путем). Я ведь еще эксперементировал с долговцами, свободовцами и монолитовцами (кидал броник а они подбирали), так вот никто больше не вис, висли только нейтралы и ТОЛЬКО имеющие визуал светло-желтой экзы. Уверен, что любой другой человек попытавшись переодеть такого нейтрала, получит аналогичную картину в виде зависа. Так что глючен именно этот визуал светло-желтой экзы, и именно его нужно править. Изменено пользователем V92

 

Мой музыкальный аддон для ОП-2 + Музыкальные флешки для плеера - для тех, кому не нравится оригинальная музыка. Более 150 новых треков различных направлений и исполнителей, каждый найдёт музыку на свой вкус. Апдейт 1.1 от 30.03.2015 - в плеер добавлены записи реальных радиостанций + наиболее подходящие миксы. Торрент.
Пак измененных локаций из ОГСЕ 0.6.9.3 для ОП-2. Скачать можно здесь.

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

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

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

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

То ли только непися с профилем 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

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

Shadowman, а ты не просто удаляй.ты сначала в оффлайн кидай а потом удаляй.

 

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

Про suits_to_visuals - она составлена на редкость странно.Как это понимать - если НПС надел экзу свободы,Юа сам он за долг,то наделась экза долга?Я не понимаю.

Я бы предложил убрать эту "фичу" - таблица упростится в десяток раз.Будет просто одномерный массив cекция броника = визуал

 

Будет все предельно просто и вероятность ошибки устремится к нулю.

 

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

 

=====

Был бы я неписей,я бы тоже во время переодевания запутался бы в этой таблице до зависа ...

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

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

Ссылка на комментарий
Monnoroch, чего-то я вообще не понял как эта таблица (suits_to_visuals) работает.. К тому же там есть дублирующиеся и пустые секции. Кто пояснит, что это такое и как оно работает? Может вообще запретить неписям переодеваться в неподходящую броньку? Изменено пользователем dimos
Цензура ограничивает творчество © by me
Ссылка на комментарий

Shadowman, можешь удалять,потом проверять - если не удалился пихать в офф и удалять :)

 

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

 

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

Shadowman, не сработает.выше уже есть проверка такая же.

тем более ниже проверка if suits_to_visuals[com][vis] then - все покрыть должна.

====

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

====

тут придется построково проверять.

то есть после каждой строки сообщение в консоль - тут и увидишь,где обрушилось все...

===

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

Shadowman, нее,скрипта нет меняющего визуалы другого - по любому.

сделай все-таки как я советую - построчный вывод в консоль.может натолкнет на какие мысли? :)

==

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

Shadowman, ахаха,она прячется :)

ну даешь,а)))

мпожет ты ненароком что еще написал и исправил?

 

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

================

 

Shadowman,

Из за загрузки пропадают Сяковы телепорты.Непорядок.

Предлагаю решение: коллбэк из спавн_левел_ченджер на функцию,которая в табличку будет писать каждый сделанный телепорт - всю инфу.А потом эту табличку на ПДА наш записывать.Как тебе? :)

Опять же коллбэк на удаление если удаляем телепорт тоже делать...

А при загрузке игры по табличке восстанавливаем утерянное.

 

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

=========

и еще я не понял - как это эффект остается,а телепорт пропадает?

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

Monnoroch, почему я перестал ловить зависы - разобрался (сделал синтаксическую ошибку в xrs_armor, и он просто перестал работать вообще - смена визуалов, естественно, тоже). А вот как обойти - похоже, только непися в исключения. Обработку таблички исключений excluded_npcs я привел в чувство, заодно в самой табличке одну ошибку нашел. Почему зависает - так и не понял. Вроде правильно все, - а не работает. Причем, до выбора нового визуала дело даже не доходит - раньше виснет биндер. И группировка есть, и визуал, и в таблице все это расписано для разбираемого мной случая - а вот зависает биндер, и все. Поскольку это все происходит у неписей с конкретным визуалом - проще всего запретить им его менять. Для бара - это bar_ohotnik_respawn_1 (зеленый охотник).

 

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

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

 

Еще есть проблема: удаление "зависшего" непися - хорошо, но нормально работает только если он "свеженький". Если же пстор уже пуст - мотиватор выдает, что "save file is corrupt", но мое условие в pstor_load_all не срабатывает. Нужно, видимо, собирать список зависших в какую-то глобальную таблицу и проверять из нее: если пстор побит - удалять. И причем делать это еще до попытки грузить пстор, или исключать из загрузки пстора по этой таблице и удалять уборщиком (в самом конце загрузки).

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

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

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

Stalker Nest, D1mon, будете флудить здесь - по шапке получите. Здесь не место для фантазий.

 

Monnoroch, эта проверка и так есть - везде, где есть сообщение "save file is corrupt":

aem_bind.script

bind_monster.script

bind_stalker.script

xr_logic.script

xr_motivator.script

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

 

sapsan, приветствую! Спасибо, что порядок навёл :)

 

Monnoroch, Опять нарвался на неудаляемость. Теперь - уже точно. Неписи вроде как отвисли, даже диалоги заработали. Сейв/лоад - вылет при попытке повторного удаления, глюкануло на стадии alife():release(obj,true). Как это понимать - вообще бред. В скрипте стоит так:

switch_offline(obj)

alife():release(obj,true)

И перед этим - был сейв, в котором этим же кодом удалилось (точно такой же зеленый охотник был, тоже недалеко от меня). Тут все так же - ан нет, вылетает!

 

Странно все это. Снова спровоцировал завис, сохранился. Удаление не сработало. Сейв/лоад - охотник на месте, опять удаление не сработало. Правда, не вылетает. Что за фигня и как бороться - не понимаю.

Изменено пользователем 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

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