1 package com.irtimaled.bbor.client.providers;
3 import com.irtimaled.bbor.client.Player;
4 import com.irtimaled.bbor.client.interop.BiomeBorderHelper;
5 import com.irtimaled.bbor.common.BoundingBoxType;
6 import com.irtimaled.bbor.common.MathHelper;
7 import com.irtimaled.bbor.common.models.BoundingBoxBiomeBorder;
8 import com.irtimaled.bbor.common.models.Coords;
9 import com.irtimaled.bbor.config.ConfigManager;
11 import java.util.HashMap;
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 Map<Coords, BoundingBoxBiomeBorder> lastBorders = new HashMap<>();
20 public Iterable<BoundingBoxBiomeBorder> get(int dimensionId) {
21 if (!BoundingBoxType.BiomeBorder.shouldRender())
22 return Iterators.empty();
24 Coords playerCoords = Player.getCoords();
25 Integer renderDistance = ConfigManager.biomeBordersRenderDistance.get();
26 Boolean renderAllTransitions = !ConfigManager.renderOnlyCurrentBiome.get();
27 if (!playerCoords.equals(lastPlayerCoords) || !renderDistance.equals(lastRenderDistance) || renderAllTransitions != lastRenderAllTransitions) {
28 lastPlayerCoords = playerCoords;
29 lastRenderDistance = renderDistance;
30 lastRenderAllTransitions = renderAllTransitions;
31 lastBorders = getBiomeBorders();
33 return lastBorders.values();
36 public static void clear() {
37 lastBorders = new HashMap<>();
38 lastPlayerCoords = null;
41 private Map<Coords, BoundingBoxBiomeBorder> getBiomeBorders() {
42 Integer renderDistance = lastRenderDistance;
43 Coords playerCoords = lastPlayerCoords;
44 boolean renderAllTransitions = lastRenderAllTransitions;
46 int width = MathHelper.floor(Math.pow(2, 3 + renderDistance));
47 int blockX = playerCoords.getX();
48 int minX = blockX - width;
49 int maxX = blockX + width;
51 int blockY = playerCoords.getY();
53 int blockZ = playerCoords.getZ();
54 int minZ = blockZ - width;
55 int maxZ = blockZ + width;
57 int size = (width * 2) + 1;
58 int[][] biomeIds = new int[size][size];
59 for (int x = minX; x <= maxX; x++) {
60 int matchX = (x - minX);
61 for (int z = minZ; z <= maxZ; z++) {
62 int matchZ = (z - minZ);
63 biomeIds[matchX][matchZ] = BiomeBorderHelper.getBiomeId(x, blockY, z);
67 int playerBiomeId = BiomeBorderHelper.getBiomeId(playerCoords);
69 Map<Coords, BoundingBoxBiomeBorder> borders = new HashMap<>();
70 for (int matchX = 1; matchX < size - 2; matchX++) {
71 for (int matchZ = 1; matchZ < size - 2; matchZ++) {
72 int x = matchX + minX;
73 int z = matchZ + minZ;
74 int biomeId = biomeIds[matchX][matchZ];
75 if (renderAllTransitions || biomeId == playerBiomeId) {
76 Coords coords = new Coords(x, blockY, z);
77 if (lastBorders.containsKey(coords)) {
78 borders.put(coords, lastBorders.get(coords));
80 boolean north = biomeIds[matchX][matchZ - 1] != biomeId;
81 boolean east = biomeIds[matchX + 1][matchZ] != biomeId;
82 boolean south = biomeIds[matchX][matchZ + 1] != biomeId;
83 boolean west = biomeIds[matchX - 1][matchZ] != biomeId;
84 if (north || east || south || west) {
85 borders.put(coords, BoundingBoxBiomeBorder.from(coords, north, east, south, west));