]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/WorldSpawnProvider.java
560423e8b42587c1c353f684e71c86fb9fc4d6b9
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / WorldSpawnProvider.java
1 package com.irtimaled.bbor.client.providers;
2
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;
7
8 import java.util.HashSet;
9 import java.util.Set;
10
11 public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn> {
12     private static final double CHUNK_SIZE = 16d;
13     private static Set<BoundingBoxWorldSpawn> spawnChunks = new HashSet<>();
14
15     public static void setWorldSpawn(int spawnX, int spawnZ) {
16         spawnChunks = getSpawnChunkBoundingBoxes(spawnX, spawnZ);
17     }
18
19     public static void clear() {
20         spawnChunks = new HashSet<>();
21     }
22
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));
28         return boundingBoxes;
29     }
30
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);
34
35         return BoundingBoxWorldSpawn.from(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
36     }
37
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) {
44             midX -= CHUNK_SIZE;
45         }
46         if ((spawnZ / CHUNK_SIZE) % 1.0D == 0.5D) {
47             midZ -= CHUNK_SIZE;
48         }
49         Coords minCoords = new Coords(midX - midOffset, 0, midZ - midOffset);
50         return BoundingBoxWorldSpawn.from(minCoords, maxCoords, type);
51     }
52
53     public Iterable<BoundingBoxWorldSpawn> get(int dimensionId) {
54         return dimensionId == Dimensions.OVERWORLD ? spawnChunks : Iterators.empty();
55     }
56 }