| Всё подряд | О жизни | Фотозаметки | Техническое |
Регистрация | Забыл пароль?



Простой, быстрый удобный

Удивительные костыли оказывается есть в Minecraft-2
Категория: О жизни | (6 февраля 2020)
Beta 1.7.3 (та самая из 2011), перепиливаю под себя.

Пытаюсь изменить крафт табличек, чтоб на выходе получалось в стаке 12 табличек, вместо 1.

Изменяю, компилю, игра падает с ошибкой "Max stack size must be 1 for items with crafting results".

Быстренько смотрю код, нахожу такой:
public Item setContainerItem(Item item)
{
if(maxStackSize > 1)
{
throw new IllegalArgumentException("Max stack size must be 1 for items with crafting results");
} else
{
containerItem = item;
return this;
}
}

Выпиливаю проверку, меняю setMaxStackSize(1) на .setMaxStackSize(64), получаю падение игры.

Лезу дальше. 5 минут - выясняю что при создании предмета - его количество игра пишет не в переменную типа int, а в boolean. Т.е. true/false вместо целого числа =)

А вот для блоков использовалось int, и всё норм.
Фикшу баг, проверяю крафт, хранение в инвертаре, и сундуке - всё норм.

Кстати, Нотч всё же пофиксил это в более старых версиях, но это было уже в 2012 году.
 Просмотров: 990 | Читать далее

Доработка Minecraft beta 1.7.3
Категория: О жизни | (6 февраля 2020)
Давно уже сюда не писал. Итак, есть сырцы Minecraft beta 1.7.3, которые я тут дорабатываю ради поддержки ретро-сервера.

Недавно столкнулся с проблемой - техническое ограничение Minecraft в 256 существующих блоков.
Чекнул документацию - Region file format (mcregion) поддерживает ID до 4069 блоков.

В исходном коде игры ID для предметов и блоков задаётся жёстко, выделены 2 зоны:
        Item.itemsList[pistonStickyBase.blockID] = new ItemPiston(pistonStickyBase.blockID - 256);
for(int i = 0; i < 256; i++)
{
if(blocksList[i] != null && Item.itemsList[i] == null)
{
Item.itemsList[i] = new ItemBlock(i - 256);
blocksList[i].initializeBlock();
}
}
protected Item(int i)
{
maxStackSize = 64;
maxDamage = 0;
bFull3D = false;
hasSubtypes = false;
containerItem = null;
shiftedIndex = 256 + i;
if(itemsList[256 + i] != null)
{
System.out.println((new StringBuilder()).append("CONFLICT @ ").append(i).toString());
}
itemsList[256 + i] = this;
}

Т.е., создаётся 2 списка, блоки - 0-255, предметы - 256+.
Меняем значение на 2048 для создания новой "зоны" предметов - получаем аццкие тормоза на стороне клиента, хотя клиент работает - блок с ID 1000 создаётся.

Оказывается, клиент майна загружает все ID в память, т.е. если раннее он загружал 0-255, то сейчас - 0-2074.
Уменьшил размер до 1024 - падение производительности на 20% вместо 50%.

Сервер при этом не падает - разработчики Bukkit уже предусмотрели такой сценарий, и сервер грузит в память только те блоки, ID которых не пуст.

Сойдёт.

Ок, загружаем старый мир, открываем любой сундук, наш клиент крашится, так как карта ему отдала вместо ID 1280 - 256. Конечно же, клиент не знает о таком ID и успешно падает.

Думал уж костыли пилить, но нет - нашлась утилита NBTEditor. Заменяем в сундуках и инвентаре игроков все ID 256+ на 1280+, и наш клиент работает стабильно.

Не знаю, почему моджанги столь долго ограничивались 256 блоками, это было пофикшено совсем недавно введением буквенных ID.
Возможно, дело в памяти - однако можно подсмотреть систему загрузки пустых ID у Bukkit'a и реализовать в клиенте.
 Просмотров: 1070 | Читать далее

Разные хренюшки
 Популярные записи
 Свежие комменты
» Ух, мне бы тоже прибраться... (29.03.2020)
// Домашняя серверная на балконе
Автор TwilightSparkle


» Фонарик за 120 рублей за ебея :)

Чип там лютейшее г... (08.10.2018)
// Доделал тут бортовую сеть велосипеда
Автор lionovsky

» Не эстетично.
А контроллер светодиодов паленый кита... (08.10.2018)
// Доделал тут бортовую сеть велосипеда
Автор The_Ivan682

» Listic, ага. Пристёгивать нужно за раму + колесо. ... (09.11.2017)
// А хорошо тут в Питере
Автор lionovsky

 Календарь
« Февраль 2020 »
Пн Вт Ср Чт Пт Сб Вс
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29

 Основано Lionovsky в 2009-2010 году