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