@Override public void generate(World world, BlockPos pos, Random random) { BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(); for (ComponentInfo layer : this.components) { for (RepeatRule rule : layer.repeats) { rule.reset(world, random, mutablePos); } } BlockPos.PooledMutableBlockPos pooledPos = BlockPos.PooledMutableBlockPos.retain(); for (ComponentInfo layer : this.components) { mutablePos.setPos(pos); for (RepeatRule rule : layer.repeats) { rule.init(world, random, mutablePos); while (rule.continueRepeating(world, random, mutablePos)) { for (Map.Entry<BlockPos, BlockList> e : layer.blocks.entrySet()) { BlockPos coords = e.getKey(); int blockX = coords.getX() + mutablePos.getX(); int blockY = coords.getY() + mutablePos.getY(); int blockZ = coords.getZ() + mutablePos.getZ(); world.setBlockState(pooledPos.setPos(blockX, blockY, blockZ).toImmutable(), e.getValue().getRandom(random)); } rule.repeat(world, random, mutablePos); } } } pooledPos.release(); }