]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/providers/FlowerForestProvider.java
e704d8d0be92db8b4ffc68ce70cebbffa8ca2683
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / providers / FlowerForestProvider.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.interop.FlowerForestHelper;
8 import com.irtimaled.bbor.client.models.BoundingBoxFlowerForest;
9 import com.irtimaled.bbor.common.BoundingBoxType;
10 import com.irtimaled.bbor.common.MathHelper;
11 import com.irtimaled.bbor.common.models.Coords;
12 import com.irtimaled.bbor.common.models.DimensionId;
13 import net.minecraft.util.registry.Registry;
14 import net.minecraft.world.biome.Biomes;
15
16 import java.util.HashMap;
17 import java.util.Map;
18
19 public class FlowerForestProvider implements IBoundingBoxProvider<BoundingBoxFlowerForest>, ICachingProvider {
20     public static final int FLOWER_FOREST_BIOME_ID = Registry.BIOME.getRawId(Biomes.FLOWER_FOREST);
21     private static Coords lastPlayerCoords = null;
22     private static Integer lastRenderDistance = null;
23     private static Map<Coords, BoundingBoxFlowerForest> lastBoundingBoxes = new HashMap<>();
24
25     @Override
26     public boolean canProvide(DimensionId dimensionId) {
27         return BoundingBoxTypeHelper.shouldRender(BoundingBoxType.FlowerForest);
28     }
29
30     @Override
31     public Iterable<BoundingBoxFlowerForest> get(DimensionId dimensionId) {
32         Coords playerCoords = Player.getCoords();
33         Integer renderDistance = ConfigManager.flowerForestsRenderDistance.get();
34         if (!playerCoords.equals(lastPlayerCoords) || !renderDistance.equals(lastRenderDistance)) {
35             lastPlayerCoords = playerCoords;
36             lastRenderDistance = renderDistance;
37             lastBoundingBoxes = getBoundingBoxes();
38         }
39         return lastBoundingBoxes.values();
40     }
41
42     public void clearCache() {
43         lastBoundingBoxes = new HashMap<>();
44         lastPlayerCoords = null;
45     }
46
47     private Map<Coords, BoundingBoxFlowerForest> getBoundingBoxes() {
48         int renderDistance = lastRenderDistance;
49         Coords playerCoords = lastPlayerCoords;
50
51         int width = MathHelper.floor(Math.pow(2, 2 + renderDistance));
52
53         int blockX = playerCoords.getX();
54         int minX = blockX - width;
55         int maxX = blockX + width;
56
57         int blockZ = playerCoords.getZ();
58         int minZ = blockZ - width;
59         int maxZ = blockZ + width;
60
61         Map<Coords, BoundingBoxFlowerForest> boundingBoxes = new HashMap<>();
62         for (int x = minX; x <= maxX; x++) {
63             for (int z = minZ; z <= maxZ; z++) {
64                 int biomeId = BiomeBorderHelper.getBiomeId(x, 255, z);
65                 if (biomeId == FLOWER_FOREST_BIOME_ID) {
66                     int y = getMaxYForPos(x, playerCoords.getY() + 1, z);
67                     if (y == 0) {
68                         continue;
69                     }
70                     Coords coords = new Coords(x, y + 1, z);
71                     BoundingBoxFlowerForest boundingBox = lastBoundingBoxes.containsKey(coords)
72                             ? lastBoundingBoxes.get(coords)
73                             : new BoundingBoxFlowerForest(coords, FlowerForestHelper.getFlowerColorAtPos(coords));
74                     boundingBoxes.put(coords, boundingBox);
75                 }
76             }
77         }
78         return boundingBoxes;
79     }
80
81     private static int getMaxYForPos(int x, int y, int z) {
82         while (y > 0) {
83             if (FlowerForestHelper.canGrowFlower(x, y, z)) return y;
84             y--;
85         }
86         return 0;
87     }
88 }