diff options
Diffstat (limited to 'src/main')
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) { |