1 package com.irtimaled.bbor.client.providers;
3 import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
4 import com.irtimaled.bbor.client.models.BoundingBoxWorldSpawn;
5 import com.irtimaled.bbor.common.BoundingBoxType;
6 import com.irtimaled.bbor.common.models.Coords;
7 import com.irtimaled.bbor.common.models.DimensionId;
9 import java.util.HashSet;
12 public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn>, ICachingProvider {
13 private static final double CHUNK_SIZE = 16d;
14 private static BoundingBoxWorldSpawn spawnChunks;
15 private static BoundingBoxWorldSpawn lazyChunks;
16 private static BoundingBoxWorldSpawn worldSpawn;
18 public static void setWorldSpawn(int spawnX, int spawnZ) {
19 worldSpawn = getWorldSpawnBoundingBox(spawnX, spawnZ);
20 spawnChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks);
21 lazyChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks);
24 public void clearCache() {
30 private static BoundingBoxWorldSpawn getWorldSpawnBoundingBox(int spawnX, int spawnZ) {
31 Coords minCoords = new Coords(spawnX - 10, 0, spawnZ - 10);
32 Coords maxCoords = new Coords(spawnX + 10, 0, spawnZ + 10);
34 return new BoundingBoxWorldSpawn(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
37 private static BoundingBoxWorldSpawn buildSpawnChunksBoundingBox(int spawnX, int spawnZ, int size, BoundingBoxType type) {
38 double midOffset = CHUNK_SIZE * (size / 2.0);
39 double midX = Math.round((float) (spawnX / CHUNK_SIZE)) * CHUNK_SIZE;
40 double midZ = Math.round((float) (spawnZ / CHUNK_SIZE)) * CHUNK_SIZE;
41 Coords maxCoords = new Coords(midX + midOffset, 0, midZ + midOffset);
42 if ((spawnX / CHUNK_SIZE) % 1.0D == 0.5D) {
45 if ((spawnZ / CHUNK_SIZE) % 1.0D == 0.5D) {
48 Coords minCoords = new Coords(midX - midOffset, 0, midZ - midOffset);
49 return new BoundingBoxWorldSpawn(minCoords, maxCoords, type);
53 public boolean canProvide(DimensionId dimensionId) {
54 return dimensionId == DimensionId.OVERWORLD;
58 public Iterable<BoundingBoxWorldSpawn> get(DimensionId dimensionId) {
59 Set<BoundingBoxWorldSpawn> boundingBoxes = new HashSet<>();
60 if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.WorldSpawn)) {
61 if (worldSpawn != null) boundingBoxes.add(worldSpawn);
62 if (spawnChunks != null) boundingBoxes.add(spawnChunks);
64 if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.LazySpawnChunks)) {
65 if (lazyChunks != null) boundingBoxes.add(lazyChunks);