Перейти к содержимому
cyber01

Проблемы с клиентом

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

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

 

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

 

В стэктрейсе самым верхним фреймом показывается некий метод thaumcraft.common.tiles.TileAlchemyFurnaceAdvancedNozzle.getEssentiaAmount. Открываем его и переходим на указанную строку. Там вот такое:

return (this.furnace != null ? Integer.valueOf(this.furnace.aspects.getAmount(this.furnace.aspects.getAspects()[0])) : null).intValue();
Ну, то есть, что это хреновый код, понятно, но нам его прочесть нужно, так что разбавим его горсткой переводов строки.

return (
  this.furnace != null
  ? Integer.valueOf(this.furnace.aspects.getAmount(this.furnace.aspects.getAspects()[0]))
  : null
).intValue();
Нетрудно заметить, когда у нас здесь может возникнуть NPE. Допустим, что this.furnace == null. Тогда выражение выше преобразуется вот в такое:

return null.intValue();
Не нужно быть профи в жавве, чтобы понимать, что так вещи не работают.

 

Значит, проблема в том, что this.furnace == null. Как туда null-то угораздило? Тоже нетрудно узнать.

 

Во-первых, это поле класса, как мы замечаем по префиксу this., и, перейдя на объявление, находим тип поля: TileAlchemyFurnaceAdvanced. Это класс, потому вместо инстанса можно использовать null. Идиотское решение, но вот такая жавва у нас. Во-вторых, мы видим, что null там устанавливается при создании объекта класса TileAlchemyFurnaceAdvancedNozzle. То есть это дефолтное значение, проще говоря. И оно должно где-то и когда-то устанавливаться в нормальное.

 

Ищем присвоения в это поле. Находим его в func_145845_h. Хе-хееее. Этот метод — обфусцированный update. Он вызывается игрою у всех тайлов каждый тик. Запомним, потому что знание это ещё понадобится.

 

Этот метод всегда устанавливает не-нуллёвое значение полю, поэтому сама имплементация метода интересовать нас не будет.

 

Отлично. Выяснили, что вместо null присваивается значение конкретное там при первом апдейте тайла. Ещё надо понять, что такое Nozzle — это штука, в которую пихается эссенция. Я не помню, где она там на печке, но где-то быть должна точно, судя по всему.

 

Возвращаемся к стэктрейсу. Ниже фрейм принадлежит трансвекторному интерфейсу из таумик тинкерера. На всякий случай бросим и этот мод в декомпилятор, но чего-либо интересного там не находим. Вспоминаем, что трансвекторный интерфейс — это прокси, который принимает эссенцию, а затем телепортирует её в парный блок, откуда эссенцию можно вытащить. И нет, бага не в нём.

 

Осматриваем остальную релевантную часть стэктрейса, в котором есть ещё 2 фрейма. Тааак. Некий метод TileTubeBuffer.func_145845_h, вызывающий TileTubeBuffer.fillBuffer, вызывающий TileTransvectorInterface.getEssentiaAmount, вызывающий TileAlchemyFurnaceAdvancedNozzle.getEssentiaAmount...

 

Начинает складываться картинка проблемы.

 

...Нет? Не начинает? Тогда вспоминаем, что значит func_145845_h. Это, как уже замечал, есть обфусцированный update.

 

Вот теперь-то точно начинает складываться она.

 

После того, как игра загрузила чанк, она запускает для каждого тайла его метод func_145845_h (апдейт). Не параллельно, а последовательно. Я не знаю, какой там порядок, но мы можем точно сказать, при каком условии у нас уже вызывается апдейт какой-то трубы, но ещё не вызвался апдейт печки. Если конкретно, то тогда, когда труба обновляется до обновления печки. И, как мы понимаем, этот баг проявляется только при загрузке чанка.

 

Труба пытается передать эссенцию из себя в другую трубу. Та труба проверяет, сколько эссенции в подцепленном к ней блоке — трансвекторе. Трансвектор сам эссению не хранит — он перенаправляет запрос на количество эссенции печке. А печка ещё не обновлялась, поэтому this.furnace == null, и поэтому мы получаем ]NullPointerException, который успешно прикладывает сервер.

 

У нас должен остаться один вопрос на этом моменте. Где баг?

 

...

 

А вот это очень хороший вопрос. Давайте подумаем немного, когда должна была происходить инициализация печки. Верно — при загрузке чанка, для чего есть специальный метод. Вместо этого инициализация делается во время обновления тайлов. Процесса, у которого нет заданного порядка обработки. И иногда так получается, что труба грузится раньше, чем печка. Значит, баг точно в печке, а Азанор, или кто там таум пилил, виноват в том, что совершил такую, извините, тупую ошибку.

 

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

 

Как фиксить будем? А фиг мы пофиксим. Репортить некуда. Таум 4 не поддерживается уже сколько лет. Покуда мы на 1.7.10, жить нам с этой проблемой. Хотя я полагаю, что можно и как-то пропатчить жарник, пересобрать мод и провести ещё с дюжину шаманских ритуалов, но я в такое не вдавался.

 

Возможно, можно заказать фикс. Возможно, можно что-то запретить. Но тут уж пусть решает Алекс.

 

Зе енд.

 

А, нет, погодите с зе ендом. Где виспы-то? Виспов тут нет. Виспы тут никоей роли не играют. Кроме, возможно, того, что @KelLiN, гоняясь с сачком и банкой за виспами, как-то так подгрузил печку, мы получили краш. Но и слава коду. Ведь виспы должны в банке жить, а не сервер крашить, верно?

 

(Почему вёрстка едет, меня не спрашивайте. У меня все теги прикрыты корректно.)

Изменено пользователем Fingercomp
  • Нравится 5

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


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

@@Fingercomp баг этот пофиксить можно. И виспы действительно там ни в чем не виноваты=)  Видимо, Кевин просто за ними гонялся и подгружал иногда буфер ессенции с печкой.

 

п.с. И немного не понял. Какой пост слетел из-за гугловских зондов?

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


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

return ( this.furnace != null ? Integer.valueOf(this.furnace.aspects.getAmount(this.furnace.aspects.getAspects()[0])) : null ).intValue();

 

Что за адская галиматья!

Руки бы поотрывал.

 

п.с. И немного не понял. Какой пост слетел из-за гугловских зондов?

 

Наверное Фингер писал свой длинно-пост, и тут у него рефрешнулась страница форума.

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


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

 

Что за адская галиматья!

что ты от декомпилятора хочешь?

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


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

что ты от декомпилятора хочешь?

 

Декомпилятор отсебятину не сочиняет в коде. Если там такое в декомпиляторе, там такое и в коде. В том или ином виде.

То есть галиматья и говнокод.

 

И вообще надо свой Таум писать. В виде аддона к OpenComputers.

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


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

Декомпилятор отсебятину не сочиняет в коде. Если там такое в декомпиляторе, там такое и в коде. В том или ином виде.

То есть галиматья и говнокод.

 

И вообще надо свой Таум писать. В виде аддона к OpenComputers.

пиши

  • Нравится 1

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


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

Лаунчер не запускается. Вообще. Ничего не происходит. Логи отсутствуют.

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, Alex сказал:

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

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

 

з.ы все папки в APPDATA и C:\Users\username с именем похожим на CClauncher я удалил, не помогло.

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


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

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

Спойлер

7s8OSJj.png

 

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Alex сказал:

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

  Скрыть контент

7s8OSJj.png

 

Есть маленькая проблемка: этот самый лончер и не запускается.

  • Нравится 1

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


Ссылка на сообщение
Поделиться на других сайтах
Только что, vlad3 сказал:

этот самый лончер и не запускается.

значит джава не установлена. установи последнюю версию 32 или 64 бит

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


Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, Alex сказал:

значит джава не установлена. установи последнюю версию 32 или 64 бит

Не помогло. Переустановил, даже пекарню перезагрузил.

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
23 минуты назад, vlad3 сказал:

Не помогло. Переустановил, даже пекарню перезагрузил.

я очень рад. но экстрасенсов здесь нет)

 

1 час назад, Alex сказал:

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, Alex сказал:

я очень рад. но экстрасенсов здесь нет)

 

 

Да не запускается он, как я включу режим откладки. Может там какие-то распространяемые пакеты еще нужны?

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


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

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

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


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, Asior сказал:

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

Не помогло :( Точнее никаких процессов там не было. 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, vlad3 сказал:

Не помогло :( Точнее никаких процессов там не было. 

вообще никаких?) 

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


Ссылка на сообщение
Поделиться на других сайтах
19 часов назад, Alex сказал:

вообще никаких?) 

Вообще. Ни джавы, ни самого клиента

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, vlad3 сказал:

Вообще. Ни джава, ни сам клиент 

А что пишет при запуске java -version?

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


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

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