6 фев 2020
lionovsky
:
![](https://spaces.im/i/acl/all_grey.png)
![(OFF)](https://spaces.im/i/head/chaplin_off.png?3)
![(S)](https://spaces.im/i/colored/medal_silver.png)
Доработка Minecraft beta 1.7.3
Давно уже сюда не писал. Итак, есть сырцы Minecraft beta 1.7.3, которые я тут дорабатываю ради поддержки ретро-сервера.
Недавно столкнулся с проблемой - техническое ограничение Minecraft в 256 существующих блоков.
Чекнул документацию - Region file format (mcregion) поддерживает ID до 4069 блоков.
В исходном коде игры ID для предметов и блоков задаётся жёстко, выделены 2 зоны:
Меняем значение на 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 и реализовать в клиенте.
Недавно столкнулся с проблемой - техническое ограничение 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 и реализовать в клиенте.
Канал: Разработка игр
![](https://spaces.im/i/abar/eye_small.png)
![](https://spaces.im/i/abar/share_small.png)
![](https://spaces.im/i/abar/vote_up_small.png)
![](https://spaces.im/i/abar/vote_down_small.png)
Для добавления комментариев необходимо авторизоваться
![](https://spaces.im/i/app/logo/kolhoz.png)
Удивительный колхоз
Удивительный колхоз - это новая многопользовательс