diff --git a/README.md b/README.md index 5d9ffec..3a03045 100644 --- a/README.md +++ b/README.md @@ -20,15 +20,15 @@ Required Dependencies: Note: A release might target both these, and an older MC version. In addition, older releases can support older MC versions. For example, if you want to use 1.21.11; use the v1.4.0 release; as v1.5.0 is only for MC 26.1.2. -- Minecraft 26.1.2 or later. +- Minecraft 26.2 or later. - Fabric Loader 0.19.5 or later. -- Fabric API 0.155.3 or later. -- Cloth Config API 26.1.154 or later. +- Fabric API 0.160.0 or later. +- Cloth Config API 26.2.155 or later. - Hypixel Mod API 1.0.2 or later. Optional Dependencies: -- Mod Menu 18.0.0 or later. +- Mod Menu 20.0.1 or later. # Quality of Life diff --git a/gradle.properties b/gradle.properties index e460f3a..5da215c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,6 +17,6 @@ org.gradle.configureondemand=true fabric.loom.dropNonIntermediateRootMethods=true # Mod Properties -mod_version=1.6.0+26.1.2 +mod_version=1.6.0+26.2 maven_group=gg.darkutils archives_base_name=darkutils diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bac17c2..f49d766 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,11 +1,11 @@ [versions] loom = "1.17.20" java = "25" -minecraft = "26.1.2" +minecraft = "26.2" fabric-loader = "0.19.5" -fabric-api = "0.155.3+26.1.2" -cloth-config = "26.1.154" -mod-menu = "18.0.0" +fabric-api = "0.160.0+26.2" +cloth-config = "26.2.155" +mod-menu = "20.0.1" hypixel-mod-api = "1.0.2" hypixel-mod-api-mr = "1.0.2+build.1+mc26.1" junit = "6.1.3" diff --git a/src/main/java/gg/darkutils/DarkUtils.java b/src/main/java/gg/darkutils/DarkUtils.java index 8295952..bf3b2ad 100644 --- a/src/main/java/gg/darkutils/DarkUtils.java +++ b/src/main/java/gg/darkutils/DarkUtils.java @@ -258,7 +258,7 @@ public static final void debug(@NotNull final Supplier message) { public static final void toast(@NotNull final Component title, @NotNull final Component message) { final var mc = Minecraft.getInstance(); - mc.getToastManager().addToast(SystemToast.multiline(mc, SystemToast.SystemToastId.PERIODIC_NOTIFICATION, title, message)); + mc.gui.toastManager().addToast(new SystemToast(SystemToast.SystemToastId.PERIODIC_NOTIFICATION, title, message)); } public static final void user(@NotNull final String message, @NotNull final DarkUtils.UserMessageLevel level) { @@ -565,7 +565,7 @@ private static final void registerCommandWithAliases(@NotNull final String comma private static final void openConfig() { final var mc = Minecraft.getInstance(); - mc.schedule(() -> mc.setScreen(DarkUtilsConfigScreen.create(null))); + mc.schedule(() -> mc.gui.setScreen(DarkUtilsConfigScreen.create(null))); } public static final @NotNull String getVersion() { diff --git a/src/main/java/gg/darkutils/feat/dungeons/AlignmentTaskSolver.java b/src/main/java/gg/darkutils/feat/dungeons/AlignmentTaskSolver.java index d810307..b864836 100644 --- a/src/main/java/gg/darkutils/feat/dungeons/AlignmentTaskSolver.java +++ b/src/main/java/gg/darkutils/feat/dungeons/AlignmentTaskSolver.java @@ -22,9 +22,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.DyeColor; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.AABB; import org.jetbrains.annotations.NotNull; @@ -49,6 +51,9 @@ public final class AlignmentTaskSolver { private static final @NotNull List<@NotNull Direction> directions = AlignmentTaskSolver.getDirections(); + private static final @NotNull Item RED_WOOL = Items.WOOL.pick(DyeColor.RED); + private static final @NotNull Item LIME_WOOL = Items.WOOL.pick(DyeColor.LIME); + static { box = AlignmentTaskSolver.generateSortedBox(); boxSet = Set.copyOf(AlignmentTaskSolver.box); @@ -226,13 +231,13 @@ private static final ObjectArrayList collectRelevantItemFrames() { return frames; } - for (final var frame : world.getEntities(EntityType.ITEM_FRAME, AlignmentTaskSolver.boxAABB, ignored -> true)) { + for (final var frame : world.getEntities(EntityTypes.ITEM_FRAME, AlignmentTaskSolver.boxAABB, ignored -> true)) { if (!AlignmentTaskSolver.boxSet.contains(frame.blockPosition())) { continue; } final var held = frame.getItem(); - if (held.is(Items.ARROW) || held.is(Items.RED_WOOL) || held.is(Items.LIME_WOOL)) { + if (held.is(Items.ARROW) || held.is(AlignmentTaskSolver.RED_WOOL) || held.is(AlignmentTaskSolver.LIME_WOOL)) { frames.add(frame); } } @@ -282,10 +287,10 @@ private static final void computeDirections() { if (held.is(Items.ARROW)) { return AlignmentTaskSolver.SpaceType.PATH; } - if (held.is(Items.RED_WOOL)) { + if (held.is(AlignmentTaskSolver.RED_WOOL)) { return AlignmentTaskSolver.SpaceType.END; } - return held.is(Items.LIME_WOOL) ? AlignmentTaskSolver.SpaceType.STARTER : AlignmentTaskSolver.SpaceType.EMPTY; + return held.is(AlignmentTaskSolver.LIME_WOOL) ? AlignmentTaskSolver.SpaceType.STARTER : AlignmentTaskSolver.SpaceType.EMPTY; } return AlignmentTaskSolver.SpaceType.EMPTY; } @@ -302,7 +307,7 @@ private static final void computeTurns() { continue; } ItemFrame frame = null; - for (final var frameEntity : world.getEntities(EntityType.ITEM_FRAME, frameBox, ignored -> true)) { + for (final var frameEntity : world.getEntities(EntityTypes.ITEM_FRAME, frameBox, ignored -> true)) { if (framePos.equals(frameEntity.blockPosition())) { frame = frameEntity; break; @@ -360,7 +365,7 @@ private static final void showNametagAtFrame(final @NotNull BlockPos pos, final } ItemFrame entity = null; - for (final var frame : world.getEntities(EntityType.ITEM_FRAME, box, ignored -> true)) { + for (final var frame : world.getEntities(EntityTypes.ITEM_FRAME, box, ignored -> true)) { if (pos.equals(frame.blockPosition())) { entity = frame; break; diff --git a/src/main/java/gg/darkutils/feat/dungeons/DungeonTimer.java b/src/main/java/gg/darkutils/feat/dungeons/DungeonTimer.java index a29aebc..4f22938 100644 --- a/src/main/java/gg/darkutils/feat/dungeons/DungeonTimer.java +++ b/src/main/java/gg/darkutils/feat/dungeons/DungeonTimer.java @@ -22,6 +22,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.DyeColor; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,6 +125,8 @@ public final class DungeonTimer { Map.entry("[BOSS] Wither King: Incredible. You did what I couldn't do myself.", DungeonTimer.PHASE_5_FINISH), Map.entry("[BOSS] Wither King: Thank you for coming all the way here.", DungeonTimer.PHASE_5_FINISH) ); + @NotNull + private static final Item BROWN_TERRACOTTA = Items.DYED_TERRACOTTA.pick(DyeColor.BROWN); private DungeonTimer() { super(); @@ -467,7 +470,7 @@ private static final void updateLines() { // Floor 6 if (6 == floor.floor) { - DungeonTimer.line(DungeonTimer.DungeonPhase.BOSS_ENTRY, DungeonTimer.DungeonPhase.TERRAS_CLEAR, "Terracottas", ChatFormatting.GOLD, Items.BROWN_TERRACOTTA); + DungeonTimer.line(DungeonTimer.DungeonPhase.BOSS_ENTRY, DungeonTimer.DungeonPhase.TERRAS_CLEAR, "Terracottas", ChatFormatting.GOLD, DungeonTimer.BROWN_TERRACOTTA); DungeonTimer.line(DungeonTimer.DungeonPhase.TERRAS_CLEAR, DungeonTimer.DungeonPhase.GIANTS_CLEAR, "Giants", ChatFormatting.AQUA, Items.DIAMOND_SWORD); } diff --git a/src/main/java/gg/darkutils/feat/dungeons/ReplaceDiorite.java b/src/main/java/gg/darkutils/feat/dungeons/ReplaceDiorite.java index 91436dc..4e43b62 100644 --- a/src/main/java/gg/darkutils/feat/dungeons/ReplaceDiorite.java +++ b/src/main/java/gg/darkutils/feat/dungeons/ReplaceDiorite.java @@ -44,26 +44,7 @@ private static final BlockState[] getGlassStates() { final var glassStates = new BlockState[16]; for (final var color : DyeColor.values()) { - final var state = (switch (color) { - case WHITE -> Blocks.WHITE_STAINED_GLASS; - case ORANGE -> Blocks.ORANGE_STAINED_GLASS; - case MAGENTA -> Blocks.MAGENTA_STAINED_GLASS; - case LIGHT_BLUE -> Blocks.LIGHT_BLUE_STAINED_GLASS; - case YELLOW -> Blocks.YELLOW_STAINED_GLASS; - case LIME -> Blocks.LIME_STAINED_GLASS; - case PINK -> Blocks.PINK_STAINED_GLASS; - case GRAY -> Blocks.GRAY_STAINED_GLASS; - case LIGHT_GRAY -> Blocks.LIGHT_GRAY_STAINED_GLASS; - case CYAN -> Blocks.CYAN_STAINED_GLASS; - case PURPLE -> Blocks.PURPLE_STAINED_GLASS; - case BLUE -> Blocks.BLUE_STAINED_GLASS; - case BROWN -> Blocks.BROWN_STAINED_GLASS; - case GREEN -> Blocks.GREEN_STAINED_GLASS; - case RED -> Blocks.RED_STAINED_GLASS; - case BLACK -> Blocks.BLACK_STAINED_GLASS; - }).defaultBlockState(); - - glassStates[color.ordinal()] = state; + glassStates[color.ordinal()] = Blocks.STAINED_GLASS.pick(color).defaultBlockState(); } return glassStates; diff --git a/src/main/java/gg/darkutils/feat/farming/EnforceZorrosCape.java b/src/main/java/gg/darkutils/feat/farming/EnforceZorrosCape.java index ef15bde..ab1f105 100644 --- a/src/main/java/gg/darkutils/feat/farming/EnforceZorrosCape.java +++ b/src/main/java/gg/darkutils/feat/farming/EnforceZorrosCape.java @@ -41,7 +41,7 @@ private static final void onTick() { // No config check, still need to track Zorro's cape equip status in case user enables/disables the feature to not desync the state from the real state. final AbstractContainerMenu screenHandler; - if (!(Minecraft.getInstance().screen instanceof final ContainerScreen container) || MenuType.GENERIC_9x6 != (screenHandler = container.getMenu()).menuType || !"Your Equipment and Stats".equals(ChatUtils.removeControlCodes(container.getTitle().getString()))) { + if (!(Minecraft.getInstance().gui.screen() instanceof final ContainerScreen container) || MenuType.GENERIC_9x6 != (screenHandler = container.getMenu()).menuType || !"Your Equipment and Stats".equals(ChatUtils.removeControlCodes(container.getTitle().getString()))) { return; } diff --git a/src/main/java/gg/darkutils/feat/foraging/TreeGiftConfirmation.java b/src/main/java/gg/darkutils/feat/foraging/TreeGiftConfirmation.java index 2a7f967..f0caf91 100644 --- a/src/main/java/gg/darkutils/feat/foraging/TreeGiftConfirmation.java +++ b/src/main/java/gg/darkutils/feat/foraging/TreeGiftConfirmation.java @@ -35,7 +35,7 @@ private static final void onTreeGift(@NotNull final ObtainTreeGiftEvent event) { client.player.playSound(SoundEvents.NOTE_BLOCK_PLING.value(), 1.0F, 1.0F); // Show title/subtitle - client.gui.setTitle(Component.nullToEmpty("§2Tree Gift!")); + client.gui.hud.setTitle(Component.nullToEmpty("§2Tree Gift!")); var subtitle = "§7You received the rewards!"; final var mobSpawned = event.treeMobSpawned(); @@ -48,8 +48,8 @@ private static final void onTreeGift(@NotNull final ObtainTreeGiftEvent event) { subtitle = "§7A §d" + prettyName + " §7has spawned!"; } - client.gui.setSubtitle(Component.nullToEmpty(subtitle)); - client.gui.setTimes(10, 70, 20); + client.gui.hud.setSubtitle(Component.nullToEmpty(subtitle)); + client.gui.hud.setTimes(10, 70, 20); } } } diff --git a/src/main/java/gg/darkutils/feat/mining/WillOWispDisplay.java b/src/main/java/gg/darkutils/feat/mining/WillOWispDisplay.java index da6944c..07635ee 100644 --- a/src/main/java/gg/darkutils/feat/mining/WillOWispDisplay.java +++ b/src/main/java/gg/darkutils/feat/mining/WillOWispDisplay.java @@ -11,7 +11,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.resources.Identifier; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.item.Items; import org.jetbrains.annotations.NotNull; @@ -60,7 +60,7 @@ private static final void update() { } } else { // 30 block range - for (final var stand : world.getEntities(EntityType.ARMOR_STAND, player.getBoundingBox().inflate(30.0D), ignored -> true)) { + for (final var stand : world.getEntities(EntityTypes.ARMOR_STAND, player.getBoundingBox().inflate(30.0D), ignored -> true)) { WillOWispDisplay.processPossibleWillOWispTag(stand); } } diff --git a/src/main/java/gg/darkutils/feat/qol/AutoFishingRod.java b/src/main/java/gg/darkutils/feat/qol/AutoFishingRod.java index 7004e2b..6527b52 100644 --- a/src/main/java/gg/darkutils/feat/qol/AutoFishingRod.java +++ b/src/main/java/gg/darkutils/feat/qol/AutoFishingRod.java @@ -200,7 +200,7 @@ private static final void useRod(@NotNull final Runnable continuation, final boo : min; TickUtils.queueTickTask(() -> { - if (!mc.player.isUsingItem() && !mc.options.keyAttack.isDown() && !mc.options.keyUse.isDown() && (DarkUtilsConfig.INSTANCE.autoFishingWorkThroughMenus || null == mc.screen)) { + if (!mc.player.isUsingItem() && !mc.options.keyAttack.isDown() && !mc.options.keyUse.isDown() && (DarkUtilsConfig.INSTANCE.autoFishingWorkThroughMenus || null == mc.gui.screen())) { mc.startUseItem(); continuation.run(); diff --git a/src/main/java/gg/darkutils/feat/qol/LaggyServerDetector.java b/src/main/java/gg/darkutils/feat/qol/LaggyServerDetector.java index e33c404..0bc0421 100644 --- a/src/main/java/gg/darkutils/feat/qol/LaggyServerDetector.java +++ b/src/main/java/gg/darkutils/feat/qol/LaggyServerDetector.java @@ -76,8 +76,8 @@ private static final void onTPSUpdate(final int tps) { final var tpsStatus = LaggyServerDetector.getTpsStatus(tpsAverageOver30Seconds); final var client = Minecraft.getInstance(); - client.gui.setTitle(Component.nullToEmpty("§d30s TPS AVG: " + tpsStatus.color() + tpsAverageOver30SecondsFormatted + tpsStatus.comment())); - client.gui.setTimes(10, 70, 20); + client.gui.hud.setTitle(Component.nullToEmpty("§d30s TPS AVG: " + tpsStatus.color() + tpsAverageOver30SecondsFormatted + tpsStatus.comment())); + client.gui.hud.setTimes(10, 70, 20); } } diff --git a/src/main/java/gg/darkutils/feat/qol/VanillaMode.java b/src/main/java/gg/darkutils/feat/qol/VanillaMode.java index 8b3351f..4dd96b8 100644 --- a/src/main/java/gg/darkutils/feat/qol/VanillaMode.java +++ b/src/main/java/gg/darkutils/feat/qol/VanillaMode.java @@ -91,7 +91,7 @@ private static final void onConfigScreenOpen(@NotNull final ConfigScreenOpenEven } private static final boolean isNoScreenOpen() { - return null == Minecraft.getInstance().screen; + return null == Minecraft.getInstance().gui.screen(); } private static final void onJoinSingleplayer() { diff --git a/src/main/java/gg/darkutils/mixin/misc/ClientPacketListenerMixin.java b/src/main/java/gg/darkutils/mixin/misc/ClientPacketListenerMixin.java index 86abc93..07218c4 100644 --- a/src/main/java/gg/darkutils/mixin/misc/ClientPacketListenerMixin.java +++ b/src/main/java/gg/darkutils/mixin/misc/ClientPacketListenerMixin.java @@ -64,7 +64,7 @@ private final void openCommandSendConfirmationWindow(@NotNull final String comma private final void darkutils$openConfirmCommandScreen$disableIfEnabled(@NotNull final ClientPacketListener handler, @NotNull final String command, @NotNull final String message, @NotNull final Screen afterActionScreen) { if (DarkUtilsConfig.INSTANCE.disableCommandConfirmation && message.contains("parse_errors")) { handler.send(new ServerboundChatCommandPacket(command)); - Minecraft.getInstance().setScreen(afterActionScreen); + Minecraft.getInstance().gui.setScreen(afterActionScreen); } else { this.openCommandSendConfirmationWindow(command, message, afterActionScreen); } diff --git a/src/main/java/gg/darkutils/mixin/misc/GameRendererMixin.java b/src/main/java/gg/darkutils/mixin/misc/GameRendererMixin.java index 95a2894..4456508 100644 --- a/src/main/java/gg/darkutils/mixin/misc/GameRendererMixin.java +++ b/src/main/java/gg/darkutils/mixin/misc/GameRendererMixin.java @@ -20,7 +20,7 @@ private GameRendererMixin() { throw new UnsupportedOperationException("mixin class"); } - @Inject(method = "getNightVisionScale", at = @At("HEAD"), cancellable = true) + @Inject(method = "nightVisionScale", at = @At("HEAD"), cancellable = true) private static final void darkutils$overrideNightVisionIfEnabled(@NotNull final LivingEntity entity, final float tickProgress, @NotNull final CallbackInfoReturnable cir) { if (DarkUtilsConfig.INSTANCE.nightVision) { cir.setReturnValue(0.9F); diff --git a/src/main/java/gg/darkutils/mixin/misc/GlBackendMixin.java b/src/main/java/gg/darkutils/mixin/misc/GlBackendMixin.java index fb39cd6..deabf2d 100644 --- a/src/main/java/gg/darkutils/mixin/misc/GlBackendMixin.java +++ b/src/main/java/gg/darkutils/mixin/misc/GlBackendMixin.java @@ -25,10 +25,10 @@ private GlBackendMixin() { GLFW.glfwWindowHint(hint, GLFW.GLFW_CONTEXT_VERSION_MAJOR == hint ? OpenGLVersionOverride.getGLMajorVersion(value) : GLFW.GLFW_CONTEXT_VERSION_MINOR == hint ? OpenGLVersionOverride.getGLMinorVersion(value) : value); } - @ModifyArgs(method = "createDevice(JLcom/mojang/blaze3d/shaders/ShaderSource;Lcom/mojang/blaze3d/shaders/GpuDebugOptions;)Lcom/mojang/blaze3d/systems/GpuDevice;", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlDevice;(JLcom/mojang/blaze3d/shaders/ShaderSource;Lcom/mojang/blaze3d/shaders/GpuDebugOptions;)V")) + @ModifyArgs(method = "createDevice(JLcom/mojang/blaze3d/shaders/ShaderSource;Lcom/mojang/blaze3d/shaders/GpuDebugOptions;Ljava/lang/Runnable;)Lcom/mojang/blaze3d/systems/GpuDevice;", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlDevice;(JLcom/mojang/blaze3d/shaders/ShaderSource;Lcom/mojang/blaze3d/shaders/GpuDebugOptions;)V")) private static final void darkutils$disableGlDebugIfEnabled(@NotNull final Args args) { if (DarkUtilsConfig.INSTANCE.disableGlDebug) { - args.set(2, new GpuDebugOptions(0, false, false)); + args.set(2, new GpuDebugOptions(0, false, false, false)); } } } diff --git a/src/main/java/gg/darkutils/mixin/misc/MinecraftMixin.java b/src/main/java/gg/darkutils/mixin/misc/MinecraftMixin.java index d3cb899..6ee5753 100644 --- a/src/main/java/gg/darkutils/mixin/misc/MinecraftMixin.java +++ b/src/main/java/gg/darkutils/mixin/misc/MinecraftMixin.java @@ -76,7 +76,7 @@ private MinecraftMixin() { } } - @Inject(method = "destroy", at = @At("HEAD")) + @Inject(method = "exitWorldAndClose", at = @At("HEAD")) private final void darkutils$onQuitGame(@NotNull final CallbackInfo ci) { PersistentData.saveAtomicIfDirtyThreadSafeBlocking(); } diff --git a/src/main/java/gg/darkutils/mixin/misc/WindowMixin.java b/src/main/java/gg/darkutils/mixin/misc/WindowMixin.java index ca8096f..c838097 100644 --- a/src/main/java/gg/darkutils/mixin/misc/WindowMixin.java +++ b/src/main/java/gg/darkutils/mixin/misc/WindowMixin.java @@ -2,10 +2,12 @@ import com.mojang.blaze3d.platform.IconSet; import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.systems.GpuBackend; import gg.darkutils.DarkUtils; import gg.darkutils.config.DarkUtilsConfig; import gg.darkutils.feat.bugfixes.WaylandGameIconFix; import gg.darkutils.feat.performance.OpenGLVersionOverride; +import gg.darkutils.feat.bugfixes.WaylandGameIconFix; import net.minecraft.client.Minecraft; import net.minecraft.server.packs.PackResources; import org.jetbrains.annotations.NotNull; @@ -17,6 +19,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.io.IOException; @@ -68,6 +71,22 @@ private WindowMixin() { Minecraft.getInstance().resizeGui(); } + @Inject(method = "createGlfwWindow", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/GpuBackend;setWindowHints()V", shift = At.Shift.AFTER)) + private static final void darkutils$afterDefaultWindowHints$fixGameIconOnWaylandIfEnabled(final int width, final int height, @NotNull final String title, final long monitor, @NotNull final GpuBackend backend, @NotNull final CallbackInfoReturnable cir) { + if (DarkUtilsConfig.INSTANCE.preferWayland && DarkUtilsConfig.INSTANCE.fixGameIconOnWayland && DarkUtils.shouldPreferWayland() && DarkUtils.isWindowPlatformWayland()) { + try { + WaylandGameIconFix.generateDesktopFile(); + } catch (final IOException ioe) { + WaylandGameIconFix.desktopFileFailure = true; + DarkUtils.error("@fileName@", "Error generating desktop file to filesystem for use with wayland icon fix, fall backing to vanilla logic", ioe); + + return; + } + + GLFW.glfwWindowHintString(GLFW.GLFW_WAYLAND_APP_ID, WaylandGameIconFix.WAYLAND_APP_ID); + } + } + @Inject(method = "setIcon", at = @At("HEAD"), cancellable = true) private final void darkutils$onSetGameIcon$fixGameIconOnWaylandIfEnabled(@NotNull final PackResources packResources, @NotNull final IconSet iconSet, @NotNull final CallbackInfo ci) { if (DarkUtilsConfig.INSTANCE.preferWayland && DarkUtilsConfig.INSTANCE.fixGameIconOnWayland && DarkUtils.shouldPreferWayland() && DarkUtils.isWindowPlatformWayland() && !WaylandGameIconFix.desktopFileFailure) { diff --git a/src/main/java/gg/darkutils/mixin/performance/GLXMixin.java b/src/main/java/gg/darkutils/mixin/performance/GLXMixin.java index d8856cd..fde7543 100644 --- a/src/main/java/gg/darkutils/mixin/performance/GLXMixin.java +++ b/src/main/java/gg/darkutils/mixin/performance/GLXMixin.java @@ -3,14 +3,12 @@ import com.mojang.blaze3d.platform.GLX; import gg.darkutils.DarkUtils; import gg.darkutils.config.DarkUtilsConfig; -import gg.darkutils.feat.bugfixes.WaylandGameIconFix; import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.function.LongSupplier; @@ -36,21 +34,5 @@ private GLXMixin() { GLFW.glfwInitHint(hint, value); } - - @Inject(method = "_initGlfw", at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwDefaultWindowHints()V", shift = At.Shift.AFTER)) - private static final void darkutils$afterDefaultWindowHints$fixGameIconOnWaylandIfEnabled(@NotNull final CallbackInfoReturnable ci) { - if (DarkUtilsConfig.INSTANCE.preferWayland && DarkUtilsConfig.INSTANCE.fixGameIconOnWayland && DarkUtils.shouldPreferWayland() && DarkUtils.isWindowPlatformWayland()) { - try { - WaylandGameIconFix.generateDesktopFile(); - } catch (final IOException ioe) { - WaylandGameIconFix.desktopFileFailure = true; - DarkUtils.error("@fileName@", "Error generating desktop file to filesystem for use with wayland icon fix, fall backing to vanilla logic", ioe); - - return; - } - - GLFW.glfwWindowHintString(GLFW.GLFW_WAYLAND_APP_ID, WaylandGameIconFix.WAYLAND_APP_ID); - } - } } diff --git a/src/main/java/gg/darkutils/mixin/visuals/FlameFeatureRendererMixin.java b/src/main/java/gg/darkutils/mixin/visuals/FlameFeatureRendererMixin.java index 07a60e3..d283bad 100644 --- a/src/main/java/gg/darkutils/mixin/visuals/FlameFeatureRendererMixin.java +++ b/src/main/java/gg/darkutils/mixin/visuals/FlameFeatureRendererMixin.java @@ -1,17 +1,14 @@ package gg.darkutils.mixin.visuals; -import com.mojang.blaze3d.vertex.PoseStack; import gg.darkutils.config.DarkUtilsConfig; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.client.renderer.feature.FeatureFrameContext; import net.minecraft.client.renderer.feature.FlameFeatureRenderer; -import net.minecraft.client.resources.model.sprite.AtlasManager; import org.jetbrains.annotations.NotNull; -import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.List; @Mixin(FlameFeatureRenderer.class) final class FlameFeatureRendererMixin { @@ -21,8 +18,8 @@ private FlameFeatureRendererMixin() { throw new UnsupportedOperationException("mixin class"); } - @Inject(method = "renderFlame(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/client/renderer/entity/state/EntityRenderState;Lorg/joml/Quaternionf;Lnet/minecraft/client/resources/model/sprite/AtlasManager;)V", at = @At("HEAD"), cancellable = true) - private final void darkutils$skipRenderFireOnEntitiesIfEnabled(@NotNull final PoseStack.Pose matricesEntry, @NotNull final MultiBufferSource vertexConsumers, @NotNull final EntityRenderState renderState, @NotNull final Quaternionf rotation, @NotNull final AtlasManager atlasManager, @NotNull final CallbackInfo ci) { + @Inject(method = "buildGroup", at = @At("HEAD"), cancellable = true) + private final void darkutils$skipRenderFireOnEntitiesIfEnabled(@NotNull final FeatureFrameContext context, @NotNull final List submits, @NotNull final CallbackInfo ci) { if (DarkUtilsConfig.INSTANCE.noBurningEntities) { ci.cancel(); } diff --git a/src/main/java/gg/darkutils/mixin/visuals/HeartTypeMixin.java b/src/main/java/gg/darkutils/mixin/visuals/HeartTypeMixin.java index 97581d1..7cdd968 100644 --- a/src/main/java/gg/darkutils/mixin/visuals/HeartTypeMixin.java +++ b/src/main/java/gg/darkutils/mixin/visuals/HeartTypeMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -@Mixin(targets = "net.minecraft.client.gui.Gui$HeartType") +@Mixin(targets = "net.minecraft.client.gui.Hud$HeartType") final class HeartTypeMixin { private HeartTypeMixin() { super(); @@ -19,7 +19,7 @@ private HeartTypeMixin() { } /** - * Redirects the hasStatusEffect call inside HeartType.fromPlayerState. + * Redirects the hasStatusEffect call inside HeartType.forPlayer. * Returns false when the effect being checked is WITHER and the config option is enabled, otherwise * passes the original call through unchanged. */ diff --git a/src/main/java/gg/darkutils/mixin/visuals/GuiMixin.java b/src/main/java/gg/darkutils/mixin/visuals/HudMixin.java similarity index 96% rename from src/main/java/gg/darkutils/mixin/visuals/GuiMixin.java rename to src/main/java/gg/darkutils/mixin/visuals/HudMixin.java index 29c3ffa..3be876c 100644 --- a/src/main/java/gg/darkutils/mixin/visuals/GuiMixin.java +++ b/src/main/java/gg/darkutils/mixin/visuals/HudMixin.java @@ -6,7 +6,7 @@ import gg.darkutils.utils.LocationUtils; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.Hud; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.NotNull; @@ -16,9 +16,9 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(Gui.class) -final class GuiMixin { - private GuiMixin() { +@Mixin(Hud.class) +final class HudMixin { + private HudMixin() { super(); throw new UnsupportedOperationException("mixin class"); diff --git a/src/main/java/gg/darkutils/mixin/visuals/ScreenEffectRendererMixin.java b/src/main/java/gg/darkutils/mixin/visuals/ScreenEffectRendererMixin.java index 369c371..1a68c80 100644 --- a/src/main/java/gg/darkutils/mixin/visuals/ScreenEffectRendererMixin.java +++ b/src/main/java/gg/darkutils/mixin/visuals/ScreenEffectRendererMixin.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import gg.darkutils.config.DarkUtilsConfig; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.ScreenEffectRenderer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import org.jetbrains.annotations.NotNull; @@ -19,8 +19,8 @@ private ScreenEffectRendererMixin() { throw new UnsupportedOperationException("mixin class"); } - @Inject(method = "renderFire", at = @At("HEAD"), cancellable = true) - private static final void darkutils$skipRenderingFireOverlayIfEnabled(@NotNull final PoseStack matrices, @NotNull final MultiBufferSource vertexConsumers, @NotNull final TextureAtlasSprite sprite, @NotNull final CallbackInfo ci) { + @Inject(method = "submitFire", at = @At("HEAD"), cancellable = true) + private static final void darkutils$skipRenderingFireOverlayIfEnabled(@NotNull final PoseStack matrices, @NotNull final SubmitNodeCollector vertexConsumers, @NotNull final TextureAtlasSprite sprite, @NotNull final CallbackInfo ci) { if (DarkUtilsConfig.INSTANCE.hideFireOverlay) { ci.cancel(); } diff --git a/src/main/java/gg/darkutils/utils/Helpers.java b/src/main/java/gg/darkutils/utils/Helpers.java index ce568e0..9aae59f 100644 --- a/src/main/java/gg/darkutils/utils/Helpers.java +++ b/src/main/java/gg/darkutils/utils/Helpers.java @@ -330,8 +330,8 @@ public static final void notify(@NotNull final SoundEvent sound, @NotNull final final var client = Minecraft.getInstance(); Helpers.playSound(sound, 1.0F, 1.0F); - client.gui.setTitle(Component.nullToEmpty(text)); - client.gui.setTimes(0, ticks, 0); + client.gui.hud.setTitle(Component.nullToEmpty(text)); + client.gui.hud.setTimes(0, ticks, 0); } public static final void notifyForServerTicks(@NotNull final SoundEvent sound, @NotNull final String text, final int serverTicks) { @@ -343,10 +343,10 @@ private static final void notifyForServerTicks(@NotNull final SoundEvent sound, final var client = Minecraft.getInstance(); Helpers.playSound(sound, 1.0F, 1.0F); - client.gui.setTitle(Component.nullToEmpty(text)); + client.gui.hud.setTitle(Component.nullToEmpty(text)); // Hacky way to simulate server tick dismissal of the title - client.gui.setTimes(0, Integer.MAX_VALUE, 0); + client.gui.hud.setTimes(0, Integer.MAX_VALUE, 0); TickUtils.queueServerTickTask(() -> { Helpers.clearTitle(); afterDismissHook.run(); @@ -354,7 +354,7 @@ private static final void notifyForServerTicks(@NotNull final SoundEvent sound, } private static final void clearTitle() { - Minecraft.getInstance().gui.clearTitles(); + Minecraft.getInstance().gui.hud.clearTitles(); } private static final void playSound(@NotNull final SoundEvent sound, final float volume, final float pitch) { diff --git a/src/main/java/gg/darkutils/utils/LocationUtils.java b/src/main/java/gg/darkutils/utils/LocationUtils.java index 2123f17..45aeb5e 100644 --- a/src/main/java/gg/darkutils/utils/LocationUtils.java +++ b/src/main/java/gg/darkutils/utils/LocationUtils.java @@ -73,7 +73,7 @@ public static final boolean isInHypixel() { } public static final boolean isInSingleplayer() { - return Minecraft.getInstance().isSingleplayer(); + return null != Minecraft.getInstance().getSingleplayerServer(); } private enum SkyblockIsland { diff --git a/src/main/java/gg/darkutils/utils/TabListUtil.java b/src/main/java/gg/darkutils/utils/TabListUtil.java index 6b4ce60..c8bd7cb 100644 --- a/src/main/java/gg/darkutils/utils/TabListUtil.java +++ b/src/main/java/gg/darkutils/utils/TabListUtil.java @@ -22,7 +22,7 @@ private TabListUtil() { public static final @NotNull Iterator tabListLinesIterator() { final var mc = Minecraft.getInstance(); - return null == mc.player || null == mc.level ? Collections.emptyIterator() : new TabListUtil.TabListIterator(mc.gui.getTabList()); + return null == mc.player || null == mc.level ? Collections.emptyIterator() : new TabListUtil.TabListIterator(mc.gui.hud.getTabList()); } public static final @NotNull Iterable tabListLines() { diff --git a/src/main/java/gg/darkutils/utils/chat/ChatUtils.java b/src/main/java/gg/darkutils/utils/chat/ChatUtils.java index ab87ac2..4f4785b 100644 --- a/src/main/java/gg/darkutils/utils/chat/ChatUtils.java +++ b/src/main/java/gg/darkutils/utils/chat/ChatUtils.java @@ -90,7 +90,7 @@ public static final void addToSendMessageQueue(@NotNull final String message) { public static final void sendMessageToLocalPlayer(@NotNull final Component text) { // Ensure player is available and no lost messages // The awaitLocalPlayer method ensures correct threading behavior internally. - TickUtils.awaitLocalPlayer(player -> Minecraft.getInstance().gui.getChat().addClientSystemMessage(text)); + TickUtils.awaitLocalPlayer(player -> Minecraft.getInstance().gui.hud.getChat().addClientSystemMessage(text)); } public static final boolean hasFormatting(@NotNull final Component text, @NotNull final SimpleColor color) { diff --git a/src/main/java/gg/darkutils/utils/chat/SimpleColor.java b/src/main/java/gg/darkutils/utils/chat/SimpleColor.java index c915822..4711700 100644 --- a/src/main/java/gg/darkutils/utils/chat/SimpleColor.java +++ b/src/main/java/gg/darkutils/utils/chat/SimpleColor.java @@ -1,6 +1,7 @@ package gg.darkutils.utils.chat; import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.TextColor; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -29,7 +30,7 @@ public enum SimpleColor { private SimpleColor(@NotNull final ChatFormatting formatting) { this.formatting = Objects.requireNonNull(formatting, "SimpleColor formatting value"); - this.rgb = Objects.requireNonNull(this.formatting.getColor(), "SimpleColor formatting color value"); + this.rgb = Objects.requireNonNull(TextColor.fromLegacyFormat(this.formatting).getValue(), "SimpleColor formatting color value"); } @NotNull diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0572724..0f9ac83 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -32,10 +32,10 @@ "accessWidener": "darkutils.classtweaker", "depends": { "fabricloader": ">=0.19.5", - "minecraft": ">=26.1.2", + "minecraft": ">=26.2", "java": ">=25", - "fabric-api": ">=0.155.3+26.1.2", - "cloth-config": ">=26.1.154", + "fabric-api": ">=0.160.0+26.2", + "cloth-config": ">=26.2.155", "hypixel-mod-api": ">=1.0.2" }, "suggests": {