aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java31
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java7
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java38
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/BasePlaceholderScreen.java20
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/JoinWorldPlaceholderScreen.java12
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/ReconfiguringPlaceholderScreen.java24
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCuller.java45
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCulling.java42
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/culling/ReducedWorldProvider.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/render/culling/WorldProvider.java2
13 files changed, 184 insertions, 72 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
index 7f1320c8..afe76598 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/ClientPlayNetworkHandlerMixin.java
@@ -13,6 +13,8 @@ import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
+import net.minecraft.util.Identifier;
+
import org.slf4j.Logger;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@@ -46,6 +48,16 @@ public abstract class ClientPlayNetworkHandlerMixin {
private boolean skyblocker$cancelTeamWarning(Logger instance, String format, Object... arg) {
return !Utils.isOnHypixel();
}
+
+ @WrapWithCondition(method = { "onScoreboardScoreUpdate", "onScoreboardScoreReset" }, at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+ private boolean skyblocker$cancelUnknownScoreboardObjectiveWarnings(Logger instance, String message, Object objectiveName) {
+ return !Utils.isOnHypixel();
+ }
+
+ @WrapWithCondition(method = "warnOnUnknownPayload", at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;warn(Ljava/lang/String;Ljava/lang/Object;)V", remap = false))
+ private boolean skyblocker$dropBadlionPacketWarnings(Logger instance, String message, Object identifier) {
+ return !(Utils.isOnHypixel() && ((Identifier) identifier).getNamespace().equals("badlion"));
+ }
@Inject(method = "onParticle", at = @At("RETURN"))
private void skyblocker$onParticle(ParticleS2CPacket packet) {
diff --git a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
index 29889c28..df0c058e 100644
--- a/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixin/MinecraftClientMixin.java
@@ -1,17 +1,30 @@
package de.hysky.skyblocker.mixin;
import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
+import de.hysky.skyblocker.utils.JoinWorldPlaceholderScreen;
+import de.hysky.skyblocker.utils.ReconfiguringPlaceholderScreen;
import de.hysky.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.screen.DownloadingTerrainScreen;
+import net.minecraft.client.gui.screen.ReconfiguringScreen;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.network.ClientPlayNetworkHandler;
import net.minecraft.client.network.ClientPlayerEntity;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import dev.cbyrne.betterinject.annotations.Inject;
+import org.spongepowered.asm.mixin.injection.ModifyArg;
+import org.spongepowered.asm.mixin.injection.ModifyVariable;
@Mixin(MinecraftClient.class)
public abstract class MinecraftClientMixin {
+
+ @Shadow
+ @Nullable
+ public abstract ClientPlayNetworkHandler getNetworkHandler();
+
@Shadow
@Nullable
public ClientPlayerEntity player;
@@ -22,4 +35,22 @@ public abstract class MinecraftClientMixin {
HotbarSlotLock.handleInputEvents(player);
}
}
+
+ //Remove Downloading Terrain Screen and Reconfiguring Screen
+ @ModifyVariable(at = @At("HEAD"), method = "setScreen", ordinal = 0, argsOnly = true)
+ public Screen modifySetScreen(Screen screen) {
+ if (Utils.isOnSkyblock()) {
+ if (screen instanceof DownloadingTerrainScreen) {
+ return null;
+ } else if (screen instanceof ReconfiguringScreen && this.getNetworkHandler() != null) {
+ return new ReconfiguringPlaceholderScreen(this.getNetworkHandler().getConnection());
+ }
+ }
+ return screen;
+ }
+
+ @ModifyArg(method = "joinWorld", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;reset(Lnet/minecraft/client/gui/screen/Screen;)V"), index = 0)
+ private Screen modifyJoinWorld(Screen screen) {
+ return Utils.isOnSkyblock() ? new JoinWorldPlaceholderScreen() : screen;
+ }
} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
index 5e0995e6..fa9f6e4f 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java
@@ -19,7 +19,7 @@ public class MobGlow {
public static boolean shouldMobGlow(Entity entity) {
Box box = entity.getBoundingBox();
- if (!entity.isInvisible() && OcclusionCulling.isVisible(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ)) {
+ if (!entity.isInvisible() && OcclusionCulling.getReducedCuller().isVisible(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ)) {
String name = entity.getName().getString();
// Dungeons
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
index adc23bbb..9d92f505 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/ItemTooltip.java
@@ -11,6 +11,7 @@ import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.item.TooltipContext;
+import net.minecraft.item.DyeableItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtElement;
@@ -183,10 +184,8 @@ public class ItemTooltip {
}
if (TooltipInfoType.COLOR.isTooltipEnabledAndHasOrNullWarning(internalID) && stack.getNbt() != null) {
- final NbtElement color = stack.getNbt().getCompound("display").get("color");
-
- if (color != null) {
- String colorHex = String.format("%06X", Integer.parseInt(color.asString()));
+ if (stack.getItem() instanceof DyeableItem item && item.hasColor(stack)) {
+ String colorHex = String.format("%06X", item.getColor(stack));
String expectedHex = ExoticTooltip.getExpectedHex(internalID);
boolean correctLine = false;
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java
index e08b4acf..59e00845 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/FireSaleWidget.java
@@ -1,13 +1,9 @@
package de.hysky.skyblocker.skyblock.tabhud.widget;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import de.hysky.skyblocker.skyblock.tabhud.util.Colors;
import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
import de.hysky.skyblocker.skyblock.tabhud.util.PlayerListMgr;
+import de.hysky.skyblocker.skyblock.tabhud.widget.component.IcoTextComponent;
import de.hysky.skyblocker.skyblock.tabhud.widget.component.PlainTextComponent;
-import de.hysky.skyblocker.skyblock.tabhud.widget.component.ProgressComponent;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
@@ -17,47 +13,25 @@ import net.minecraft.util.Formatting;
public class FireSaleWidget extends Widget {
- private static final MutableText TITLE = Text.literal("Fire Sale").formatted(Formatting.DARK_AQUA,
+ private static final MutableText TITLE = Text.literal("Fire Sales").formatted(Formatting.DARK_AQUA,
Formatting.BOLD);
- // matches a fire sale item
- // group 1: item name
- // group 2: # items available
- // group 3: # items available in total (1 digit + "k")
- private static final Pattern FIRE_PATTERN = Pattern.compile("(?<item>.*): (?<avail>\\d*)/(?<total>[0-9.]*)k");
-
public FireSaleWidget() {
super(TITLE, Formatting.DARK_AQUA.getColorValue());
}
@Override
public void updateContent() {
- String event = PlayerListMgr.strAt(46);
+ Text event = PlayerListMgr.textAt(46);
if (event == null) {
- this.addComponent(new PlainTextComponent(Text.literal("No Fire Sale!").formatted(Formatting.GRAY)));
+ this.addComponent(new PlainTextComponent(Text.literal("No Fire Sales!").formatted(Formatting.GRAY)));
return;
}
- if (event.contains("Starts In")) {
- this.addSimpleIcoText(Ico.CLOCK, "Starts in:", Formatting.DARK_AQUA, 46);
+ if (event.getString().contains("starting in")) {
+ this.addComponent(new IcoTextComponent(Ico.CLOCK, event));
return;
}
-
- for (int i = 46;; i++) {
- Matcher m = PlayerListMgr.regexAt( i, FIRE_PATTERN);
- if (m == null) {
- break;
- }
- String avail = m.group("avail");
- Text itemTxt = Text.literal(m.group("item"));
- float total = Float.parseFloat(m.group("total")) * 1000;
- Text prgressTxt = Text.literal(String.format("%s/%.0f", avail, total));
- float pcnt = (Float.parseFloat(avail) / (total)) * 100f;
- ProgressComponent pc = new ProgressComponent(Ico.GOLD, itemTxt, prgressTxt, pcnt, Colors.pcntToCol(pcnt));
- this.addComponent(pc);
- }
-
}
-
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/BasePlaceholderScreen.java b/src/main/java/de/hysky/skyblocker/utils/BasePlaceholderScreen.java
new file mode 100644
index 00000000..25c88318
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/BasePlaceholderScreen.java
@@ -0,0 +1,20 @@
+package de.hysky.skyblocker.utils;
+
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.text.Text;
+
+public abstract class BasePlaceholderScreen extends Screen {
+
+ public BasePlaceholderScreen(Text title) {
+ super(title);
+ }
+
+ @Override
+ public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ }
+
+ @Override
+ public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) {
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/JoinWorldPlaceholderScreen.java b/src/main/java/de/hysky/skyblocker/utils/JoinWorldPlaceholderScreen.java
new file mode 100644
index 00000000..a809314e
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/JoinWorldPlaceholderScreen.java
@@ -0,0 +1,12 @@
+package de.hysky.skyblocker.utils;
+
+import net.minecraft.text.Text;
+
+public final class JoinWorldPlaceholderScreen extends BasePlaceholderScreen {
+
+ private static final String SCREEN_TITLE = "Joining World Screen";
+
+ public JoinWorldPlaceholderScreen() {
+ super(Text.literal(SCREEN_TITLE));
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/ReconfiguringPlaceholderScreen.java b/src/main/java/de/hysky/skyblocker/utils/ReconfiguringPlaceholderScreen.java
new file mode 100644
index 00000000..c2333bb8
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/ReconfiguringPlaceholderScreen.java
@@ -0,0 +1,24 @@
+package de.hysky.skyblocker.utils;
+
+import net.minecraft.network.ClientConnection;
+import net.minecraft.text.Text;
+
+public final class ReconfiguringPlaceholderScreen extends BasePlaceholderScreen {
+ private static final String SCREEN_TITLE = "Reconfig Screen";
+
+ private final ClientConnection connection;
+
+ public ReconfiguringPlaceholderScreen(final ClientConnection connection) {
+ super(Text.literal(SCREEN_TITLE));
+ this.connection = connection;
+ }
+
+ @Override
+ public void tick() {
+ if (this.connection.isOpen()) {
+ this.connection.tick();
+ } else {
+ this.connection.handleDisconnection();
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
index 0f73df16..7526c0a8 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/RenderHelper.java
@@ -60,7 +60,7 @@ public class RenderHelper {
renderFilled(context, Vec3d.of(pos), dimensions, colorComponents, alpha, true);
}
} else {
- if (OcclusionCulling.isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + dimensions.x, pos.getY() + dimensions.y, pos.getZ() + dimensions.z)) {
+ if (OcclusionCulling.getRegularCuller().isVisible(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + dimensions.x, pos.getY() + dimensions.y, pos.getZ() + dimensions.z)) {
renderFilled(context, Vec3d.of(pos), dimensions, colorComponents, alpha, false);
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCuller.java b/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCuller.java
new file mode 100644
index 00000000..3c48a47e
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCuller.java
@@ -0,0 +1,45 @@
+package de.hysky.skyblocker.utils.render.culling;
+
+import com.logisticscraft.occlusionculling.OcclusionCullingInstance;
+import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache;
+import com.logisticscraft.occlusionculling.util.Vec3d;
+
+import de.hysky.skyblocker.utils.render.FrustumUtils;
+import net.minecraft.client.MinecraftClient;
+
+public class OcclusionCuller {
+ private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
+
+ private final OcclusionCullingInstance instance;
+
+ // Reused objects to reduce allocation overhead
+ private final Vec3d cameraPos = new Vec3d(0, 0, 0);
+ private final Vec3d min = new Vec3d(0, 0, 0);
+ private final Vec3d max = new Vec3d(0, 0, 0);
+
+ OcclusionCuller(int tracingDistance, WorldProvider worldProvider, double aabbExpansion) {
+ this.instance = new OcclusionCullingInstance(tracingDistance, worldProvider, new ArrayOcclusionCache(tracingDistance), aabbExpansion);
+ }
+
+ private 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 as per the instance's settings.
+ */
+ public 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/de/hysky/skyblocker/utils/render/culling/OcclusionCulling.java b/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCulling.java
index 5f8d1592..b1ff10dd 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCulling.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/culling/OcclusionCulling.java
@@ -1,47 +1,23 @@
package de.hysky.skyblocker.utils.render.culling;
-import com.logisticscraft.occlusionculling.OcclusionCullingInstance;
-import com.logisticscraft.occlusionculling.cache.ArrayOcclusionCache;
-import com.logisticscraft.occlusionculling.util.Vec3d;
-import de.hysky.skyblocker.utils.render.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 final Vec3d cameraPos = new Vec3d(0, 0, 0);
- private static final Vec3d min = new Vec3d(0, 0, 0);
- private static final Vec3d max = new Vec3d(0, 0, 0);
+ private static OcclusionCuller regularCuller = null;
+ private static OcclusionCuller reducedCuller = null;
/**
- * Initializes the occlusion culling instance
+ * Initializes the occlusion culling instances
*/
public static void init() {
- instance = new OcclusionCullingInstance(TRACING_DISTANCE, new WorldProvider(), new ArrayOcclusionCache(TRACING_DISTANCE), 2);
+ regularCuller = new OcclusionCuller(TRACING_DISTANCE, new WorldProvider(), 2);
+ reducedCuller = new OcclusionCuller(TRACING_DISTANCE, new ReducedWorldProvider(), 0);
}
- private static void updateCameraPos() {
- var camera = CLIENT.gameRenderer.getCamera().getPos();
- cameraPos.set(camera.x, camera.y, camera.z);
+ public static OcclusionCuller getRegularCuller() {
+ return regularCuller;
}
- /**
- * 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);
+ public static OcclusionCuller getReducedCuller() {
+ return reducedCuller;
}
}
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/culling/ReducedWorldProvider.java b/src/main/java/de/hysky/skyblocker/utils/render/culling/ReducedWorldProvider.java
new file mode 100644
index 00000000..5a2b9d87
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/utils/render/culling/ReducedWorldProvider.java
@@ -0,0 +1,19 @@
+package de.hysky.skyblocker.utils.render.culling;
+
+import net.minecraft.block.BlockState;
+import net.minecraft.registry.tag.BlockTags;
+import net.minecraft.util.math.BlockPos;
+
+public class ReducedWorldProvider extends WorldProvider {
+
+ @Override
+ public boolean isOpaqueFullCube(int x, int y, int z) {
+ BlockPos pos = new BlockPos(x, y, z);
+ BlockState state = this.world.getBlockState(pos);
+
+ //Fixes edge cases where stairs etc aren't treated as being full blocks for the use case
+ boolean isException = state.isIn(BlockTags.STAIRS) || state.isIn(BlockTags.WALLS) || state.isIn(BlockTags.FENCES);
+
+ return isException || this.world.getBlockState(pos).isOpaqueFullCube(this.world, pos);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/render/culling/WorldProvider.java b/src/main/java/de/hysky/skyblocker/utils/render/culling/WorldProvider.java
index 7ee0f0ed..1d2db238 100644
--- a/src/main/java/de/hysky/skyblocker/utils/render/culling/WorldProvider.java
+++ b/src/main/java/de/hysky/skyblocker/utils/render/culling/WorldProvider.java
@@ -7,7 +7,7 @@ import net.minecraft.util.math.BlockPos;
public class WorldProvider implements DataProvider {
private final static MinecraftClient CLIENT = MinecraftClient.getInstance();
- private ClientWorld world = null;
+ protected ClientWorld world = null;
@Override
public boolean prepareChunk(int chunkX, int chunkZ) {