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

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

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

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

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

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

  • http://www.amk-team.ru/forum/uploads//ratings/thumb_up.png × 2
  • http://www.amk-team.ru/forum/uploads//ratings/wrench_orange.png × 1

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


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

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

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

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

 

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

 

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
Shadowman, Аа,так ты это оттудова все делаешь...тогда все,я сдаюсь,ты прав :)

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


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

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


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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

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

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

 

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

 

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

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

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

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

 

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

 

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

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

 

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах

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

Как-то так

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

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


Ссылка на сообщение
Поделиться на других сайтах

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:

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

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


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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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


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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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


Ссылка на сообщение
Поделиться на других сайтах

Shadowman, да переписать эту таблицу и все.делов то.

можно даже упрощенно - как я предлагал.

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


Ссылка на сообщение
Поделиться на других сайтах

Shadowman, проверку на пустой пстор тоже можно сделать.

 

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

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


Ссылка на сообщение
Поделиться на других сайтах

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

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


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

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

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

×