]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/WorldSpawnProvider.java
Upgrade to 1.14.4
[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.MathHelper;
7 import com.irtimaled.bbor.common.models.Coords;
8 import com.irtimaled.bbor.common.models.DimensionId;
9
10 import java.util.HashSet;
11 import java.util.Set;
12
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;
18
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);
23     }
24
25     public void clearCache() {
26         worldSpawn = null;
27         spawnChunks = null;
28         lazyChunks = null;
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 new BoundingBoxWorldSpawn(minCoords, maxCoords, BoundingBoxType.WorldSpawn);
36     }
37
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);
42
43         int minX = spawnChunkX - midOffset;
44         int maxX = spawnChunkX + midOffset;
45         int minZ = spawnChunkZ - midOffset;
46         int maxZ = spawnChunkZ + midOffset;
47
48
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);
52     }
53
54     @Override
55     public boolean canProvide(DimensionId dimensionId) {
56         return dimensionId == DimensionId.OVERWORLD;
57     }
58
59     @Override
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);
65         }
66         if (BoundingBoxTypeHelper.shouldRender(BoundingBoxType.LazySpawnChunks)) {
67             if (lazyChunks != null) boundingBoxes.add(lazyChunks);
68         }
69         return boundingBoxes;
70     }
71 }