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