aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/utils')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java45
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java37
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java48
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java29
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java4
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java7
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java4
10 files changed, 153 insertions, 44 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java
index 9ea90c16..fd8ffdbd 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/FrustumUtils.java
@@ -1,6 +1,6 @@
package me.xmrvizzy.skyblocker.utils;
-import me.xmrvizzy.skyblocker.mixin.AccessorWorldRenderer;
+import me.xmrvizzy.skyblocker.mixin.accessor.WorldRendererAccessor;
import me.xmrvizzy.skyblocker.mixin.accessor.FrustumInvoker;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Frustum;
@@ -9,7 +9,7 @@ import net.minecraft.util.math.Box;
public class FrustumUtils {
public static Frustum getFrustum() {
- return ((AccessorWorldRenderer) MinecraftClient.getInstance().worldRenderer).getFrustum();
+ return ((WorldRendererAccessor) MinecraftClient.getInstance().worldRenderer).getFrustum();
}
public static boolean isBoxVisible(Box box) {
@@ -17,6 +17,6 @@ public class FrustumUtils {
}
public static boolean isVisible(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
- return ((FrustumInvoker) getFrustum()).isVisible(minX, minY, minZ, maxX, maxY, maxZ);
+ return ((FrustumInvoker) getFrustum()).invokeIsVisible(minX, minY, minZ, maxX, maxY, maxZ);
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
index 6fa93735..a1221549 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderHelper.java
@@ -2,22 +2,29 @@ package me.xmrvizzy.skyblocker.utils;
import me.x150.renderer.render.Renderer3d;
import me.xmrvizzy.skyblocker.mixin.accessor.BeaconBlockEntityRendererInvoker;
+import me.xmrvizzy.skyblocker.utils.culling.OcclusionCulling;
import me.xmrvizzy.skyblocker.utils.title.Title;
import me.xmrvizzy.skyblocker.utils.title.TitleContainer;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.block.entity.BeaconBlockEntityRenderer;
+import net.minecraft.client.render.BufferBuilder;
+import net.minecraft.client.render.Camera;
+import net.minecraft.client.render.Tessellator;
+import net.minecraft.client.render.VertexConsumerProvider;
+import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.sound.SoundEvent;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
-
import java.awt.*;
+import com.mojang.blaze3d.systems.RenderSystem;
+
public class RenderHelper {
private static final Vec3d ONE = new Vec3d(1, 1, 1);
+ private static final int MAX_OVERWORLD_BUILD_HEIGHT = 319;
public static void renderFilledThroughWallsWithBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
renderFilledThroughWalls(context, pos, colorComponents, alpha);
@@ -25,26 +32,40 @@ public class RenderHelper {
}
public static void renderFilledThroughWalls(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
- Renderer3d.renderThroughWalls();
- renderFilled(context, pos, colorComponents, alpha);
- Renderer3d.stopRenderThroughWalls();
+ if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) {
+ Renderer3d.renderThroughWalls();
+ renderFilled(context, pos, colorComponents, alpha);
+ Renderer3d.stopRenderThroughWalls();
+ }
}
public static void renderFilledIfVisible(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
- if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) {
+ if (OcclusionCulling.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1)) {
renderFilled(context, pos, colorComponents, alpha);
}
}
- public static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
+ private static void renderFilled(WorldRenderContext context, BlockPos pos, float[] colorComponents, float alpha) {
Renderer3d.renderFilled(context.matrixStack(), new Color(colorComponents[0], colorComponents[1], colorComponents[2], alpha), Vec3d.of(pos), ONE);
}
- public static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) {
- context.matrixStack().push();
- context.matrixStack().translate(pos.getX() - context.camera().getPos().x, pos.getY() - context.camera().getPos().y, pos.getZ() - context.camera().getPos().z);
- BeaconBlockEntityRendererInvoker.renderBeam(context.matrixStack(), context.consumers(), context.tickDelta(), context.world().getTime(), 0, BeaconBlockEntityRenderer.MAX_BEAM_HEIGHT, colorComponents);
- context.matrixStack().pop();
+ private static void renderBeaconBeam(WorldRenderContext context, BlockPos pos, float[] colorComponents) {
+ if (FrustumUtils.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, MAX_OVERWORLD_BUILD_HEIGHT, pos.getZ() + 1)) {
+ MatrixStack matrices = context.matrixStack();
+ Vec3d camera = context.camera().getPos();
+
+ matrices.push();
+ matrices.translate(pos.getX() - camera.x, pos.getY() - camera.y, pos.getZ() - camera.z);
+
+ Tessellator tessellator = RenderSystem.renderThreadTesselator();
+ BufferBuilder buffer = tessellator.getBuffer();
+ VertexConsumerProvider.Immediate consumer = VertexConsumerProvider.immediate(buffer);
+
+ BeaconBlockEntityRendererInvoker.renderBeam(matrices, consumer, context.tickDelta(), context.world().getTime(), 0, MAX_OVERWORLD_BUILD_HEIGHT, colorComponents);
+
+ consumer.draw();
+ matrices.pop();
+ }
}
public static void displayTitleAndPlaySound(int stayTicks, int fadeOutTicks, String titleKey, Formatting formatting) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java
index 73ad468f..61f79ae1 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/RenderUtils.java
@@ -82,7 +82,7 @@ public class RenderUtils {
e.getZ() - MathHelper.lerp(tickDelta, e.lastRenderZ, e.getZ()));
}
- public static Boolean pointExistsInArea(int x, int y, int x1, int y1, int x2, int y2) {
+ public static boolean pointExistsInArea(int x, int y, int x1, int y1, int x2, int y2) {
return x >= x1 && x <= x2 && y >= y1 && y <= y2;
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
index 7b19e284..fbe79ade 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Scheduler.java
@@ -1,5 +1,6 @@
package me.xmrvizzy.skyblocker.utils;
+import com.mojang.brigadier.Command;
import me.xmrvizzy.skyblocker.SkyblockerMod;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
@@ -58,17 +59,9 @@ public class Scheduler {
*
* @param screenSupplier the supplier of the screen to open
*/
- public void queueOpenScreen(Supplier<Screen> screenSupplier) {
- queueOpenScreen(screenSupplier.get());
- }
-
- /**
- * Schedules a screen to open in the next tick. Used in commands to avoid screen immediately closing after the command is executed.
- *
- * @param screen the supplier of the screen to open
- */
- public void queueOpenScreen(Screen screen) {
- MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screen));
+ public int queueOpenScreen(Supplier<Screen> screenSupplier) {
+ MinecraftClient.getInstance().send(() -> MinecraftClient.getInstance().setScreen(screenSupplier.get()));
+ return Command.SINGLE_SUCCESS;
}
public void tick() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
index 35dfd368..71e3b44f 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/Utils.java
@@ -29,6 +29,7 @@ import java.util.List;
*/
public class Utils {
private static final String PROFILE_PREFIX = "Profile: ";
+ private static boolean isOnHypixel = false;
private static boolean isOnSkyblock = false;
private static boolean isInDungeons = false;
private static boolean isInjected = false;
@@ -45,6 +46,10 @@ public class Utils {
private static boolean sentLocRaw = false;
private static long lastLocRaw = 0;
+ public static boolean isOnHypixel() {
+ return isOnHypixel;
+ }
+
public static boolean isOnSkyblock() {
return isOnSkyblock;
}
@@ -126,21 +131,35 @@ public class Utils {
String string = sidebar.toString();
if (sidebar.isEmpty()) return;
- if (sidebar.get(0).contains("SKYBLOCK") || sidebar.get(0).contains("SKIBLOCK")) {
- if (!isOnSkyblock) {
- if (!isInjected) {
- isInjected = true;
- ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
+ if (sidebar.get(sidebar.size() - 1).equals("www.hypixel.net")) {
+ if (!isOnHypixel) {
+ isOnHypixel = true;
+ }
+ if (sidebar.get(0).contains("SKYBLOCK") || sidebar.get(0).contains("SKIBLOCK")) {
+ if (!isOnSkyblock) {
+ if (!isInjected) {
+ isInjected = true;
+ ItemTooltipCallback.EVENT.register(PriceInfoTooltip::onInjectTooltip);
+ }
+ isOnSkyblock = true;
+ SkyblockEvents.JOIN.invoker().onSkyblockJoin();
}
- isOnSkyblock = true;
- SkyblockEvents.JOIN.invoker().onSkyblockJoin();
+ } else {
+ leaveSkyblock();
}
- } else if (isOnSkyblock) {
+ isInDungeons = isOnSkyblock && string.contains("The Catacombs");
+ } else if (isOnHypixel) {
+ isOnHypixel = false;
+ leaveSkyblock();
+ }
+ }
+
+ private static void leaveSkyblock() {
+ if (isOnSkyblock) {
isOnSkyblock = false;
isInDungeons = false;
SkyblockEvents.LEAVE.invoker().onSkyblockLeave();
}
- isInDungeons = isOnSkyblock && string.contains("The Catacombs");
}
public static String getLocation() {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java
new file mode 100644
index 00000000..e9a25fc3
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/OcclusionCulling.java
@@ -0,0 +1,48 @@
+package me.xmrvizzy.skyblocker.utils.culling;
+
+import com.logisticscraft.occlusionculling.OcclusionCullingInstance;
+import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache;
+import com.logisticscraft.occlusionculling.util.Vec3d;
+
+import me.xmrvizzy.skyblocker.utils.FrustumUtils;
+import net.minecraft.client.MinecraftClient;
+
+public class OcclusionCulling {
+ private static final int TRACING_DISTANCE = 128;
+ private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
+ private static OcclusionCullingInstance instance = null;
+
+ // Reused objects to reduce allocation overhead
+ private static Vec3d cameraPos = new Vec3d(0, 0, 0);
+ private static Vec3d min = new Vec3d(0, 0, 0);
+ private static Vec3d max = new Vec3d(0, 0, 0);
+
+ /**
+ * Initializes the occlusion culling instance
+ */
+ public static void init() {
+ instance = new OcclusionCullingInstance(TRACING_DISTANCE, new WorldProvider(), new ArrayOcclusionCache(TRACING_DISTANCE), 2);
+ }
+
+ private static void updateCameraPos() {
+ var camera = CLIENT.gameRenderer.getCamera().getPos();
+ cameraPos.set(camera.x, camera.y, camera.z);
+ }
+
+ /**
+ * This first checks checks if the bounding box is within the camera's FOV, if
+ * it is then it checks for whether it's occluded or not.
+ *
+ * @return A boolean representing whether the bounding box is fully visible or
+ * not.
+ */
+ public static boolean isVisible(double x1, double y1, double z1, double x2, double y2, double z2) {
+ if (!FrustumUtils.isVisible(x1, y1, z1, x2, y2, z2)) return false;
+
+ updateCameraPos();
+ min.set(x1, y1, z1);
+ max.set(x2, y2, z2);
+
+ return instance.isAABBVisible(min, max, cameraPos);
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java
new file mode 100644
index 00000000..47d92c1f
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/WorldProvider.java
@@ -0,0 +1,29 @@
+package me.xmrvizzy.skyblocker.utils.culling;
+
+import com.logisticscraft.occlusionculling.DataProvider;
+
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.world.ClientWorld;
+import net.minecraft.util.math.BlockPos;
+
+public class WorldProvider implements DataProvider {
+ private final static MinecraftClient CLIENT = MinecraftClient.getInstance();
+ private ClientWorld world = null;
+
+ @Override
+ public boolean prepareChunk(int chunkX, int chunkZ) {
+ this.world = CLIENT.world;
+ return this.world != null;
+ }
+
+ @Override
+ public boolean isOpaqueFullCube(int x, int y, int z) {
+ BlockPos pos = new BlockPos(x, y, z);
+ return this.world.getBlockState(pos).isOpaqueFullCube(this.world, pos);
+ }
+
+ @Override
+ public void cleanup() {
+ this.world = null;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java
new file mode 100644
index 00000000..c25e7f7a
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/culling/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Package dedicated to occlusion culling utilities
+ */
+package me.xmrvizzy.skyblocker.utils.culling; \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
index a4e445ee..7b92fff6 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainer.java
@@ -1,6 +1,5 @@
package me.xmrvizzy.skyblocker.utils.title;
-import com.mojang.brigadier.Command;
import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
@@ -9,7 +8,6 @@ import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
-import net.minecraft.text.Text;
import net.minecraft.util.math.MathHelper;
import java.util.LinkedHashSet;
@@ -31,10 +29,7 @@ public class TitleContainer {
ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(ClientCommandManager.literal("skyblocker")
.then(ClientCommandManager.literal("hud")
.then(ClientCommandManager.literal("titleContainer")
- .executes(context -> {
- SkyblockerMod.getInstance().scheduler.queueOpenScreen(new TitleContainerConfigScreen(Text.of("Title Container HUD Config")));
- return Command.SINGLE_SUCCESS;
- })))));
+ .executes(context -> SkyblockerMod.getInstance().scheduler.queueOpenScreen(TitleContainerConfigScreen::new))))));
}
/**
diff --git a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
index e729ea15..c0c4d63c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/utils/title/TitleContainerConfigScreen.java
@@ -21,8 +21,8 @@ public class TitleContainerConfigScreen extends Screen {
private float hudX = SkyblockerConfig.get().general.titleContainer.x;
private float hudY = SkyblockerConfig.get().general.titleContainer.y;
- protected TitleContainerConfigScreen(Text title) {
- super(title);
+ protected TitleContainerConfigScreen() {
+ super(Text.of("Title Container HUD Config"));
}
@Override