name = bbor
buildVersion = 1.0.4
-mcVersion = 1.12.2
+mcVersion = 1.13
+++ /dev/null
-package com.irtimaled.bbor;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class ReflectionHelper {
- public static <T, R> R getPrivateValue(Class<T> sourceClass, T instance, Class<R> resultClass) {
- try {
- Field f = getField(sourceClass, resultClass);
- if (f != null) {
- return (R) f.get(instance);
- }
- } catch (Exception ignored) {
- }
- return null;
- }
-
- private static Map<Class, Map<Class, Field>> fieldMap = new HashMap<>();
-
- private static <T, R> Field getField(Class<T> sourceClass, Class<R> resultClass) {
- Map<Class, Field> map = fieldMap.computeIfAbsent(sourceClass, k -> new HashMap<>());
- Field field = map.get(resultClass);
- if (field == null) {
- field = getFieldUsingReflection(sourceClass, resultClass);
- if (field != null) {
- field.setAccessible(true);
- map.put(resultClass, field);
- }
- }
- return field;
- }
-
- private static <T, R> Field getFieldUsingReflection(Class<T> sourceClass, Class<R> resultClass) {
- Field[] fields = sourceClass.getDeclaredFields();
- for (Field field : fields) {
- if (field.getType().equals(resultClass))
- return field;
- }
- for (Field field : fields) {
- if (resultClass.isAssignableFrom(field.getType()))
- return field;
- }
- return null;
- }
-}
import com.irtimaled.bbor.config.ConfigManager;
import net.minecraft.client.Minecraft;
+import net.minecraft.client.settings.KeyBinding;
import net.minecraft.network.NetworkManager;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
private static ClientProxy proxy;
public static void init() {
- ConfigManager.loadConfig(new File(Minecraft.getMinecraft().mcDataDir, "config"));
+ ConfigManager.loadConfig(new File(Minecraft.getInstance().gameDir, "config"));
proxy = new ClientProxy();
proxy.init();
}
}
public static void keyPressed() {
- proxy.keyPressed();
+ if (ActiveHotKey.isPressed()) {
+ proxy.toggleActive();
+ } else if (OuterBoxOnlyHotKey.isPressed()) {
+ proxy.toggleOuterBoxOnly();
+ }
}
+ public static final String KeyCategory = "Bounding Box Outline Reloaded";
+ public static KeyBinding ActiveHotKey = new KeyBinding("Toggle On/Off", 0x42, KeyCategory);
+ public static KeyBinding OuterBoxOnlyHotKey= new KeyBinding("Toggle Display Outer Box Only", 0x4f, KeyCategory);
+
public static void render(float partialTicks) {
proxy.tick();
proxy.render(partialTicks);
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.MathHelper;
-import net.minecraft.world.DimensionType;
+import net.minecraft.world.dimension.DimensionType;
import java.awt.*;
import java.util.HashSet;
}
private boolean isWithinRenderDistance(BlockPos minBlockPos, BlockPos maxBlockPos) {
- int renderDistanceBlocks = Minecraft.getMinecraft().gameSettings.renderDistanceChunks * CHUNK_SIZE;
+ int renderDistanceBlocks = Minecraft.getInstance().gameSettings.renderDistanceChunks * CHUNK_SIZE;
int minX = MathHelper.floor(PlayerData.getX() - renderDistanceBlocks);
int maxX = MathHelper.floor(PlayerData.getX() + renderDistanceBlocks);
int minZ = MathHelper.floor(PlayerData.getZ() - renderDistanceBlocks);
}
private Set<BoundingBoxSlimeChunk> getSlimeChunks() {
- int renderDistanceChunks = Minecraft.getMinecraft().gameSettings.renderDistanceChunks;
+ int renderDistanceChunks = Minecraft.getInstance().gameSettings.renderDistanceChunks;
int playerChunkX = MathHelper.floor(PlayerData.getX() / CHUNK_SIZE);
int playerChunkZ = MathHelper.floor(PlayerData.getZ() / CHUNK_SIZE);
Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
import com.irtimaled.bbor.common.VillageProcessor;
import com.irtimaled.bbor.config.ConfigManager;
import net.minecraft.client.Minecraft;
-import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.NetworkManager;
-import net.minecraft.world.DimensionType;
-import org.apache.commons.lang3.ArrayUtils;
-import org.lwjgl.input.Keyboard;
+import net.minecraft.world.dimension.DimensionType;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
public class ClientProxy extends CommonProxy {
private boolean active;
private boolean outerBoxOnly;
- private KeyBinding activeHotKey;
- private KeyBinding outerBoxOnlyHotKey;
private ClientRenderer renderer;
private int remoteUserCount = 0;
- public void keyPressed() {
- if (activeHotKey.isPressed()) {
- active = !active;
- if (active)
- PlayerData.setActiveY();
- } else if (outerBoxOnlyHotKey.isPressed()) {
- outerBoxOnly = !outerBoxOnly;
- }
+ public void toggleActive() {
+ active = !active;
+ if (active)
+ PlayerData.setActiveY();
+ }
+
+ public void toggleOuterBoxOnly() {
+ outerBoxOnly = !outerBoxOnly;
}
@Override
public void init() {
- String category = "Bounding Box Outline Reloaded";
- activeHotKey = new KeyBinding("Toggle On/Off", Keyboard.KEY_B, category);
- outerBoxOnlyHotKey = new KeyBinding("Toggle Display Outer Box Only", Keyboard.KEY_O, category);
- Minecraft.getMinecraft().gameSettings.keyBindings = ArrayUtils.addAll(Minecraft.getMinecraft().gameSettings.keyBindings, activeHotKey, outerBoxOnlyHotKey);
ClientDimensionCache clientDimensionCache = new ClientDimensionCache();
renderer = new ClientRenderer(clientDimensionCache);
dimensionCache = clientDimensionCache;
}
public void render(float partialTicks) {
- EntityPlayer entityPlayer = Minecraft.getMinecraft().player;
+ EntityPlayer entityPlayer = Minecraft.getInstance().player;
PlayerData.setPlayerPosition(partialTicks, entityPlayer);
if (this.active) {
import com.irtimaled.bbor.client.renderers.*;
import com.irtimaled.bbor.common.models.*;
import com.irtimaled.bbor.config.ConfigManager;
-import net.minecraft.world.DimensionType;
+import net.minecraft.world.dimension.DimensionType;
import org.lwjgl.opengl.GL11;
import java.util.HashMap;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.DimensionType;
+import net.minecraft.world.dimension.DimensionType;
import java.awt.*;
import java.io.File;
private static NBTTagCompound[] getChildCompoundTags(NBTTagCompound parent, String key) {
NBTTagList tagList = parent.getTagList(key, 10);
- NBTTagCompound[] result = new NBTTagCompound[tagList.tagCount()];
- for (int index = 0; index < tagList.tagCount(); index++) {
+ NBTTagCompound[] result = new NBTTagCompound[tagList.size()];
+ for (int index = 0; index < tagList.size(); index++) {
result[index] = tagList.getCompoundTagAt(index);
}
return result;
package com.irtimaled.bbor.client.renderers;
-import com.irtimaled.bbor.common.models.BoundingBoxSlimeChunk;
import com.irtimaled.bbor.client.PlayerData;
+import com.irtimaled.bbor.common.models.BoundingBoxSlimeChunk;
import com.irtimaled.bbor.config.ConfigManager;
import net.minecraft.util.math.AxisAlignedBB;
package com.irtimaled.bbor.client.renderers;
-import com.irtimaled.bbor.common.models.BoundingBoxVillage;
import com.irtimaled.bbor.client.PlayerData;
+import com.irtimaled.bbor.common.models.BoundingBoxVillage;
import com.irtimaled.bbor.config.ConfigManager;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator;
package com.irtimaled.bbor.client.renderers;
-import com.irtimaled.bbor.common.models.BoundingBoxWorldSpawn;
import com.irtimaled.bbor.client.PlayerData;
+import com.irtimaled.bbor.common.models.BoundingBoxWorldSpawn;
import com.irtimaled.bbor.config.ConfigManager;
import net.minecraft.util.math.AxisAlignedBB;
return cache;
}
- public synchronized void refresh() {
- }
-
public void close() {
cache.clear();
}
package com.irtimaled.bbor.common;
import com.irtimaled.bbor.Logger;
-import com.irtimaled.bbor.ReflectionHelper;
import com.irtimaled.bbor.config.ConfigManager;
-import net.minecraft.world.DimensionType;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
+import net.minecraft.world.dimension.DimensionType;
import net.minecraft.world.gen.ChunkProviderServer;
-import net.minecraft.world.gen.IChunkGenerator;
import java.util.HashSet;
import java.util.Set;
public void worldLoaded(World world) {
IChunkProvider chunkProvider = world.getChunkProvider();
if (chunkProvider instanceof ChunkProviderServer) {
- IChunkGenerator chunkGenerator = ReflectionHelper.getPrivateValue(ChunkProviderServer.class, (ChunkProviderServer) chunkProvider, IChunkGenerator.class);
dimensionCache.setWorldData(world.getSeed(), world.getWorldInfo().getSpawnX(), world.getWorldInfo().getSpawnZ());
- DimensionType dimensionType = world.provider.getDimensionType();
- Logger.info("create world dimension: %s, %s (chunkprovider: %s) (seed: %d)", dimensionType, world.getClass().toString(), chunkGenerator.getClass().toString(), world.getSeed());
- DimensionProcessor boundingBoxCache = new DimensionProcessor(dimensionType, chunkGenerator);
+ DimensionType dimensionType = world.dimension.getType();
+ Logger.info("create world dimension: %s, %s (seed: %d)", dimensionType, world.getClass().toString(), world.getSeed());
+ DimensionProcessor boundingBoxCache = new DimensionProcessor(dimensionType);
dimensionCache.put(dimensionType, boundingBoxCache);
if (ConfigManager.drawVillages.getBoolean()) {
villageProcessors.add(new VillageProcessor(world, dimensionType, eventHandler, boundingBoxCache));
}
public void chunkLoaded(Chunk chunk) {
- DimensionType dimensionType = chunk.getWorld().provider.getDimensionType();
- dimensionCache.refresh(dimensionType);
+ DimensionType dimensionType = chunk.getWorld().dimension.getType();
+ BoundingBoxCache cache = dimensionCache.get(dimensionType);
+ if(cache instanceof DimensionProcessor) {
+ ((DimensionProcessor)cache).processChunk(chunk);
+ }
}
public void tick() {
package com.irtimaled.bbor.common;
import com.irtimaled.bbor.common.models.WorldData;
-import net.minecraft.world.DimensionType;
+import net.minecraft.world.dimension.DimensionType;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
private final Map<DimensionType, BoundingBoxCache> map = new ConcurrentHashMap<>();
private WorldData worldData;
- void refresh(DimensionType dimensionType) {
- if (map.containsKey(dimensionType)) {
- map.get(dimensionType).refresh();
- }
+ public BoundingBoxCache get(DimensionType dimensionType) {
+ return map.get(dimensionType);
}
public void put(DimensionType dimensionType, BoundingBoxCache boundingBoxCache) {
package com.irtimaled.bbor.common;
import com.irtimaled.bbor.Logger;
-import com.irtimaled.bbor.ReflectionHelper;
import com.irtimaled.bbor.common.models.BoundingBox;
import com.irtimaled.bbor.common.models.BoundingBoxStructure;
import com.irtimaled.bbor.config.ConfigManager;
-import net.minecraft.util.math.ChunkPos;
-import net.minecraft.world.DimensionType;
-import net.minecraft.world.gen.ChunkGeneratorEnd;
-import net.minecraft.world.gen.ChunkGeneratorHell;
-import net.minecraft.world.gen.ChunkGeneratorOverworld;
-import net.minecraft.world.gen.IChunkGenerator;
-import net.minecraft.world.gen.structure.*;
+import com.irtimaled.bbor.config.Setting;
+import net.minecraft.util.math.MutableBoundingBox;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.dimension.DimensionType;
+import net.minecraft.world.gen.feature.structure.StructurePiece;
+import net.minecraft.world.gen.feature.structure.StructureStart;
import java.awt.*;
-import java.util.*;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
public class DimensionProcessor extends BoundingBoxCache {
- DimensionProcessor(DimensionType dimensionType, IChunkGenerator chunkGenerator) {
+ DimensionProcessor(DimensionType dimensionType) {
this.dimensionType = dimensionType;
- this.chunkGenerator = chunkGenerator;
}
private DimensionType dimensionType;
- private IChunkGenerator chunkGenerator;
private boolean closed = false;
@Override
public void close() {
closed = true;
- chunkGenerator = null;
super.close();
}
- private static <T extends IChunkGenerator, R extends MapGenStructure> Collection<StructureStart> getStructures(T chunkGenerator, Class<R> generatorClass) {
- Class<T> chunkGeneratorClass = (Class<T>) chunkGenerator.getClass();
- R structureGenerator = ReflectionHelper.getPrivateValue(chunkGeneratorClass, chunkGenerator, generatorClass);
- if (structureGenerator != null) {
- Map<ChunkPos, StructureStart> structureMap = ReflectionHelper.getPrivateValue(MapGenStructure.class, structureGenerator, Map.class);
- return structureMap.values();
- }
- return Collections.emptyList();
- }
-
- private Map<StructureType, Collection<StructureStart>> getStructures() {
- Map<StructureType, Collection<StructureStart>> structureMap = new HashMap<>();
- if (chunkGenerator instanceof ChunkGeneratorOverworld) {
- if (ConfigManager.drawDesertTemples.getBoolean()) {
- structureMap.put(StructureType.DesertTemple, getStructuresWithComponent(getStructures(chunkGenerator, MapGenScatteredFeature.class), ComponentScatteredFeaturePieces.DesertPyramid.class));
- }
-
- if (ConfigManager.drawJungleTemples.getBoolean()) {
- structureMap.put(StructureType.JungleTemple, getStructuresWithComponent(getStructures(chunkGenerator, MapGenScatteredFeature.class), ComponentScatteredFeaturePieces.JunglePyramid.class));
- }
-
- if (ConfigManager.drawWitchHuts.getBoolean()) {
- structureMap.put(StructureType.WitchHut, getStructuresWithComponent(getStructures(chunkGenerator, MapGenScatteredFeature.class), ComponentScatteredFeaturePieces.SwampHut.class));
- }
-
- if (ConfigManager.drawOceanMonuments.getBoolean()) {
- structureMap.put(StructureType.OceanMonument, getStructures(chunkGenerator, StructureOceanMonument.class));
- }
+ private void addStructures(Setting drawStructure, StructureType structureType, Map<String, StructureStart> structureMap) {
+ if (!drawStructure.getBoolean()) return;
- if (ConfigManager.drawStrongholds.getBoolean()) {
- structureMap.put(StructureType.Stronghold, getStructures(chunkGenerator, MapGenStronghold.class));
- }
+ StructureStart structureStart = structureMap.get(structureType.getName());
+ if (structureStart == null) return;
+ Color color = structureType.getColor();
+ MutableBoundingBox bb = structureStart.getBoundingBox();
+ if (bb == null)
+ return;
- if (ConfigManager.drawMansions.getBoolean()) {
- structureMap.put(StructureType.Mansion, getStructures(chunkGenerator, WoodlandMansion.class));
- }
+ BoundingBox boundingBox = BoundingBoxStructure.from(bb, color);
+ if (isCached(boundingBox)) return;
- if (ConfigManager.drawMineShafts.getBoolean()) {
- structureMap.put(StructureType.MineShaft, getStructures(chunkGenerator, MapGenMineshaft.class));
- }
- } else if (chunkGenerator instanceof ChunkGeneratorHell) {
- if (ConfigManager.drawNetherFortresses.getBoolean()) {
- structureMap.put(StructureType.NetherFortress, getStructures(chunkGenerator, MapGenNetherBridge.class));
- }
- } else if (chunkGenerator instanceof ChunkGeneratorEnd) {
- if (ConfigManager.drawEndCities.getBoolean()) {
- structureMap.put(StructureType.EndCity, getStructures(chunkGenerator, MapGenEndCity.class));
- }
+ Set<BoundingBox> structureBoundingBoxes = new HashSet<>();
+ for (StructurePiece structureComponent : structureStart.getComponents()) {
+ structureBoundingBoxes.add(BoundingBoxStructure.from(structureComponent.getBoundingBox(), color));
}
-
- return structureMap;
+ addBoundingBoxes(boundingBox, structureBoundingBoxes);
+ Logger.info("[%s] new dimensionCache entries: %d", dimensionType, structureBoundingBoxes.size());
}
- private Collection<StructureStart> getStructuresWithComponent(Collection<StructureStart> structures, Class structureComponent) {
- Collection<StructureStart> validStructures = new HashSet<>();
- for (StructureStart structure : structures) {
- if (structure.getComponents().get(0).getClass().equals(structureComponent)) {
- validStructures.add(structure);
- }
- }
- return validStructures;
- }
-
- @Override
- public synchronized void refresh() {
+ public synchronized void processChunk(Chunk chunk) {
if (closed) return;
- Map<StructureType, Collection<StructureStart>> structureMap = getStructures();
- for (StructureType structureType : structureMap.keySet()) {
- Color color = structureType.getColor();
- for (StructureStart structureStart : structureMap.get(structureType)) {
- if (structureStart.getBoundingBox() != null) {
- BoundingBox boundingBox = BoundingBoxStructure.from(structureStart.getBoundingBox(), color);
- if (!isCached(boundingBox)) {
- Set<BoundingBox> structureBoundingBoxes = new HashSet<>();
- for (StructureComponent structureComponent : structureStart.getComponents()) {
- structureBoundingBoxes.add(BoundingBoxStructure.from(structureComponent.getBoundingBox(), color));
- }
- addBoundingBoxes(boundingBox, structureBoundingBoxes);
- Logger.info("[%s] new dimensionCache entries: %d", dimensionType, structureBoundingBoxes.size());
- }
- }
- }
+ Map<String, StructureStart> structureMap = chunk.getStructureStarts();
+ if (structureMap.size() > 0) {
+ addStructures(ConfigManager.drawDesertTemples, StructureType.DesertTemple, structureMap);
+ addStructures(ConfigManager.drawJungleTemples, StructureType.JungleTemple, structureMap);
+ addStructures(ConfigManager.drawWitchHuts, StructureType.WitchHut, structureMap);
+ addStructures(ConfigManager.drawOceanMonuments, StructureType.OceanMonument, structureMap);
+ addStructures(ConfigManager.drawStrongholds, StructureType.Stronghold, structureMap);
+ addStructures(ConfigManager.drawMansions, StructureType.Mansion, structureMap);
+ addStructures(ConfigManager.drawMineShafts, StructureType.MineShaft, structureMap);
+ addStructures(ConfigManager.drawShipwrecks, StructureType.Shipwreck, structureMap);
+ addStructures(ConfigManager.drawOceanRuins, StructureType.OceanRuin, structureMap);
+ addStructures(ConfigManager.drawBuriedTreasure, StructureType.BuriedTreasure, structureMap);
+ addStructures(ConfigManager.drawIgloos, StructureType.Igloo, structureMap);
+ addStructures(ConfigManager.drawNetherFortresses, StructureType.NetherFortress, structureMap);
+ addStructures(ConfigManager.drawEndCities, StructureType.EndCity, structureMap);
+ addStructures(ConfigManager.drawPillagerOutposts, StructureType.PillagerOutpost, structureMap);
}
}
}
package com.irtimaled.bbor.common;
import com.irtimaled.bbor.common.models.BoundingBox;
-import net.minecraft.world.DimensionType;
+import net.minecraft.world.dimension.DimensionType;
public interface IVillageEventHandler {
void villageRemoved(DimensionType dimensionType, BoundingBox bb);
import java.awt.*;
public class StructureType {
- private static final int JUNGLE_TEMPLE = 1;
- private static final int DESERT_TEMPLE = 2;
- private static final int WITCH_HUT = 3;
- private static final int OCEAN_MONUMENT = 4;
- private static final int STRONGHOLD = 5;
- private static final int MINE_SHAFT = 6;
- private static final int NETHER_FORTRESS = 7;
- private static final int END_CITY = 8;
- private static final int MANSION = 9;
+ public final static StructureType JungleTemple = new StructureType(Color.GREEN, "Jungle_Pyramid");
+ public final static StructureType DesertTemple = new StructureType(Color.ORANGE, "Desert_Pyramid");
+ public final static StructureType WitchHut = new StructureType(Color.BLUE, "Swamp_Hut");
+ public final static StructureType OceanMonument = new StructureType(Color.CYAN, "Monument");
+ public final static StructureType Shipwreck = new StructureType(Color.CYAN, "Shipwreck");
+ public final static StructureType OceanRuin = new StructureType(Color.CYAN, "Ocean_Ruin");
+ public final static StructureType BuriedTreasure = new StructureType(Color.CYAN, "Buried_Treasure");
+ public final static StructureType Stronghold = new StructureType(Color.YELLOW, "Stronghold");
+ public final static StructureType MineShaft = new StructureType(Color.LIGHT_GRAY, "Mineshaft");
+ public final static StructureType NetherFortress = new StructureType(Color.RED, "Fortress");
+ public final static StructureType EndCity = new StructureType(Color.MAGENTA, "EndCity");
+ public final static StructureType Mansion = new StructureType(new Color(139, 69, 19), "Mansion");
+ public final static StructureType Igloo = new StructureType(Color.WHITE, "Igloo");
+ public final static StructureType PillagerOutpost = new StructureType(Color.GRAY, "Pillager_Outpost");
- public final static StructureType JungleTemple = new StructureType(JUNGLE_TEMPLE);
- public final static StructureType DesertTemple = new StructureType(DESERT_TEMPLE);
- public final static StructureType WitchHut = new StructureType(WITCH_HUT);
- public final static StructureType OceanMonument = new StructureType(OCEAN_MONUMENT);
- public final static StructureType Stronghold = new StructureType(STRONGHOLD);
- public final static StructureType MineShaft = new StructureType(MINE_SHAFT);
- public final static StructureType NetherFortress = new StructureType(NETHER_FORTRESS);
- public final static StructureType EndCity = new StructureType(END_CITY);
- public final static StructureType Mansion = new StructureType(MANSION);
+ private final Color color;
+ private String name;
- private final int type;
-
- private StructureType(int type) {
- this.type = type;
+ private StructureType(Color color, String name) {
+ this.color = color;
+ this.name = name;
}
public Color getColor() {
- switch (type) {
- case DESERT_TEMPLE:
- return Color.ORANGE;
- case JUNGLE_TEMPLE:
- return Color.GREEN;
- case WITCH_HUT:
- return Color.BLUE;
- case MINE_SHAFT:
- return Color.LIGHT_GRAY;
- case NETHER_FORTRESS:
- return Color.RED;
- case OCEAN_MONUMENT:
- return Color.CYAN;
- case STRONGHOLD:
- return Color.YELLOW;
- case END_CITY:
- return Color.MAGENTA;
- case MANSION:
- return new Color(139, 69, 19);
- }
- return Color.WHITE;
+ return color;
+ }
+
+ public String getName() {
+ return name;
}
}
import com.irtimaled.bbor.common.models.BoundingBoxVillage;
import net.minecraft.village.Village;
import net.minecraft.village.VillageCollection;
-import net.minecraft.world.DimensionType;
import net.minecraft.world.World;
+import net.minecraft.world.dimension.DimensionType;
import java.util.HashMap;
import java.util.List;
package com.irtimaled.bbor.common.models;
import net.minecraft.util.math.BlockPos;
-import net.minecraft.world.gen.structure.StructureBoundingBox;
+import net.minecraft.util.math.MutableBoundingBox;
import java.awt.*;
super(minBlockPos, maxBlockPos, color);
}
- public static BoundingBoxStructure from(StructureBoundingBox bb, Color color) {
+ public static BoundingBoxStructure from(MutableBoundingBox bb, Color color) {
BlockPos minBlockPos = new BlockPos(bb.minX, bb.minY, bb.minZ);
BlockPos maxBlockPos = new BlockPos(bb.maxX, bb.maxY, bb.maxZ);
return new BoundingBoxStructure(minBlockPos, maxBlockPos, color);
import net.minecraft.village.VillageDoorInfo;
import java.awt.*;
-import java.util.*;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class BoundingBoxVillage extends BoundingBox {
private final BlockPos center;