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

Народная 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

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

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

Shadowman,

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

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

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

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

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

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

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

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

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

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

 

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

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

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

 

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

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

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

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

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

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

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

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, не ранее - много дежурств, а надо тестить. Да - тут ещё приборчик скачал - пару бы квестов ещё заменить....

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

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

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

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

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

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

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

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

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

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

===

 

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

==

Arhara, вово))

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

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

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

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

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

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

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

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

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

Еще 10 лет таких цен, зарплат и пенсий, и вместо переписи населения будет перекличка

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

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

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

 

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

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

 

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

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

 

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

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

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

 

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

====

З.Ы.

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

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

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

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

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

Изменено пользователем dimos
Цензура ограничивает творчество © by me
Ссылка на комментарий

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

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

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

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

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

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

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

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

Выложил фикс: 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

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

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

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

Железо: 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

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