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

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


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

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

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

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

Shadowman, а,ну так да,попробуй :)

Но почему бы тебе самому на пустой пстор не проверять?Экономней в плане места,мобильней получается.

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

Видимо бессмысленно пытаться заставить движок работать с зависшим НПС.Ну не может он,уж извините.

Придется переписывать пакет :)

 

====

 

А ты не проверял - нельзя ли НПСу совсем рандомный нетпакет присвоить?То есть от любого другого НПС (неквестовика)

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

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

Пробовал я присваивать от другого НПЦ (причем даже с той же секцией - брата-близнеца, можно сказать). И уже писал про результат - вылет, причем с невменяемым логом. В том-то и дело, что не получится, и по вполне объективным причинам. Если переписывать нетпакет - нужно детально разбирать, что значит каждая переменная и писать что-то правдоподобное (т.е. формировать нетпакет по-новой фактически). Там очень конкретные вещи у каждого непися: координаты, сиды (если из аллспавн присвоен), и куча есть такого, что вообще непонятно что значит. Я приводил результат дампа этой таблички нетпакета ранее (от "здорового" непися), перехваченной при сохранении. Когда попытался катануть его "больному" - вылетел. Тупик, короче.

 

А отлавливать зависших в том же хр_лоджик, кстати, научился - получается (как по кривому пстор, так и по пустому).

 

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

 

Arhara, спасибо, попробую делать ему "харакири". В принципе, практически получилось. По крайней мере, отсеять при загрузке сейва "зависших" - получилось точно. Можно же еще попробовать make_suicide из АМК. Или еще какой-нибудь npc.health = -1. И Мон говорил, он третий способ знает ;)

Может, npc:hit(h) (только параметры этого h задать правильно и такими, чтоб смерть 100%). Еще помучаю этот вариант. Трупик - уборщик приберёт, он позже запускается :)

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

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

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

Как это правильно сделать?

local npc = alife():object(npc_id)    -- или тут нужен тот обж, что в pstor_load_all и передан?
        local h = hit()
        h.power = 0.5
        h.direction = npc:direction()
        h.draftsman = db.actor 
        h.impulse = 1
        h.type = hit.wound

и выдается, что direction 'a nil value'. Без него - hit 'a nil value'.

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

Как я понимаю, дирекшн лучше задать абсолютно, не привязывая к неписю (=0 пробовал, ловлю моментально вылет без лога).

А может, проблема в том, что непись зависший...

 

 

 

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

Shadowman,

При удалении непися скриптом - идёт его мгновенное удаление, что в алайфе частенько вызывает вылет. Вылет, как правило связан с тем, что у удаляемого непися - 100% здоровье. А вот если такому неписю сначала наносить хит, убирающий % 50 этого здоровья, вылета как правило не бывает.

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

Вроде получилось суицидом. Проверяю...

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

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

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

Еще Припять осталось глянуть (пока видел кучу зависших rat_strong и одного контрика). Похоже, всем неписям с новыми уникальными визуалами переодевания противопоказаны.

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

Но, похоже, все зависы - на смене визуалов (по кайней мере, других зависов не видел пока).

 

Arhara, и все-таки: выпускать правку отдельно, или будешь ее включать в патч? Я просто надеюсь завтра домучить уже правку. Там и по хрс_армор, и по хрс_утилс вылеты подхвачены (тоже сейв Мава помог, кстати :) ). Собственно: патч не передумал делать, или только уже с новой локой? :rolleyes:

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

Дима, спасибо, попробую с хитом

 

такая уборка вероятна только в оффлайне

Дима, зачистка зависших работает только при загрузке сейвов и переходах на локу, но только по порядку запуска - чуть раньше уборщика. Игрок никогда не увидит, КАК все происходит. В самом худшем случае, ГГ может во время сохранения иметь в поле зрения зависшего непися (в текущем состоянии скриптов такой сейв не загружается), а после его загрузки - непись либо будет трупом, либо исчезает вовсе. Пока убиение и приборка работает через раз, но незагружавшиеся ранее битые сейвы грузятся, и сейвы, сделанные уже после отработки "восстановительных работ" - тоже. Есть лишь вероятность, что неубранный труп зависшего обберут другие неписи и также зависнут, нарвавшись на ту же причину (например, подобрав броник и зависнув на смене визуала). Чтобы этого не было, лучше, конечно, проставить в табличку исключений excluded_npcs в хрс_армор таких неписей (имхо, самое лучшее - для всех неписей с новыми визуалами - на Генераторах, на Припяти и т.д.). Я сейчас пытаюсь отловить по максимуму всех, кто подвисает, но, конечно, не могу гарантировать, что выловлю абсолютно всех.

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

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

Вот, Мон когда-то присылал по хиту

function kill_them_all()

for i=1,65536 do

local obj=level.object_by_id(i)

if <твое условие> then

local h = hit()

h.power = 3

h.impulse = 3

h.draftsman = obj

h.direction = vector():set(0,0,0)

h:bone("bip01_spine")

h.type = hit.fire_wound

obj:hit(h)

break

end

end

end

 

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

Shadowman,

 

По патчу - дня через 3, не ранее - много дежурств, а надо тестить. Да - тут ещё приборчик скачал - пару бы квестов ещё заменить....

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

Monnoroch, я беру только параметры хита оттуда, остальное - в хр_лоджике :)

А та ф-ция в хр_лоджик и так страбатывает только на объектах, находящихся на текущей локе при прогрузке биндеров.

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

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

Уже видел парочку сейвов с кучей зависших монстров (причем, в одном случае они удалились, во втором - нет). И откуда они такое берут? Ни разу за год игры в Соль такого у себя не видел.

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

Shadowman, я вообще впервые о зависших монстрах слышу...

===

 

Но вообще главное - вейвы грузятся.Это то нам и надо.

==

Arhara, вово))

какбы БТРы не поназависли...

Изменено пользователем Monnoroch
какбы БТРы не поназависли...

Monnoroch, а зря смеешься, между прочим: когда я накосячил с записью на ПДА, и вертолеты и БТРы под раздачу попали: я ведь писал пстор только актору и на нетПДА, а все остальное было "в пролете" (основная часть нетпакета писалась, а псторы - нет) :crazy:

И очень даже возможно, что при глобальных затыках, на которые пользователи внимания не обращают (даже у некоторых вон сохранки с актором зависшим) - могут и БТРы тоже заглючить... Но я их не трогаю. Пока ;)

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

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

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

Arhara, я во-первых свой же код и ругаю :)

А во-вторых это действительно по-хорошему неприемлемо - так вот мучать комп.

 

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

Arhara, Про вылеты при смерти - лучше исправь.Велет он на то и вылет,чтоб его убирать любой ценой.

 

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

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

 

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

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

Но это мечты-мечты...

 

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

====

З.Ы.

Ты покажи щас Меченому его "сон нпс" - он же лопнет от стыда,раз уж говорил,что ему даже за ЧУ стыдно :D

(это опять к слову о циклах)

Изменено пользователем Monnoroch
Как я понимаю, серьезные проблемы с повальными подвисаниями (не связанными с реальными ошибками в скриптах и конфигах) - на дохлых компах, или при кривых установках мода, иначе проблемы были бы у всех поголовно.

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

А про зависших монстров: это не про заблудившихся зверушек, типа Cannot build GAME path! (object rat_strong?

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

dimos, при загрузке сейвов с зависшими монстрами - в логе то же, что и при подвисших неписях - поврежден сейв + с моей отладкой имя, где я встречал крыс, снорков, собак, гигантов и контрика. А вот как это заполучить - не знаю. насчет построения пути - врядли, т.к. завис биндера - как раз именно потому и происходит, что управление ему не возвращается при отработке какого-то из скриптов, выполняющегося внутри (в твоем примере с GAME path - движок корректно отработал косяк и пошел дальше).

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

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

Shadowman, Monnoroch, решил тут взглянуть на переодевание неписей. Понял не много, но нашел несколько странностей:

1. куски кода по выбору секции по визуалу сдублированны в xrs_armor.script (со строки 1648) и death_manager.script (со строки 206), но при этом по-разному достаётся переменная vis (похоже, что в xrs_armor.script более совершенный вариант) и есть ещё небольшое отличие по нейтралам;

2. в этих же кусках кода либо перевести всё на elseif, либо на таблицы по сравнению в лоб и сравнению как части (чисто для оптимизации);

3. там же есть вероятность неинициализации переменной sect (мне не известно нормально ли отработает "read_if_exist_str()") - может лучше вместо "local sect" сделать "local sect = nil" ?

4. закомментирован stalker_soldier и stalker_suit, который встречается в одной из проверок в xrs_armor.script в строке 1727, а также soldier_outfit (у него визуал soldier_suit) присутствует в all.spawn (может это и ничего, но выглядит пропущенным);

5. xrs_armor.script в строке 1613 присутствует проверка на имена неписей - ведь в начале есть список игнорируемых неписей, кроме того как-то странно проверка на имена связана с экзоскелетом... или просто скобку забыли закрыть где нужно;

6. xrs_armor.script в строках 1832 и 1834 проход по всему и проверка на здорового сталкера - разве нету в АМК таблицы сталкеров? Вопрос актуален и для уборщика, если он запускается после создания такой таблицы.

7. xrs_armor.script в строке 1852 лишние проверки - вся таблица заполнена (мелочь);

8. xrs_armor.script в строке 34 в таблице upgrade_top_lvl не все локации.

 

Shadowman,

Проверка на outfit и exoskelet
здесь суть не в самой проверке, а в её связке (and, or) с проверкой имён.

 

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

По п.1 - сделать дублирующийся код функцией и вызывать её из death_manager.script.

 

Shadowman, ну я выдал всё что увидел :)

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

sapsan,

5. проверка на имена неписей - ты совершенно верно подметил. Их проверяют ранее, в npc_update по таблице, но прикол в том, что в таблице - названия секций и проверка на точное совпадение, а если в нее внести секцию непися, которому не назначен story_id в all.spawn, то его obj:name() выглядит как у стволов (с сидом в конце) и проверка, естественно, обламывается. Это я разрулил уже. Я здесь приводил ф-цию, которой я вычисляю название секции любого непися (взятого что как GameObject, что как серверный). Имена же там в функции check_armor вообще убираем. Проверка на outfit и exoskelet - потому, что ведь суются туда на проверку секции абсолютно всего содержимого инвентаря непися, а проходить проверку для дальнейшей обработки должны только броники. Т.е. секцию непися фильтруем перед перебором инвентаря в npc_update, а его содержимое - уже в check_armor.

 

По остальным пунктам - посмотрю, отпишу в этот пост, что думаю.

------

sapsan, Условие в check_armor должно выглядеть так: if vis and vis ~= "" and ((string.find(section,"outfit") or string.find(section,"exoskeleton")) then... имён там быть не должно вообще и в скобки нужно взять оба "или". А секции имён - переносим в таблицу excluded_npcs, где и задумано.

 

6. "проход по всему" - явно нужно убирать и переписывать этот код повышения уровней, Мон только что выражал мнение про переборы всех объектов (for a=0,65535 do). Чем дохлее комп, тем больше вероятность получить завис биндера "на ровном месте" (казалось бы, формально ведь все правильно, а вот в плане оптимальности - ж... полная). Не знаю, может правильнее перебирать только объекты в db.storage (это, насколько я понимаю, объекты на текущем уровне). Нафига трокать абсолютно всех сталкеров?

 

8. можно, конечно, прописать все локи в табличку upgrade_top_lvl, но лучше сначала привести в порядок остальной код :)

 

Monnoroch, та не, не думаю, что там что-то сильно уж криво. Таблички дополняли в основном, насколько я знаю. Ну и я руку приложил, еще весной или летом :)

Я не против, только где брать оригинал?

-------

Как хоть мод называется? AI pack FINAL? Автор написал про мод только в самом хрс_армор - "-- made by xStream 03.2008".

Monnoroch, Кстати, имя автора в русской транскрипции - Экстрим, ну или экСтрим, но никак не Стрим :)

Посмотрел, вобщем. Отличие - в одной функции. У экСтрима ее нет: get_npc_current_visual_level. Вместо нее у экСтрима - get_npc_level.

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

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

Выложил фикс: http://www.amk-team.ru/forum/index.php?sho...st&p=357853

Что менял:

1. В скрипты

aem_bind.script

bind_monster.script

bind_stalker.script

xr_motivator.script

Добавил к отладочному сообщению SAVE FILE IS CORRUPT название функции и имя объекта и после него - запуск своей функции удаления зависших из remove_zavis.script. В bind_stalker, по завису актора - только сообщение :)

2. В protected_items.script - переделал функцию получения имени секции объекта get_obj_name (теперь она действительно работает и с игровым объектом и на выходе выдает именно точное имя секции обжа).

3. В xrs_armor.script - использовал функцию из п.2 для корректной отработки исключений в функции npc_update. Плюс несколько проверок на нил в check_armor (делал не "от фонаря", ловил вылеты из-за пустых таблиц визуалов на генераторах: вылет был хрс_утилс:888, теперь его нет). Дополнил таблицу исключений excluded_npcs по реально найденным мной проблемам с зависами (около десятка секций добавил). См также п.6

4. В xr_logic.script переделал проверку убитого пстора и также вставил запуск ф-ции удаления из remove_zavis.script + мелкая правка.

5. В xr_wounded.script - мелкая правка - была неверная проверка на нил в функции evaluator_wound:evaluate ()

-6. Забыл перенести имена секций Пантеры и прочих из условия в check_armor в таблицу excluded_npcs (ToDo, так сказать).

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

-8. Забыл копирайт проставить в remove_zavis.script (правда, фраза капсом про удаление- не моя, а Kamikazze, ну и без помощи Архары и Мона, а также наработок Колмогора и Меченого я мог бы и не справиться, так что скрипт - народный, как и все в Солянке) :crazy:

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

Shadowman, То не оптимизация - то полная переоаботка даже самого принципа работы механизма :)

Мы считай вырезали эмбрионы и сделали их с нуля (кроме иконок) :)

 

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

 

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

 

По поводу же

aem_bind.script

bind_monster.script

bind_stalker.script

xr_motivator.script

А зачем?

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

А иначе - как там идет проверка на завис?

Неужто прямо из пстор??

Изменено пользователем Monnoroch
полная переоаботка даже самого принципа работы механизма

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

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

Нет, не из него. Не знаю, почему, но если я ту же самую проверку, что делается, например, в bind_monster.script в функции generic_object_binder ("if reader:r_eof() then"), выполняю из хр_лождик, он почему-то считает объекты зависшими, хотя они таковыми не являются.

Так что буквально в последний момент вчера вечером мне пришлось задержать выпуск фикса на пару часов и все переделать.

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

 

Monnoroch, проверка - "if reader:r_eof() then", я же написал. (Если можешь объяснить, что она значит с твоей точки зрения - буду благодарен). "Конец файла" - ответ неверный :) Это что-то похожее, но ведь при пстор на миллионы слов - тоже reader:r_eof()=true - чего тогда конец?

Почему она при одинаковых исходных данных работает по-разному - могу лишь догадываться, но факт-упрямая вещь! Я, как всегда, сделал так, "чтоб работало" (и работает ведь!), а нюансы - потом выяснять будем. Я умышленно выложил фикс раньше, чем выходит патч Архары - надеюсь, народ поможет найти глюки, если всплывут ;)

Изменено пользователем Shadowman
Гость
Эта тема закрыта для публикации сообщений.
  • Недавно просматривали   0 пользователей

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