]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/WorldSpawnProvider.java
b3884c939f6ee7657496f460335ca6b3b6553a8d
[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.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;
8
9 import java.util.HashSet;
10 import java.util.Set;
11
12 public class WorldSpawnProvider implements IBoundingBoxProvider<BoundingBoxWorldSpawn> {
13     private static final double CHUNK_SIZE = 16d;
14     private static BoundingBoxWorldSpawn spawnChunks;
15     private static BoundingBoxWorldSpawn lazyChunks;
16     private static BoundingBoxWorldSpawn worldSpawn;
17
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);
22     }
23
24     public static void clear() {
25         worldSpawn = null;
26         spawnChunks = null;
27         lazyChunks = null;
28     }
29
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);
33
34         return BoundingBoxWorldSpawn.from(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
35     }
36
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) {
43             midX -= CHUNK_SIZE;
44         }
45         if ((spawnZ / CHUNK_SIZE) % 1.0D == 0.5D) {
46             midZ -= CHUNK_SIZE;
47         }
48         Coords minCoords = new Coords(midX - midOffset, 0, midZ - midOffset);
49         return BoundingBoxWorldSpawn.from(minCoords, maxCoords, type);
50     }
51
52     @Override
53     public boolean canProvide(DimensionId dimensionId) {
54         return dimensionId == DimensionId.OVERWORLD;
55     }
56
57     @Override
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);
63         }
64         if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.LazySpawnChunks)) {
65             if (lazyChunks != null) boundingBoxes.add(lazyChunks);
66         }
67         return boundingBoxes;
68     }
69 }