1 package com.irtimaled.bbor.client;
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 net.minecraft.client.Minecraft;
12 import net.minecraft.client.settings.KeyBinding;
13 import net.minecraft.entity.player.EntityPlayer;
14 import net.minecraft.network.NetworkManager;
15 import net.minecraft.util.math.BlockPos;
16 import net.minecraft.world.dimension.DimensionType;
18 import java.net.InetSocketAddress;
19 import java.net.SocketAddress;
21 import static com.irtimaled.bbor.client.Constants.CHUNK_SIZE;
23 public class ClientProxy extends CommonProxy {
24 public static final String KeyCategory = "Bounding Box Outline Reloaded";
25 public static KeyBinding ActiveHotKey = new KeyBinding("Toggle On/Off", 0x42, KeyCategory);
26 public static KeyBinding OuterBoxOnlyHotKey = new KeyBinding("Toggle Display Outer Box Only", 0x4f, KeyCategory);
28 private boolean active;
29 private boolean outerBoxOnly;
30 private ClientRenderer renderer;
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()));
43 renderer = new ClientRenderer(this::getCache);
46 private void render(float partialTicks) {
47 EntityPlayer entityPlayer = Minecraft.getInstance().player;
48 PlayerData.setPlayerPosition(partialTicks, entityPlayer);
51 renderer.render(DimensionType.getById(entityPlayer.dimension), outerBoxOnly);
55 private void keyPressed() {
56 if (ActiveHotKey.isPressed()) {
59 PlayerData.setActiveY();
60 } else if (OuterBoxOnlyHotKey.isPressed()) {
61 outerBoxOnly = !outerBoxOnly;
65 private void connectedToServer(NetworkManager networkManager) {
66 SocketAddress remoteAddress = networkManager.getRemoteAddress();
67 if (remoteAddress instanceof InetSocketAddress) {
68 InetSocketAddress socketAddress = (InetSocketAddress) remoteAddress;
69 NBTFileParser.loadLocalDatFiles(socketAddress.getHostName(), socketAddress.getPort(), this::setWorldData, this::getOrCreateCache);
73 private void disconnectedFromServer() {
75 if (ConfigManager.keepCacheBetweenSessions.getBoolean()) return;
76 VillageColorCache.clear();
81 protected void setWorldData(long seed, int spawnX, int spawnZ) {
82 super.setWorldData(seed, spawnX, spawnZ);
83 addSpawnChunkBoundingBoxes(spawnX, spawnZ);
86 private void addSpawnChunkBoundingBoxes(int spawnX, int spawnZ) {
87 BoundingBox worldSpawnBoundingBox = getWorldSpawnBoundingBox(spawnX, spawnZ);
88 BoundingBox spawnChunksBoundingBox = buildSpawnChunksBoundingBox(spawnX, spawnZ, 12, BoundingBoxType.SpawnChunks);
89 BoundingBox lazySpawnChunksBoundingBox = buildSpawnChunksBoundingBox(spawnX, spawnZ, 16, BoundingBoxType.LazySpawnChunks);
91 runOnCache(DimensionType.OVERWORLD, cache -> {
92 cache.addBoundingBox(worldSpawnBoundingBox);
93 cache.addBoundingBox(spawnChunksBoundingBox);
94 cache.addBoundingBox(lazySpawnChunksBoundingBox);
98 private BoundingBox getWorldSpawnBoundingBox(int spawnX, int spawnZ) {
99 BlockPos minBlockPos = new BlockPos(spawnX - 10, 0, spawnZ - 10);
100 BlockPos maxBlockPos = new BlockPos(spawnX + 10, 0, spawnZ + 10);
102 return BoundingBoxWorldSpawn.from(minBlockPos, maxBlockPos, BoundingBoxType.WorldSpawn);
105 private BoundingBox buildSpawnChunksBoundingBox(int spawnX, int spawnZ, int size, BoundingBoxType type) {
106 double midOffset = CHUNK_SIZE * (size / 2.0);
107 double midX = Math.round((float) (spawnX / (double) CHUNK_SIZE)) * (double) CHUNK_SIZE;
108 double midZ = Math.round((float) (spawnZ / (double) CHUNK_SIZE)) * (double) CHUNK_SIZE;
109 BlockPos minBlockPos = new BlockPos(midX - midOffset, 0, midZ - midOffset);
110 if (spawnX / (double) CHUNK_SIZE % 0.5D == 0.0D && spawnZ / (double) CHUNK_SIZE % 0.5D == 0.0D) {
111 midX += (double) CHUNK_SIZE;
112 midZ += (double) CHUNK_SIZE;
114 BlockPos maxBlockPos = new BlockPos(midX + midOffset, 0, midZ + midOffset);
115 return BoundingBoxWorldSpawn.from(minBlockPos, maxBlockPos, type);