[халва] Детектирование прекращения игры на клиенте
Всем доброго утра.
Подскажите, кто хорошо знает Золотой Источник (тм): как на клиенте детектировать:
- загрузку карты
- дисконнект
- выдернутый сетевой кабель (т.е. таймаут и вылет в меню)
- любое другое прерывание игры
Для чего: нужно в срочном порядке отключать все эффекты в т.ч. системы частиц чтобы ни в коем члучае не вызвались движковые трейсы, пойнтконтенты, энтити и прочие крошилки.
Трай-кэч работает плохо и хак, так что, не предлагайте.
- Загрузку карты можно отловить через VidInit. Каллбэк этот многоцелевой и вызывается по куче поводов, но другого способа попросту нет. Ну есть еще HUD_Init и HUD_Reset, если это как-нибудь поможет. Оно слоупочное, но более информативное. Я лично в ксаше выводил новые каллбэки, потому что в голдсорсе нет явных таких вызовов.
- дисконнект ловится... Да никак он не ловится. Это чисто для движка инфа.
В ксаше я опять-таки вывел калбэк R_ProcessEntData на высвобождение энтить.
- выдернутый сетевой кабель (т.е. таймаут и вылет в меню)
это даже движок расчухать не в состоянии. Ну то есть он ждёт какое-то время, в надежде что соединение восстановится.
Цитата:
~ X ~ писал: Трай-кэч работает плохо и хак, так что, не предлагайте.
Ловить дисконнект трей-катчем? С таким же успехом можно сортировать строчки в дельта.лст
Добавлено 13-08-2016 в 17:47:
Я вот думаю, может поэкспериментировать с messagenum у игрока. Он может по идее зависнуть, если игрок перестанет получать обновления.
Ну там надо хранить преведущее значение и каждые полсекунды проверять. Если осталось старым, значит клиент перестал принимать пакеты.
Я думаю надо зайти с другой стороны. К примеру движок живёт в обстановке тотальной неизвестности, придет что-то с сервера или же нет.
Но это не мешает ему корректно всё обрабатывать. А нашему другу вдруг надо, кровь из носа. Я думаю там сама рендер-система имеет неправильную архитектуру, поэтому такое и происходит.
раз вы даже оба не поняли, объясню
try
{
gEnguneFFFUnctions->pAnusAPI->TraceLine(wtf, wtf2, etc, etc..);
}
catch (...)
{
conprintf(1, "Dam, the engine crushed again! Bawww\n");
delete pCurrentParticleSystemAndEverythingElse;
}
Т.е. прекращение рендеринга мира и вывал в меню (а главное - инвалидацию всех энтитей) отследить не получится?
МБ вообще какой ках прикрутить - например, мониторить отсутствие тэмпэнтить - их же движок перестаёт апдейтить.
Или вызывать RenderManager->UpdateSystems() не из HUD_Frame(), а откуда-то ещё.
Потому что, например, при дисконнекте, снег продолжает пытаться трейсить, а трейсить нечего. И всякие GetGabeNByIndex() тоже крошатся.
Цитата:
Дядя Миша писал: Я вот думаю, может поэкспериментировать с messagenum у игрока. Он может по идее зависнуть, если игрок перестанет получать обновления.
Ну там надо хранить преведущее значение и каждые полсекунды проверять. Если осталось старым, значит клиент перестал принимать пакеты.
Думал над этим. У меня дял всех энтить это проверяется, но может случиться так, что это поздно - хоть на кадр.
Надо чтобы он НЕ крэшанулся.
Оборачивая трейсы в траи мне удавалось кое-как избегать вылетов во время дисконнектов. Т.е. юзер мог играть дальше. Но это плохо.
Надо знать, КОГДА ПЕРЕСТАТЬ ОБНОВЛЯТЬ эффекты. Точнее - удалить их.
~ X ~ писал: Оборачивая трейсы в траи мне удавалось кое-как избегать вылетов во время дисконнектов.
помоему у тебя серъезная логическая ошибка в рендер системе, если дисконнект приводит к вылету в движке. А ты теперь пытаешься каким-то хаком это исправить. Возьми и всё по быстрому переделай.