]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/blob - src/main/java/com/irtimaled/bbor/client/ClientProxy.java
Expose active to be toggled externally
[BoundingBoxOutlineReloaded.git] / src / main / java / com / irtimaled / bbor / client / ClientProxy.java
1 package com.irtimaled.bbor.client;
2
3 import com.irtimaled.bbor.client.events.*;
4 import com.irtimaled.bbor.common.BoundingBoxType;
5 import com.irtimaled.bbor.common.CommonProxy;
6 import com.irtimaled.bbor.common.EventBus;
7 import com.irtimaled.bbor.common.VillageColorCache;
8 import com.irtimaled.bbor.common.models.BoundingBox;
9 import com.irtimaled.bbor.common.models.BoundingBoxWorldSpawn;
10 import com.irtimaled.bbor.config.ConfigManager;
11 import com.irtimaled.bbor.config.Setting;
12 import net.minecraft.client.Minecraft;
13 import net.minecraft.client.settings.KeyBinding;
14 import net.minecraft.entity.player.EntityPlayer;
15 import net.minecraft.network.NetworkManager;
16 import net.minecraft.util.math.BlockPos;
17 import net.minecraft.world.dimension.DimensionType;
18
19 import java.net.InetSocketAddress;
20 import java.net.SocketAddress;
21
22 import static com.irtimaled.bbor.client.Constants.CHUNK_SIZE;
23
24 public class ClientProxy extends CommonProxy {
25     public static final String KeyCategory = "Bounding Box Outline Reloaded";
26     public static KeyBinding ActiveHotKey = new KeyBinding("Toggle On/Off", 0x42, KeyCategory);
27     public static KeyBinding OuterBoxOnlyHotKey = new KeyBinding("Toggle Display Outer Box Only", 0x4f, KeyCategory);
28     public static boolean active;
29
30     private ClientRenderer renderer;
31
32     @Override
33     public void init() {
34         super.init();
35         EventBus.subscribe(Render.class, e -> render(e.getPartialTicks()));
36         EventBus.subscribe(KeyPressed.class, e -> keyPressed());
37         EventBus.subscribe(ConnectedToRemoteServer.class, e -> connectedToServer(e.getNetworkManager()));
38         EventBus.subscribe(DisconnectedFromRemoteServer.class, e -> disconnectedFromServer());
39         EventBus.subscribe(InitializeClientReceived.class, e -> setWorldData(e.getSeed(), e.getSpawnX(), e.getSpawnZ()));
40         EventBus.subscribe(AddBoundingBoxReceived.class, e -> runOnCache(e.getDimensionType(), cache -> cache.addBoundingBoxes(e.getKey(), e.getBoundingBoxes())));
41         EventBus.subscribe(RemoveBoundingBoxReceived.class, e -> removeBoundingBox(e.getDimensionType(), e.getKey()));
42
43         renderer = new ClientRenderer(this::getCache);
44     }
45
46     private void render(float partialTicks) {
47         EntityPlayer entityPlayer = Minecraft.getInstance().player;
48         PlayerData.setPlayerPosition(partialTicks, entityPlayer);
49
50         if (active) {
51             renderer.render(DimensionType.getById(entityPlayer.dimension), ConfigManager.outerBoxesOnly.get());
52         }
53     }
54
55     public static void toggleActive() {
56         active = !active;
57         if (active)
58             PlayerData.setActiveY();
59     }
60
61     private void keyPressed() {
62         if (ActiveHotKey.isPressed()) {
63             toggleActive();
64         } else if (OuterBoxOnlyHotKey.isPressed()) {
65             Setting<Boolean> outerBoxesOnly = ConfigManager.outerBoxesOnly;
66             outerBoxesOnly.set(!outerBoxesOnly.get());
67         }
68     }
69
70     private void connectedToServer(NetworkManager networkManager) {
71         SocketAddress remoteAddress = networkManager.getRemoteAddress();
72         if (remoteAddress instanceof InetSocketAddress) {
73             InetSocketAddress socketAddress = (InetSocketAddress) remoteAddress;
74             NBTFileParser.loadLocalDatFiles(socketAddress.getHostName(), socketAddress.getPort(), this::setWorldData, this::getOrCreateCache);
75         }
76     }
77
78     private void disconnectedFromServer() {
79         active = false;
80         if (ConfigManager.keepCacheBetweenSessions.get()) return;
81         VillageColorCache.clear();
82         clearCaches();
83     }
84
85     @Override
86     protected void setWorldData(long seed, int spawnX, int spawnZ) {
87         super.setWorldData(seed, spawnX, spawnZ);
88         addSpawnChunkBoundingBoxes(spawnX, spawnZ);
89     }
90
91     private void addSpawnChunkBoundingBoxes(int spawnX, int spawnZ) {
92         BoundingBox worldSpawnBoundingBox = getWorldSpawnBoundingBox(spawnX, spawnZ);
93         BoundingBox spawnChunksBoundingBox = buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks);
94         BoundingBox lazySpawnChunksBoundingBox = buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks);
95
96         runOnCache(DimensionType.OVERWORLD, cache -> {
97             cache.addBoundingBox(worldSpawnBoundingBox);
98             cache.addBoundingBox(spawnChunksBoundingBox);
99             cache.addBoundingBox(lazySpawnChunksBoundingBox);
100         });
101     }
102
103     private BoundingBox getWorldSpawnBoundingBox(int spawnX, int spawnZ) {
104         BlockPos minBlockPos = new BlockPos(spawnX - 10, 0, spawnZ - 10);
105         BlockPos maxBlockPos = new BlockPos(spawnX + 10, 0, spawnZ + 10);
106
107         return BoundingBoxWorldSpawn.from(minBlockPos, maxBlockPos, BoundingBoxType.WorldSpawn);
108     }
109
110     private BoundingBox buildSpawnChunksBoundingBox(int spawnX, int spawnZ, int size, BoundingBoxType type) {
111         double midOffset = CHUNK_SIZE * (size / 2.0);
112         double midX = Math.round((float) (spawnX / (double) CHUNK_SIZE)) * (double) CHUNK_SIZE;
113         double midZ = Math.round((float) (spawnZ / (double) CHUNK_SIZE)) * (double) CHUNK_SIZE;
114         BlockPos minBlockPos = new BlockPos(midX - midOffset, 0, midZ - midOffset);
115         if (spawnX / (double) CHUNK_SIZE % 0.5D == 0.0D && spawnZ / (double) CHUNK_SIZE % 0.5D == 0.0D) {
116             midX += (double) CHUNK_SIZE;
117             midZ += (double) CHUNK_SIZE;
118         }
119         BlockPos maxBlockPos = new BlockPos(midX + midOffset, 0, midZ + midOffset);
120         return BoundingBoxWorldSpawn.from(minBlockPos, maxBlockPos, type);
121     }
122 }