1 package com.irtimaled.bbor.client.providers;
3 import com.irtimaled.bbor.client.models.BoundingBoxWorldSpawn;
4 import com.irtimaled.bbor.common.BoundingBoxType;
5 import com.irtimaled.bbor.common.Dimensions;
6 import com.irtimaled.bbor.common.models.Coords;
8 import java.util.HashSet;
11 public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn> {
12 private static final double CHUNK_SIZE = 16d;
13 private static Set<BoundingBoxWorldSpawn> spawnChunks = new HashSet<>();
15 public static void setWorldSpawn(int spawnX, int spawnZ) {
16 spawnChunks = getSpawnChunkBoundingBoxes(spawnX, spawnZ);
19 public static void clear() {
20 spawnChunks = new HashSet<>();
23 private static Set<BoundingBoxWorldSpawn> getSpawnChunkBoundingBoxes(int spawnX, int spawnZ) {
24 Set<BoundingBoxWorldSpawn> boundingBoxes = new HashSet<>();
25 boundingBoxes.add(getWorldSpawnBoundingBox(spawnX, spawnZ));
26 boundingBoxes.add(buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks));
27 boundingBoxes.add(buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks));
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 BoundingBoxWorldSpawn.from(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
38 private static BoundingBoxWorldSpawn buildSpawnChunksBoundingBox(int spawnX, int spawnZ, int size, BoundingBoxType type) {
39 double midOffset = CHUNK_SIZE * (size / 2.0);
40 double midX = Math.round((float) (spawnX / CHUNK_SIZE)) * CHUNK_SIZE;
41 double midZ = Math.round((float) (spawnZ / CHUNK_SIZE)) * CHUNK_SIZE;
42 Coords maxCoords = new Coords(midX + midOffset, 0, midZ + midOffset);
43 if ((spawnX / CHUNK_SIZE) % 1.0D == 0.5D) {
46 if ((spawnZ / CHUNK_SIZE) % 1.0D == 0.5D) {
49 Coords minCoords = new Coords(midX - midOffset, 0, midZ - midOffset);
50 return BoundingBoxWorldSpawn.from(minCoords, maxCoords, type);
53 public Iterable<BoundingBoxWorldSpawn> get(int dimensionId) {
54 return dimensionId == Dimensions.OVERWORLD ? spawnChunks : Iterators.empty();