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.MathHelper;
7 import com.irtimaled.bbor.common.models.Coords;
8 import com.irtimaled.bbor.common.models.DimensionId;
10 import java.util.HashSet;
13 public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn>, ICachingProvider {
14 private static final double CHUNK_SIZE = 16d;
15 private static BoundingBoxWorldSpawn spawnChunks;
16 private static BoundingBoxWorldSpawn lazyChunks;
17 private static BoundingBoxWorldSpawn worldSpawn;
19 public static void setWorldSpawn(int spawnX, int spawnZ) {
20 worldSpawn = getWorldSpawnBoundingBox(spawnX, spawnZ);
21 spawnChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 19, BoundingBoxType.SpawnChunks);
22 lazyChunks = buildSpawnChunksBoundingBox(spawnX, spawnZ, 21, BoundingBoxType.LazySpawnChunks);
25 public void clearCache() {
31 private static BoundingBoxWorldSpawn getWorldSpawnBoundingBox(int spawnX, int spawnZ) {
32 Coords minCoords = new Coords(spawnX - 10, 0, spawnZ - 10);
33 Coords maxCoords = new Coords(spawnX + 10, 0, spawnZ + 10);
35 return new BoundingBoxWorldSpawn(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
38 private static BoundingBoxWorldSpawn buildSpawnChunksBoundingBox(int spawnX, int spawnZ, int size, BoundingBoxType type) {
39 int spawnChunkX = MathHelper.floor(spawnX / CHUNK_SIZE);
40 int spawnChunkZ = MathHelper.floor(spawnZ / CHUNK_SIZE);
41 int midOffset = ((size - 1) / 2);
43 int minX = spawnChunkX - midOffset;
44 int maxX = spawnChunkX + midOffset;
45 int minZ = spawnChunkZ - midOffset;
46 int maxZ = spawnChunkZ + midOffset;
49 Coords maxCoords = new Coords(minX * CHUNK_SIZE, 0, minZ * CHUNK_SIZE);
50 Coords minCoords = new Coords(16 + (maxX * CHUNK_SIZE), 0, 16 + (maxZ * CHUNK_SIZE));
51 return new BoundingBoxWorldSpawn(minCoords, maxCoords, type);
55 public boolean canProvide(DimensionId dimensionId) {
56 return dimensionId == DimensionId.OVERWORLD;
60 public Iterable<BoundingBoxWorldSpawn> get(DimensionId dimensionId) {
61 Set<BoundingBoxWorldSpawn> boundingBoxes = new HashSet<>();
62 if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.WorldSpawn)) {
63 if (worldSpawn != null) boundingBoxes.add(worldSpawn);
64 if (spawnChunks != null) boundingBoxes.add(spawnChunks);
66 if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.LazySpawnChunks)) {
67 if (lazyChunks != null) boundingBoxes.add(lazyChunks);