]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/BiomeBorderProvider.java
Tidy up constructors on simple boxes
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / BiomeBorderProvider.java
1 package com.irtimaled.bbor.client.providers;
2
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.client.config.BoundingBoxTypeHelper;
5 import com.irtimaled.bbor.client.config.ConfigManager;
6 import com.irtimaled.bbor.client.interop.BiomeBorderHelper;
7 import com.irtimaled.bbor.client.models.BoundingBoxBiomeBorder;
8 import com.irtimaled.bbor.common.BoundingBoxType;
9 import com.irtimaled.bbor.common.MathHelper;
10 import com.irtimaled.bbor.common.models.Coords;
11 import com.irtimaled.bbor.common.models.DimensionId;
12
13 import java.util.HashMap;
14 import java.util.Map;
15
16 public class BiomeBorderProvider implements IBoundingBoxProvider<BoundingBoxBiomeBorder> {
17     private static Coords lastPlayerCoords = null;
18     private static Boolean lastRenderAllTransitions = null;
19     private static Integer lastRenderDistance = null;
20     private static Integer lastMaxY = null;
21     private static Map<Coords, BoundingBoxBiomeBorder> lastBorders = new HashMap<>();
22
23     @Override
24     public boolean canProvide(DimensionId dimensionId) {
25         return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.BiomeBorder);
26     }
27
28     @Override
29     public Iterable<BoundingBoxBiomeBorder> get(DimensionId dimensionId) {
30         Coords playerCoords = Player.getCoords();
31         Integer renderDistance = ConfigManager.biomeBordersRenderDistance.get();
32         Boolean renderAllTransitions = !ConfigManager.renderOnlyCurrentBiome.get();
33         Integer maxY = (int) Player.getMaxY(ConfigManager.biomeBordersMaxY.get());
34         if (!playerCoords.equals(lastPlayerCoords) ||
35                 !renderDistance.equals(lastRenderDistance) ||
36                 renderAllTransitions != lastRenderAllTransitions ||
37                 !maxY.equals(lastMaxY)) {
38             lastPlayerCoords = playerCoords;
39             lastRenderDistance = renderDistance;
40             lastRenderAllTransitions = renderAllTransitions;
41             lastMaxY = maxY;
42             lastBorders = getBiomeBorders();
43         }
44         return lastBorders.values();
45     }
46
47     public static void clear() {
48         lastBorders = new HashMap<>();
49         lastPlayerCoords = null;
50     }
51
52     private Map<Coords, BoundingBoxBiomeBorder> getBiomeBorders() {
53         int renderDistance = lastRenderDistance;
54         Coords playerCoords = lastPlayerCoords;
55         boolean renderAllTransitions = lastRenderAllTransitions;
56         int maxY = lastMaxY;
57
58         int width = MathHelper.floor(Math.pow(2, 3 + renderDistance));
59
60         int blockX = playerCoords.getX();
61         int minX = blockX - width;
62         int maxX = blockX + width;
63
64         int blockZ = playerCoords.getZ();
65         int minZ = blockZ - width;
66         int maxZ = blockZ + width;
67
68         int size = (width * 2) + 1;
69         int[][] biomeIds = new int[size][size];
70         for (int x = minX; x <= maxX; x++) {
71             int matchX = (x - minX);
72             for (int z = minZ; z <= maxZ; z++) {
73                 int matchZ = (z - minZ);
74                 biomeIds[matchX][matchZ] = BiomeBorderHelper.getBiomeId(x, maxY, z);
75             }
76         }
77
78         int playerBiomeId = BiomeBorderHelper.getBiomeId(playerCoords);
79
80         Map<Coords, BoundingBoxBiomeBorder> borders = new HashMap<>();
81         for (int matchX = 1; matchX < size - 2; matchX++) {
82             for (int matchZ = 1; matchZ < size - 2; matchZ++) {
83                 int x = matchX + minX;
84                 int z = matchZ + minZ;
85                 int biomeId = biomeIds[matchX][matchZ];
86                 if (renderAllTransitions || biomeId == playerBiomeId) {
87                     Coords coords = new Coords(x, maxY, z);
88                     if (lastBorders.containsKey(coords)) {
89                         borders.put(coords, lastBorders.get(coords));
90                     } else {
91                         boolean north = biomeIds[matchX][matchZ - 1] != biomeId;
92                         boolean east = biomeIds[matchX + 1][matchZ] != biomeId;
93                         boolean south = biomeIds[matchX][matchZ + 1] != biomeId;
94                         boolean west = biomeIds[matchX - 1][matchZ] != biomeId;
95                         if (north || east || south || west) {
96                             borders.put(coords, new BoundingBoxBiomeBorder(coords, north, east, south, west));
97                         }
98                     }
99                 }
100             }
101         }
102         return borders;
103     }
104 }