}
public static void render(int dimensionId) {
- if(!active) return;
+ if (!active) return;
Set<AbstractBoundingBox> boundingBoxes = getBoundingBoxes(dimensionId);
}
for (AbstractBoundingBox key : boundingBoxes) {
- if (!key.shouldRender() || !isWithinRenderDistance(key)) continue;
-
AbstractRenderer renderer = boundingBoxRendererMap.get(key.getClass());
if (renderer == null) continue;
private static Set<AbstractBoundingBox> getBoundingBoxes(int dimensionId) {
Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
- for(IBoundingBoxProvider<?> provider: providers) {
- for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) {
- boundingBoxes.add(boundingBox);
+ for (IBoundingBoxProvider<?> provider : providers) {
+ if (provider.canProvide(dimensionId)) {
+ for (AbstractBoundingBox boundingBox : provider.get(dimensionId)) {
+ if (isWithinRenderDistance(boundingBox)) {
+ boundingBoxes.add(boundingBox);
+ }
+ }
}
}
return boundingBoxes;
--- /dev/null
+package com.irtimaled.bbor.client.config;
+
+import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.config.ConfigManager;
+import com.irtimaled.bbor.config.Setting;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class BoundingBoxTypeHelper {
+ private static final Map<String, Setting<Boolean>> structureTypeMap = new HashMap<>();
+
+ private static void registerType(BoundingBoxType type, Setting<Boolean> shouldRenderSetting) {
+ structureTypeMap.put(type.getName(), shouldRenderSetting);
+ }
+
+ static {
+ registerType(BoundingBoxType.WorldSpawn, ConfigManager.drawWorldSpawn);
+ registerType(BoundingBoxType.SpawnChunks, ConfigManager.drawWorldSpawn);
+ registerType(BoundingBoxType.LazySpawnChunks, ConfigManager.drawLazySpawnChunks);
+ registerType(BoundingBoxType.MobSpawner, ConfigManager.drawMobSpawners);
+ registerType(BoundingBoxType.SlimeChunks, ConfigManager.drawSlimeChunks);
+ registerType(BoundingBoxType.AFKSphere, ConfigManager.drawAFKSpheres);
+ registerType(BoundingBoxType.BiomeBorder, ConfigManager.drawBiomeBorders);
+ registerType(BoundingBoxType.Beacon, ConfigManager.drawBeacons);
+ registerType(BoundingBoxType.Conduit, ConfigManager.drawConduits);
+
+ registerType(BoundingBoxType.JungleTemple, ConfigManager.drawJungleTemples);
+ registerType(BoundingBoxType.DesertTemple, ConfigManager.drawDesertTemples);
+ registerType(BoundingBoxType.WitchHut, ConfigManager.drawWitchHuts);
+ registerType(BoundingBoxType.OceanMonument, ConfigManager.drawOceanMonuments);
+ registerType(BoundingBoxType.Shipwreck, ConfigManager.drawShipwrecks);
+ registerType(BoundingBoxType.OceanRuin, ConfigManager.drawOceanRuins);
+ registerType(BoundingBoxType.BuriedTreasure, ConfigManager.drawBuriedTreasure);
+ registerType(BoundingBoxType.Stronghold, ConfigManager.drawStrongholds);
+ registerType(BoundingBoxType.MineShaft, ConfigManager.drawMineShafts);
+ registerType(BoundingBoxType.NetherFortress, ConfigManager.drawNetherFortresses);
+ registerType(BoundingBoxType.EndCity, ConfigManager.drawEndCities);
+ registerType(BoundingBoxType.Mansion, ConfigManager.drawMansions);
+ registerType(BoundingBoxType.Igloo, ConfigManager.drawIgloos);
+ registerType(BoundingBoxType.PillagerOutpost, ConfigManager.drawPillagerOutposts);
+ registerType(BoundingBoxType.Village, ConfigManager.drawVillages);
+ registerType(BoundingBoxType.VillageSpheres, ConfigManager.drawVillageSpheres);
+ registerType(BoundingBoxType.NetherFossil, ConfigManager.drawNetherFossils);
+ registerType(BoundingBoxType.BastionRemnant, ConfigManager.drawBastionRemnants);
+ registerType(BoundingBoxType.RuinedPortal, ConfigManager.drawRuinedPortals);
+ }
+
+ public static boolean shouldRender(BoundingBoxType type) {
+ Setting<Boolean> setting = structureTypeMap.get(type.getName());
+ return setting != null ? setting.get() : false;
+ }
+}
package com.irtimaled.bbor.client.providers;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
import com.irtimaled.bbor.client.models.BoundingBoxBeacon;
+import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.models.Coords;
import net.minecraft.tileentity.TileEntityBeacon;
public class BeaconProvider implements IBoundingBoxProvider<BoundingBoxBeacon> {
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.Beacon);
+ }
+
+ @Override
public Iterable<BoundingBoxBeacon> get(int dimensionId) {
return TileEntitiesHelper.map(TileEntityBeacon.class, beacon -> {
int levels = beacon.getLevels();
package com.irtimaled.bbor.client.providers;
import com.irtimaled.bbor.client.Player;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.BiomeBorderHelper;
import com.irtimaled.bbor.client.models.BoundingBoxBiomeBorder;
import com.irtimaled.bbor.common.BoundingBoxType;
private static Integer lastMaxY = null;
private static Map<Coords, BoundingBoxBiomeBorder> lastBorders = new HashMap<>();
- public Iterable<BoundingBoxBiomeBorder> get(int dimensionId) {
- if (!BoundingBoxType.BiomeBorder.shouldRender())
- return Iterators.empty();
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.BiomeBorder);
+ }
+ @Override
+ public Iterable<BoundingBoxBiomeBorder> get(int dimensionId) {
Coords playerCoords = Player.getCoords();
Integer renderDistance = ConfigManager.biomeBordersRenderDistance.get();
Boolean renderAllTransitions = !ConfigManager.renderOnlyCurrentBiome.get();
import com.irtimaled.bbor.client.GetCache;
import com.irtimaled.bbor.client.Player;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.ClientInterop;
import com.irtimaled.bbor.common.BoundingBoxCache;
import com.irtimaled.bbor.common.MathHelper;
if (cache != null) {
for (Map.Entry<AbstractBoundingBox, Set<AbstractBoundingBox>> entry : cache.getBoundingBoxes().entrySet()) {
AbstractBoundingBox key = entry.getKey();
- if (key.shouldRender() && isWithinRenderDistance(key)) {
+ if (BoundingBoxTypeHelper.shouldRender(key.getType()) && isWithinRenderDistance(key)) {
if (!outerBoxesOnly) {
Set<AbstractBoundingBox> children = entry.getValue();
if (children != null && children.size() > 0) {
package com.irtimaled.bbor.client.providers;
import com.irtimaled.bbor.ReflectionHelper;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
import com.irtimaled.bbor.client.models.BoundingBoxConduit;
+import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.models.Coords;
import net.minecraft.tileentity.TileEntityConduit;
import net.minecraft.util.math.BlockPos;
private static final Function<TileEntityConduit, List<BlockPos>> blocksFetcher =
ReflectionHelper.getPrivateFieldGetter(TileEntityConduit.class, List.class, BlockPos.class);
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.Conduit);
+ }
+
@Override
public Iterable<BoundingBoxConduit> get(int dimensionId) {
return TileEntitiesHelper.map(TileEntityConduit.class, conduit -> {
public interface IBoundingBoxProvider<T extends AbstractBoundingBox> {
Iterable<T> get(int dimensionId);
+ default boolean canProvide(int dimensionId) { return true; }
}
+++ /dev/null
-package com.irtimaled.bbor.client.providers;
-
-import com.irtimaled.bbor.common.models.AbstractBoundingBox;
-
-import java.util.Iterator;
-import java.util.function.Supplier;
-
-class Iterators {
- private static class Empty<T> implements Iterable<T> {
- @Override
- public Iterator<T> iterator() {
- return new Iterator<T>() {
- @Override
- public boolean hasNext() {
- return false;
- }
-
- @Override
- public T next() {
- return null;
- }
- };
- }
- }
-
- static <T extends AbstractBoundingBox> Iterable<T> empty() {
- return new Empty<>();
- }
-
- private static class SingletonIterable<T> implements Iterable<T> {
- private final Supplier<T> supplier;
-
- private SingletonIterable(Supplier<T> supplier) {
- this.supplier = supplier;
- }
-
- @Override
- public Iterator<T> iterator() {
- return new Iterator<T>() {
- private boolean hasNext = true;
- @Override
- public boolean hasNext() {
- return hasNext;
- }
-
- @Override
- public T next() {
- if(!hasNext) return null;
-
- hasNext = false;
- return supplier.get();
- }
- };
- }
- }
-
- public static <T extends AbstractBoundingBox> Iterable<T> singleton(final Supplier<T> supplier) {
- return new SingletonIterable<>(supplier);
- }
-}
package com.irtimaled.bbor.client.providers;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
import com.irtimaled.bbor.client.models.BoundingBoxMobSpawner;
+import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.models.Coords;
import net.minecraft.tileentity.TileEntityMobSpawner;
public class MobSpawnerProvider implements IBoundingBoxProvider<BoundingBoxMobSpawner> {
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.MobSpawner);
+ }
+
+ @Override
public Iterable<BoundingBoxMobSpawner> get(int dimensionId) {
return TileEntitiesHelper.map(TileEntityMobSpawner.class, spawner -> {
Coords coords = new Coords(spawner.getPos());
package com.irtimaled.bbor.client.providers;
import com.irtimaled.bbor.client.Player;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.ClientInterop;
import com.irtimaled.bbor.client.models.BoundingBoxSlimeChunk;
import com.irtimaled.bbor.common.BoundingBoxType;
seed = null;
}
- public Iterable<BoundingBoxSlimeChunk> get(int dimensionId) {
- if (!BoundingBoxType.SlimeChunks.shouldRender() || seed == null || dimensionId != Dimensions.OVERWORLD) {
- return Iterators.empty();
- }
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return dimensionId == Dimensions.OVERWORLD && seed != null && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.SlimeChunks);
+ }
+ public Iterable<BoundingBoxSlimeChunk> get(int dimensionId) {
Set<BoundingBoxSlimeChunk> slimeChunks = new HashSet<>();
int renderDistanceChunks = ClientInterop.getRenderDistanceChunks();
int playerChunkX = MathHelper.floor(Player.getX() / CHUNK_SIZE);
package com.irtimaled.bbor.client.providers;
import com.irtimaled.bbor.client.Player;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.interop.SpawningSphereHelper;
import com.irtimaled.bbor.client.models.BoundingBoxSpawningSphere;
import com.irtimaled.bbor.client.models.Point;
+import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.models.Coords;
+import java.util.HashSet;
+import java.util.Set;
+
public class SpawningSphereProvider implements IBoundingBoxProvider<BoundingBoxSpawningSphere> {
private static BoundingBoxSpawningSphere spawningSphere;
private static Integer dimensionId;
return SpawningSphereHelper.findSpawnableSpaces(center, center.getCoords(), size, size, (x, y, z) -> true);
}
- private static final Iterable<BoundingBoxSpawningSphere> iterable = Iterators.singleton(() -> spawningSphere);
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return spawningSphere != null && SpawningSphereProvider.dimensionId == dimensionId && BoundingBoxTypeHelper.shouldRender(BoundingBoxType.AFKSphere);
+ }
+ @Override
public Iterable<BoundingBoxSpawningSphere> get(int dimensionId) {
- if(spawningSphere == null || SpawningSphereProvider.dimensionId != dimensionId) {
- return Iterators.empty();
- }
- return iterable;
+ Set<BoundingBoxSpawningSphere> boundingBoxes = new HashSet<>();
+ boundingBoxes.add(spawningSphere);
+ return boundingBoxes;
}
}
package com.irtimaled.bbor.client.providers;
+import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.models.BoundingBoxWorldSpawn;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.Dimensions;
public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn> {
private static final double CHUNK_SIZE = 16d;
- private static Set<BoundingBoxWorldSpawn> spawnChunks = new HashSet<>();
+ private static BoundingBoxWorldSpawn spawnChunks;
+ private static BoundingBoxWorldSpawn lazyChunks;
+ private static BoundingBoxWorldSpawn worldSpawn;
public static void setWorldSpawn(int spawnX, int spawnZ) {
- spawnChunks = getSpawnChunkBoundingBoxes(spawnX, spawnZ);
+ worldSpawn = getWorldSpawnBoundingBox(spawnX, spawnZ);
+ spawnChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks);
+ lazyChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks);
}
public static void clear() {
- spawnChunks = new HashSet<>();
- }
-
- private static Set<BoundingBoxWorldSpawn> getSpawnChunkBoundingBoxes(int spawnX, int spawnZ) {
- Set<BoundingBoxWorldSpawn> boundingBoxes = new HashSet<>();
- boundingBoxes.add(getWorldSpawnBoundingBox(spawnX, spawnZ));
- boundingBoxes.add(buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks));
- boundingBoxes.add(buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks));
- return boundingBoxes;
+ worldSpawn = null;
+ spawnChunks = null;
+ lazyChunks = null;
}
private static BoundingBoxWorldSpawn getWorldSpawnBoundingBox(int spawnX, int spawnZ) {
return BoundingBoxWorldSpawn.from(minCoords, maxCoords, type);
}
+ @Override
+ public boolean canProvide(int dimensionId) {
+ return dimensionId == Dimensions.OVERWORLD;
+ }
+
+ @Override
public Iterable<BoundingBoxWorldSpawn> get(int dimensionId) {
- return dimensionId == Dimensions.OVERWORLD ? spawnChunks : Iterators.empty();
+ Set<BoundingBoxWorldSpawn> boundingBoxes = new HashSet<>();
+ if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.WorldSpawn)) {
+ if (worldSpawn != null) boundingBoxes.add(worldSpawn);
+ if (spawnChunks != null) boundingBoxes.add(spawnChunks);
+ }
+ if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.LazySpawnChunks)) {
+ if (lazyChunks != null) boundingBoxes.add(lazyChunks);
+ }
+ return boundingBoxes;
}
}
public String getTypeName() {
return type.getName();
}
+
+ public BoundingBoxType getType() {
+ return type;
+ }
}