package com.irtimaled.bbor.client;
import com.irtimaled.bbor.client.interop.ClientInterop;
+import com.irtimaled.bbor.client.interop.TileEntitiesHelper;
import com.irtimaled.bbor.client.models.Point;
import com.irtimaled.bbor.client.providers.BeaconProvider;
import com.irtimaled.bbor.client.providers.BedrockCeilingProvider;
}
static {
- if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
- registerProvider(new SlimeChunkProvider());
- registerProvider(new WorldSpawnProvider());
- registerProvider(new SpawningSphereProvider());
- registerProvider(new BeaconProvider());
- registerProvider(new CustomBoxProvider());
- registerProvider(new CustomBeaconProvider());
- registerProvider(new BiomeBorderProvider());
- registerProvider(new MobSpawnerProvider());
- registerProvider(new ConduitProvider());
- registerProvider(new SpawnableBlocksProvider());
- registerProvider(new CustomLineProvider());
- registerProvider(new CustomSphereProvider());
- registerProvider(new FlowerForestProvider());
- registerProvider(new BedrockCeilingProvider());
- }
+ registerProvider(new SlimeChunkProvider());
+ registerProvider(new WorldSpawnProvider());
+ registerProvider(new SpawningSphereProvider());
+ registerProvider(new BeaconProvider());
+ registerProvider(new CustomBoxProvider());
+ registerProvider(new CustomBeaconProvider());
+ registerProvider(new BiomeBorderProvider());
+ registerProvider(new MobSpawnerProvider());
+ registerProvider(new ConduitProvider());
+ registerProvider(new SpawnableBlocksProvider());
+ registerProvider(new CustomLineProvider());
+ registerProvider(new CustomSphereProvider());
+ registerProvider(new FlowerForestProvider());
+ registerProvider(new BedrockCeilingProvider());
}
public static <T extends AbstractBoundingBox> void registerProvider(IBoundingBoxProvider<T> provider) {
long startTime = System.nanoTime();
matrixStack.push();
RenderHelper.beforeRender();
+ TileEntitiesHelper.clearCache();
for (AbstractBoundingBox key : getBoundingBoxes(dimensionId)) {
AbstractRenderer renderer = key.getRenderer();
package com.irtimaled.bbor.client.interop;
import com.irtimaled.bbor.common.models.Coords;
+import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.registry.Registry;
-import net.minecraft.world.biome.Biome;
-import net.minecraft.world.biome.source.BiomeArray;
-import net.minecraft.world.biome.source.BiomeCoords;
-import net.minecraft.world.chunk.WorldChunk;
public class BiomeBorderHelper {
- private static final Long2ObjectOpenHashMap<BiomeArray> biomeCache = new Long2ObjectOpenHashMap<>();
+ private static final Long2ObjectOpenHashMap<Long2IntOpenHashMap> biomeCache = new Long2ObjectOpenHashMap<>();
public static void onChunkLoaded(int chunkX, int chunkZ) {
- assert MinecraftClient.getInstance().world != null;
- final WorldChunk chunk = MinecraftClient.getInstance().world.getChunk(chunkX, chunkZ);
- if (chunk == null) return;
- biomeCache.put(ChunkPos.toLong(chunkX, chunkZ), chunk.getBiomeArray());
+
}
public static void onChunkUnload(int chunkX, int chunkZ) {
biomeCache.remove(ChunkPos.toLong(chunkX, chunkZ));
}
+ public static void onDisconnect() {
+ biomeCache.clear();
+ }
+
public static int getBiomeId(Coords coords) {
return getBiomeId(coords.getX(), coords.getY(), coords.getZ());
}
public static int getBiomeId(int x, int y, int z) {
BlockPos pos = new BlockPos(x, y, z);
- final BiomeArray biomeArray = biomeCache.get(ChunkPos.toLong(pos));
+ final Long2IntOpenHashMap biomeArray = biomeCache.computeIfAbsent(ChunkPos.toLong(pos), key -> createNewMap());
final ClientWorld world = MinecraftClient.getInstance().world;
- final Biome biome;
- if (biomeArray != null) {
- biome = biomeArray.getBiomeForNoiseGen(BiomeCoords.fromBlock(x & 15), y, BiomeCoords.fromBlock(z & 15));
- } else {
+ return biomeArray.computeIfAbsent(pos.asLong(), key -> {
assert world != null;
- biome = world.getBiome(pos);
- }
- return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(biome);
+ return world.getRegistryManager().get(Registry.BIOME_KEY).getRawId(world.getBiome(pos));
+ });
+ }
+
+ private static Long2IntOpenHashMap createNewMap() {
+ final Long2IntOpenHashMap long2IntOpenHashMap = new Long2IntOpenHashMap();
+ long2IntOpenHashMap.defaultReturnValue(-1);
+ return long2IntOpenHashMap;
}
}
public class ClientInterop {
public static void disconnectedFromRemoteServer() {
SaveGameStructureLoader.clear();
+ BiomeBorderHelper.onDisconnect();
EventBus.publish(new DisconnectedFromRemoteServer());
}
import net.minecraft.client.MinecraftClient;
import net.minecraft.world.chunk.WorldChunk;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
public class TileEntitiesHelper {
- public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
- @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
- Collection<BlockEntity> tileEntities = new HashSet<>();
- for (int i = 0; i < chunks.length(); i ++) {
- final WorldChunk worldChunk = chunks.get(i);
- if(worldChunk == null) continue;
- tileEntities.addAll(worldChunk.getBlockEntities().values());
+
+ private static Collection<BlockEntity> tileEntities = null;
+
+ private static Collection<BlockEntity> getTileEntities() {
+ if (tileEntities == null) {
+ @SuppressWarnings("ConstantConditions") final AtomicReferenceArray<WorldChunk> chunks = ((IClientChunkManagerClientChunkMap) (Object) ((IClientChunkManager) MinecraftClient.getInstance().world.getChunkManager()).getChunks()).getChunks();
+ Collection<BlockEntity> tileEntities = new ArrayList<>();
+ for (int i = 0; i < chunks.length(); i ++) {
+ final WorldChunk worldChunk = chunks.get(i);
+ if(worldChunk == null) continue;
+ tileEntities.addAll(worldChunk.getBlockEntities().values());
+ }
+ TileEntitiesHelper.tileEntities = tileEntities;
+ return tileEntities;
}
+ return tileEntities;
+ }
+
+ public static void clearCache() {
+ tileEntities = null;
+ }
+
+ public static <T extends BlockEntity, S extends AbstractBoundingBox> Iterable<S> map(Class<T> clazz, Function<T, S> map) {
+ final Collection<BlockEntity> tileEntities = getTileEntities();
Set<S> results = new HashSet<>();
for (BlockEntity tileEntity : tileEntities) {
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.BeaconRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxBeacon extends BoundingBoxCuboid {
- private static final AbstractRenderer<BoundingBoxBeacon> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBeacon.class, () -> new BeaconRenderer());
+ private static final AbstractRenderer<BoundingBoxBeacon> RENDERER = CommonInterop.registerRenderer(BoundingBoxBeacon.class, () -> new BeaconRenderer());
private final Coords coords;
private final int level;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.CuboidRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxBedrockCeiling extends BoundingBoxCuboid {
- private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer());
+ private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = CommonInterop.registerRenderer(BoundingBoxBedrockCeiling.class, () -> new CuboidRenderer());
public BoundingBoxBedrockCeiling(Coords coords) {
super(coords, coords, BoundingBoxType.BedrockCeiling);
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.RenderCulling;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.BiomeBorderRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxBiomeBorder extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxBiomeBorder> RENDERER = ClientRenderer.registerRenderer(BoundingBoxBiomeBorder.class, () -> new BiomeBorderRenderer());
+ private static final AbstractRenderer<BoundingBoxBiomeBorder> RENDERER = CommonInterop.registerRenderer(BoundingBoxBiomeBorder.class, () -> new BiomeBorderRenderer());
private final Coords coords;
private final boolean north;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.ConduitRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxConduit extends BoundingBoxSphere {
- private static final AbstractRenderer<BoundingBoxConduit> RENDERER = ClientRenderer.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer());
+ private static final AbstractRenderer<BoundingBoxConduit> RENDERER = CommonInterop.registerRenderer(BoundingBoxConduit.class, () -> new ConduitRenderer());
private final int level;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.RenderCulling;
import com.irtimaled.bbor.client.config.ColorHelper;
import com.irtimaled.bbor.client.config.HexColor;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.FlowerForestRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.Coords;
import java.awt.*;
public class BoundingBoxFlowerForest extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxFlowerForest> RENDERER = ClientRenderer.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer());
+ private static final AbstractRenderer<BoundingBoxFlowerForest> RENDERER = CommonInterop.registerRenderer(BoundingBoxFlowerForest.class, () -> new FlowerForestRenderer());
private final Coords coords;
private final Setting<HexColor> colorSetting;
@Override
public boolean isVisibleCulling() {
- return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ());
+ return RenderCulling.isVisibleCulling(coords.getX(), coords.getY() + 0.01d, coords.getZ(), coords.getX() + 1, coords.getY(), coords.getZ() + 1);
}
}
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.RenderCulling;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.LineRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
public class BoundingBoxLine extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxLine> RENDERER = ClientRenderer.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer());
+ private static final AbstractRenderer<BoundingBoxLine> RENDERER = CommonInterop.registerRenderer(BoundingBoxLine.class, () -> new LineRenderer());
private final Point minPoint;
private final Point maxPoint;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.MobSpawnerRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxMobSpawner extends BoundingBoxCuboid {
- private static final AbstractRenderer<BoundingBoxMobSpawner> RENDERER = ClientRenderer.registerRenderer(BoundingBoxMobSpawner.class, () -> new MobSpawnerRenderer());
+ private static final AbstractRenderer<BoundingBoxMobSpawner> RENDERER = CommonInterop.registerRenderer(BoundingBoxMobSpawner.class, () -> new MobSpawnerRenderer());
private final Coords coords;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.Player;
import com.irtimaled.bbor.client.config.ConfigManager;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.SlimeChunkRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.MathHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxSlimeChunk extends BoundingBoxCuboid {
- private static final AbstractRenderer<BoundingBoxSlimeChunk> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSlimeChunk.class, () -> new SlimeChunkRenderer());
+ private static final AbstractRenderer<BoundingBoxSlimeChunk> RENDERER = CommonInterop.registerRenderer(BoundingBoxSlimeChunk.class, () -> new SlimeChunkRenderer());
public BoundingBoxSlimeChunk(Coords minCoords, Coords maxCoords) {
super(minCoords, maxCoords, BoundingBoxType.SlimeChunks);
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.SpawnableBlocksRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import net.minecraft.util.math.BlockPos;
import java.util.Set;
public class BoundingBoxSpawnableBlocks extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxSpawnableBlocks> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawnableBlocks.class, () -> new SpawnableBlocksRenderer());
+ private static final AbstractRenderer<BoundingBoxSpawnableBlocks> RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawnableBlocks.class, () -> new SpawnableBlocksRenderer());
private final Set<BlockPos> blocks = new HashSet<>();
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.SpawningSphereRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import net.minecraft.util.math.BlockPos;
import java.util.HashSet;
import java.util.Set;
public class BoundingBoxSpawningSphere extends BoundingBoxSphere {
- private static final AbstractRenderer<BoundingBoxSpawningSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer());
+ private static final AbstractRenderer<BoundingBoxSpawningSphere> RENDERER = CommonInterop.registerRenderer(BoundingBoxSpawningSphere.class, () -> new SpawningSphereRenderer());
public static final int SAFE_RADIUS = 24;
public static final int SPAWN_RADIUS = 128;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.SphereRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxSphere extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxSphere> RENDERER = ClientRenderer.registerRenderer(BoundingBoxSphere.class, () -> new SphereRenderer());
+ private static final AbstractRenderer<BoundingBoxSphere> RENDERER = CommonInterop.registerRenderer(BoundingBoxSphere.class, () -> new SphereRenderer());
private final double radius;
private final double minX;
package com.irtimaled.bbor.client.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.WorldSpawnRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
+import com.irtimaled.bbor.common.interop.CommonInterop;
import com.irtimaled.bbor.common.models.BoundingBoxCuboid;
import com.irtimaled.bbor.common.models.Coords;
public class BoundingBoxWorldSpawn extends BoundingBoxCuboid {
- private static final AbstractRenderer<BoundingBoxWorldSpawn> RENDERER = ClientRenderer.registerRenderer(BoundingBoxWorldSpawn.class, () -> new WorldSpawnRenderer());
+ private static final AbstractRenderer<BoundingBoxWorldSpawn> RENDERER = CommonInterop.registerRenderer(BoundingBoxWorldSpawn.class, () -> new WorldSpawnRenderer());
public BoundingBoxWorldSpawn(Coords minCoords, Coords maxCoords, BoundingBoxType type) {
super(minCoords, maxCoords, type);
import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.DimensionId;
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import java.util.Set;
public Iterable<AbstractBoundingBox> get(DimensionId dimensionId) {
Boolean outerBoxesOnly = ConfigManager.outerBoxesOnly.get();
- Set<AbstractBoundingBox> boundingBoxes = new HashSet<>();
+ List<AbstractBoundingBox> boundingBoxes = new ArrayList<>();
BoundingBoxCache cache = getCache.apply(dimensionId);
if (cache != null) {
for (Map.Entry<AbstractBoundingBox, Set<AbstractBoundingBox>> entry : cache.getBoundingBoxes().entrySet()) {
int minZ = blockZ - width;
int maxZ = blockZ + width;
- Map<Coords, BoundingBoxFlowerForest> boundingBoxes = new HashMap<>();
+ Map<Coords, BoundingBoxFlowerForest> boundingBoxes = new HashMap<>((maxX - minX) * (maxZ - minZ));
for (int x = minX; x <= maxX; x++) {
for (int z = minZ; z <= maxZ; z++) {
int biomeId = BiomeBorderHelper.getBiomeId(x, 255, z);
}
private static int getMaxYForPos(int x, int y, int z) {
- int topY = MinecraftClient.getInstance().world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z) + 1;
+ int topY = MinecraftClient.getInstance().world.getTopY(Heightmap.Type.MOTION_BLOCKING, x, z);
+ if (topY == 0) topY = y; // heightmap appears to be broken
while (topY > 0) {
if (FlowerForestHelper.canGrowFlower(x, topY, z)) return topY;
topY--;
public class SlimeChunkProvider implements IBoundingBoxProvider<BoundingBoxSlimeChunk>, ICachingProvider {
private static final double CHUNK_SIZE = 16d;
- private static Long seed;
+ private static volatile Long seed;
public static void setSeed(long seed) {
SlimeChunkProvider.seed = seed;
import com.irtimaled.bbor.common.models.DimensionId;
import net.minecraft.client.MinecraftClient;
-import java.util.HashSet;
+import java.util.Collections;
import java.util.Set;
public class SpawnableBlocksProvider implements IBoundingBoxProvider<BoundingBoxSpawnableBlocks>, ICachingProvider {
SpawnableBlocksHelper.findSpawnableBlocks(Player.getCoords(), width, height, boundingBox.getBlocks()::add);
- Set<BoundingBoxSpawnableBlocks> boundingBoxes = new HashSet<>();
- boundingBoxes.add(boundingBox);
- return boundingBoxes;
+ return Collections.singleton(boundingBox);
}
}
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.Quaternion;
-import net.minecraft.util.math.Vec3d;
import org.lwjgl.opengl.GL11;
public class RenderHelper {
regionZ - Camera.getZ());
}
- /**
- * Compute hash code for vec3d
- * @see Vec3d#hashCode()
- *
- * @param x x value
- * @param y y value
- * @param z z value
- * @return hash code
- */
- public static long hashVec3d(double x, double y, double z) {
- long l = Double.doubleToLongBits(x);
- int i = (int)(l ^ l >>> 32);
- l = Double.doubleToLongBits(y);
- i = 31 * i + (int)(l ^ l >>> 32);
- l = Double.doubleToLongBits(z);
- i = 31 * i + (int)(l ^ l >>> 32);
- return i;
- }
}
import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
import com.irtimaled.bbor.client.models.BoundingBoxSpawnableBlocks;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.util.math.BlockPos;
import java.awt.*;
@Override
public void render(MatrixStack matrixStack, BoundingBoxSpawnableBlocks boundingBox) {
Color color = BoundingBoxTypeHelper.getColor(boundingBox.getType());
- boundingBox.getBlocks().forEach(c -> {
+ for (BlockPos c : boundingBox.getBlocks()) {
int x = c.getX();
int y = c.getY();
int z = c.getZ();
OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1);
renderCuboid(matrixStack, offsetBox, color, false, 30);
- });
+ }
}
}
import com.irtimaled.bbor.common.BoundingBoxType;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.util.math.BlockPos;
import java.awt.*;
private void renderSpawnableSpaces(MatrixStack matrixStack, BoundingBoxSpawningSphere boundingBox) {
Color color = BoundingBoxTypeHelper.getColor(BoundingBoxType.SpawnableBlocks);
- boundingBox.getBlocks().forEach(c -> {
+ for (BlockPos c : boundingBox.getBlocks()) {
int x = c.getX();
int y = c.getY();
int z = c.getZ();
OffsetBox offsetBox = new OffsetBox(x, y, z, x + 1, y, z + 1);
renderCuboid(matrixStack, offsetBox, color, false, 30);
- });
+ }
}
}
package com.irtimaled.bbor.common.interop;
+import com.irtimaled.bbor.client.ClientRenderer;
+import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.common.EventBus;
import com.irtimaled.bbor.common.events.PlayerLoggedIn;
import com.irtimaled.bbor.common.events.PlayerLoggedOut;
import com.irtimaled.bbor.common.events.ServerTick;
import com.irtimaled.bbor.common.events.StructuresLoaded;
import com.irtimaled.bbor.common.events.WorldLoaded;
+import com.irtimaled.bbor.common.models.AbstractBoundingBox;
import com.irtimaled.bbor.common.models.DimensionId;
import com.irtimaled.bbor.common.models.ServerPlayer;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.network.ClientConnection;
import net.minecraft.server.network.ServerPlayNetworkHandler;
import net.minecraft.server.network.ServerPlayerEntity;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
+import java.util.function.Supplier;
public class CommonInterop {
public static void chunkLoaded(WorldChunk chunk) {
public static void playerSubscribed(ServerPlayerEntity player) {
EventBus.publish(new PlayerSubscribed(player.getId(), new ServerPlayer(player)));
}
+
+ public static <T extends AbstractBoundingBox> AbstractRenderer<T> registerRenderer(Class<? extends T> type, Supplier<AbstractRenderer<T>> renderer) {
+ if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
+ return ClientRenderer.registerRenderer(type, renderer);
+ }
+ return null;
+ }
}
package com.irtimaled.bbor.common.models;
-import com.irtimaled.bbor.client.ClientRenderer;
import com.irtimaled.bbor.client.RenderCulling;
import com.irtimaled.bbor.client.renderers.AbstractRenderer;
import com.irtimaled.bbor.client.renderers.CuboidRenderer;
import com.irtimaled.bbor.common.BoundingBoxType;
import com.irtimaled.bbor.common.MathHelper;
import com.irtimaled.bbor.common.TypeHelper;
+import com.irtimaled.bbor.common.interop.CommonInterop;
public class BoundingBoxCuboid extends AbstractBoundingBox {
- private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = ClientRenderer.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer());
+ private static final AbstractRenderer<BoundingBoxCuboid> RENDERER = CommonInterop.registerRenderer(BoundingBoxCuboid.class, () -> new CuboidRenderer());
private final Coords minCoords;
private final Coords maxCoords;