Массовая замена вида блоков на другой вид блоков

Версия Minecraft
1.12.2

GoogleTan

Картошка :3
1,354
43
310
Короче надо ВО ВСЕМ ЭНДЕ заменить эндстоун на другой блок. Кстати, все что будет дальше генерироваться должно будет сделано из нового блока, но это хук. Меня волнует, что это слишком много блоков. Либо как вариант дать всем им нбт, а самому сделать эндерняк с нбт. Есть идеи?
 
Решение
Делал когда-то такую штучку...
Быстрый способ замены одного блока другим. Думаю, переписать под свои нужды будет не проблема.
Смысл в том, что тут не используется setBlockState();
Остаётся только где-нибудь в эвенте загрузки чанков пробежаться по нему и заменить все блоки на нужные.
Ну и... Имеет смысл использовать не конкретно данный метод, а добывать ExtendedBlockStorage и пробегаться уже по нему.

Java:
public static void simpleSetBlock(World world, BlockPos pos, IBlockState state, boolean nullCheck) {
    if (nullCheck) {
        ExtendedBlockStorage ebs = world.getChunkFromBlockCoords(pos).getBlockStorageArray()[pos.getY() >> 4];
        if (ebs != Chunk.NULL_BLOCK_STORAGE) ebs.set(pos.getX() & 15, pos.getY() & 15...

GoogleTan

Картошка :3
1,354
43
310
Дело не в том как, а в том, что команда филл на 100*100*100 блоков грузит средний пк очень сильно, а если игорок уже крепость находил? Это будет заменить где-то 100*1000*1000(ну примерно) блоков Это в 100 раз больше. Не думаю, что смогу протестить собственный мод.
 

GoogleTan

Картошка :3
1,354
43
310
Я и не планировала ее использовать. Главное что она заменяет блоки на блоки. Я не думаю, что смогу сделать что-то подобное с лучшей оптимизацией. Потому и спрашиваю.
 
3,005
192
592
А как ты будешь определять, кем поставлен блок?
Тип сгенерился он сам или его поставил игрок?
 
4,046
63
645
Делал когда-то такую штучку...
Быстрый способ замены одного блока другим. Думаю, переписать под свои нужды будет не проблема.
Смысл в том, что тут не используется setBlockState();
Остаётся только где-нибудь в эвенте загрузки чанков пробежаться по нему и заменить все блоки на нужные.
Ну и... Имеет смысл использовать не конкретно данный метод, а добывать ExtendedBlockStorage и пробегаться уже по нему.

Java:
public static void simpleSetBlock(World world, BlockPos pos, IBlockState state, boolean nullCheck) {
    if (nullCheck) {
        ExtendedBlockStorage ebs = world.getChunkFromBlockCoords(pos).getBlockStorageArray()[pos.getY() >> 4];
        if (ebs != Chunk.NULL_BLOCK_STORAGE) ebs.set(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15, state);
    } else world.getChunkFromBlockCoords(pos).getBlockStorageArray()[pos.getY() >> 4].set(pos.getX() & 15, pos.getY() & 15, pos.getZ() & 15, state);
}

У меня, вроде, не грузит.
 
3,005
192
592
Сверху