From 390c1277391f948d5fc4f3113b3e9dec22d1617d Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Thu, 31 Jul 2025 00:58:08 -0400 Subject: 1.21.6-1.21.8 (#1518) * 1.21.6-pre2 * Port HUD and 1.21.6-pre3 * 1.21.6 * New Rendering System Also updates YACL and fixes a bug with rendering slot highlights * Fix Item Rarity Background having a random iteration order With Java's immutable maps they will either iterate forwards or backwards which is randomly decided at runtime. * Fix GUI text not rendering If the colour parameter supplied does not have an alpha value or is 0 then the text is not rendered. * Fix crimson fog extension * Fix health bar rendering * Fix hiding world loading screens * Disable mixin unit test due to crash and add audit command * 1.21.7 + Update Gradle, Loom, and JGit * Update Dandelion for 1.21.7 MoulConfig still has a few bugs but its ok otherwise * Fix checkstyle & spotless * Update Mixin Name Maybe this will fix the game test crashing because of GL errors? * Fix waypoint screen draw order * Fix issues with text not rendering in GUIs * Use local state management for renderer * Significantly improve batching for the renderer Makes the new renderer even better/faster than the old RenderLayer system! * Separate Skyblocker's glow from vanilla's glow Fixes #1478 Fixes #1500 * 1.21.8 * Fix dungeon teammates not glowing through walls * Fix some map decorations not rendering (dungeon teammate markers) * Fix recipe book search field text being invisible * Update README and issue templates * Fix issues with entity glow depth sampling Should also fix a crash with Iris * Add batching exclusion system Fixes a bug where rendering multiple cylinders at once would have the two linked to eachother * Fix spotless errors * Fix Iris crash * Update Dandelion/MoulConfig * Update to Fabric Loader 0.17.0 Fixes the Mixin Unit Test crashing * Attempt to fix game test * Disable game test rendering stuff --- .../java/de/hysky/skyblocker/SkyblockerScreen.java | 4 +- .../de/hysky/skyblocker/UpdateNotifications.java | 2 +- .../skyblocker/compatibility/MixinPlugin.java | 2 +- .../rei/recipe/SkyblockRecipeCategory.java | 11 +- .../hysky/skyblocker/config/HudConfigScreen.java | 4 +- .../skyblocker/config/configs/DungeonsConfig.java | 4 +- .../powdertracker/PowderFilterConfigScreen.java | 3 +- src/main/java/de/hysky/skyblocker/debug/Debug.java | 24 +- .../de/hysky/skyblocker/debug/SnapshotDebug.java | 8 +- .../skyblocker/mixins/BackgroundRendererMixin.java | 43 --- .../hysky/skyblocker/mixins/BossBarHudMixin.java | 4 +- .../mixins/DownloadingTerrainScreenMixin.java | 2 +- .../hysky/skyblocker/mixins/FogRendererMixin.java | 29 ++ .../hysky/skyblocker/mixins/GameRendererMixin.java | 10 + .../skyblocker/mixins/GlCommandEncoderMixin.java | 30 ++ .../skyblocker/mixins/GlResourceManagerMixin.java | 25 -- .../hysky/skyblocker/mixins/GuiRendererMixin.java | 70 +++++ .../skyblocker/mixins/HandledScreenMixin.java | 12 +- .../de/hysky/skyblocker/mixins/InGameHudMixin.java | 29 +- .../skyblocker/mixins/InventoryScreenMixin.java | 10 +- .../hysky/skyblocker/mixins/MapRendererMixin.java | 16 +- .../skyblocker/mixins/RenderPipelineMixin.java | 4 +- .../skyblocker/mixins/WorldRendererMixin.java | 33 +- .../mixins/accessors/BufferManagerInvoker.java | 15 + .../mixins/accessors/DrawContextInvoker.java | 20 -- .../OutlineVertexConsumerProviderAccessor.java | 16 + .../mixins/accessors/TextRendererAccessor.java | 19 ++ .../de/hysky/skyblocker/skyblock/ChestValue.java | 5 +- .../de/hysky/skyblocker/skyblock/HealthBars.java | 3 +- .../skyblock/auction/AuctionBrowserScreen.java | 41 +-- .../skyblock/auction/AuctionViewScreen.java | 17 +- .../auction/widgets/CategoryTabWidget.java | 2 - .../skyblock/auction/widgets/RarityWidget.java | 35 ++- .../skyblock/auction/widgets/SliderWidget.java | 14 +- .../chat/ChatRuleLocationConfigScreen.java | 5 +- .../skyblocker/skyblock/dungeon/DungeonMap.java | 39 +-- .../skyblock/dungeon/DungeonMapConfigScreen.java | 10 +- .../skyblock/dungeon/DungeonScoreHUD.java | 17 +- .../skyblock/dungeon/FireFreezeStaffTimer.java | 9 +- .../skyblocker/skyblock/dungeon/LeapOverlay.java | 42 +-- .../dungeon/partyfinder/OptionDropdownWidget.java | 22 +- .../skyblock/dungeon/partyfinder/PartyEntry.java | 28 +- .../dungeon/partyfinder/PartyFinderScreen.java | 8 +- .../dungeon/partyfinder/RangedValueWidget.java | 9 - .../skyblock/dwarven/CrystalsHudWidget.java | 30 +- .../skyblock/dwarven/GlaciteColdOverlay.java | 10 +- .../profittrackers/PowderMiningTracker.java | 13 +- .../profittrackers/corpse/CorpseProfitScreen.java | 3 +- .../skyblocker/skyblock/events/EventToast.java | 4 +- .../skyblock/events/JacobEventToast.java | 17 +- .../skyblock/fancybars/EditBarWidget.java | 21 +- .../skyblocker/skyblock/fancybars/StatusBar.java | 43 +-- .../skyblock/fancybars/StatusBarsConfigScreen.java | 4 +- .../skyblock/fishing/FishingHookDisplayHelper.java | 16 +- .../skyblocker/skyblock/garden/FarmingHud.java | 8 +- .../skyblock/garden/GardenPlotsWidget.java | 26 +- .../skyblock/garden/visitor/VisitorHelper.java | 40 +-- .../skyblock/item/SkyblockCraftingTableScreen.java | 6 +- .../skyblock/item/SkyblockInventoryScreen.java | 12 +- .../background/adders/ItemRarityBackground.java | 41 ++- .../background/adders/JacobMedalBackground.java | 4 +- .../adders/LegacyAttributeBackground.java | 4 +- .../custom/screen/AnimatedDyeTimelineWidget.java | 4 +- .../item/custom/screen/ColorSelectionWidget.java | 4 +- .../item/custom/screen/CustomizeArmorScreen.java | 11 +- .../item/custom/screen/HeadSelectionWidget.java | 4 +- .../skyblock/item/custom/screen/PlayerWidget.java | 31 +- .../item/custom/screen/TrimElementButton.java | 27 +- .../item/custom/screen/TrimSelectionWidget.java | 4 +- .../custom/screen/name/CustomizeNameScreen.java | 4 +- .../skyblock/item/slottext/SlotTextManager.java | 25 +- .../skyblock/item/tooltip/BackpackPreview.java | 19 +- .../item/tooltip/CompactorDeletorPreview.java | 5 +- .../tooltip/CompactorPreviewTooltipComponent.java | 12 +- .../recipebook/SkyblockRecipeBookWidget.java | 10 +- .../recipebook/SkyblockRecipeResultButton.java | 4 +- .../itemlist/recipebook/SkyblockRecipeResults.java | 7 +- .../recipebook/SkyblockRecipeTabButton.java | 4 +- .../itemlist/recipebook/UpcomingEventsTab.java | 17 +- .../itemlist/recipes/SkyblockForgeRecipe.java | 3 +- .../profileviewer/ProfileViewerNavButton.java | 4 +- .../profileviewer/ProfileViewerScreen.java | 4 +- .../profileviewer/ProfileViewerTextWidget.java | 11 +- .../profileviewer/collections/GenericCategory.java | 4 +- .../profileviewer/dungeons/DungeonClassWidget.java | 12 +- .../dungeons/DungeonFloorRunsWidget.java | 4 +- .../dungeons/DungeonHeaderWidget.java | 4 +- .../dungeons/DungeonMiscStatsWidgets.java | 8 +- .../profileviewer/inventory/Inventory.java | 12 +- .../profileviewer/inventory/PaginationButton.java | 6 +- .../profileviewer/inventory/PlayerInventory.java | 20 +- .../skyblock/profileviewer/skills/SkillWidget.java | 8 +- .../skyblock/profileviewer/skills/SkillsPage.java | 4 +- .../profileviewer/slayers/SlayerWidget.java | 14 +- .../profileviewer/utils/SubPageSelectButton.java | 4 +- .../skyblock/quicknav/QuickNavButton.java | 4 +- .../skyblock/searchoverlay/OverlayScreen.java | 9 +- .../shortcut/ShortcutsConfigListWidget.java | 12 +- .../skyblock/shortcut/ShortcutsConfigScreen.java | 8 +- .../skyblocker/skyblock/slayers/SlayerManager.java | 2 +- .../speedPreset/SpeedPresetListWidget.java | 5 +- .../skyblock/speedPreset/SpeedPresetsScreen.java | 3 +- .../skyblock/tabhud/config/WidgetsElementList.java | 13 +- .../skyblock/tabhud/config/WidgetsListTab.java | 5 + .../tabhud/config/entries/WidgetEntry.java | 3 +- .../skyblock/tabhud/config/preview/PreviewTab.java | 11 +- .../tabhud/config/preview/PreviewWidget.java | 23 +- .../tabhud/screenbuilder/WidgetManager.java | 26 +- .../tabhud/widget/ComponentBasedWidget.java | 9 - .../widget/component/IcoFatTextComponent.java | 5 +- .../tabhud/widget/component/IcoTextComponent.java | 3 +- .../widget/component/PlainTextComponent.java | 3 +- .../tabhud/widget/component/PlayerComponent.java | 3 +- .../tabhud/widget/component/ProgressComponent.java | 5 +- .../skyblock/waypoint/AbstractWaypointsScreen.java | 8 +- .../skyblock/waypoint/WaypointsScreen.java | 4 +- .../skyblock/waypoint/WaypointsShareScreen.java | 4 +- .../hysky/skyblocker/utils/ApiAuthentication.java | 2 +- src/main/java/de/hysky/skyblocker/utils/Http.java | 2 +- .../utils/container/ContainerSolverManager.java | 20 +- .../skyblocker/utils/render/GlowRenderer.java | 124 ++++++++ .../hysky/skyblocker/utils/render/HudHelper.java | 67 ++++ .../skyblocker/utils/render/RenderHelper.java | 106 ++----- .../de/hysky/skyblocker/utils/render/Renderer.java | 346 +++++++++++++++++++++ .../utils/render/SkyblockerRenderLayers.java | 89 ------ .../utils/render/SkyblockerRenderPipelines.java | 8 +- .../skyblocker/utils/render/gui/ARGBTextInput.java | 2 +- .../utils/render/gui/AbstractPopupScreen.java | 12 +- .../utils/render/gui/ColorPickerWidget.java | 17 +- .../utils/render/gui/CyclingTextureWidget.java | 6 +- .../utils/render/gui/DropdownWidget.java | 5 - .../utils/render/gui/SideTabButtonWidget.java | 4 +- .../gui/special/EquipmentGuiElementRenderer.java | 54 ++++ .../gui/special/InstancedGuiElementRenderer.java | 32 ++ .../gui/state/EquipmentGuiElementRenderState.java | 54 ++++ .../HorizontalGradientGuiElementRenderState.java | 47 +++ .../gui/state/InstancedGuiElementRenderState.java | 9 + .../state/OutlinedTextGuiElementRenderState.java | 109 +++++++ .../utils/render/title/TitleContainer.java | 17 +- .../utils/scheduler/MessageScheduler.java | 2 +- 140 files changed, 1726 insertions(+), 947 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/mixins/BackgroundRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/FogRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GlCommandEncoderMixin.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/GuiRendererMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/BufferManagerInvoker.java delete mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/DrawContextInvoker.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/OutlineVertexConsumerProviderAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/TextRendererAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/GlowRenderer.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/HudHelper.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/Renderer.java delete mode 100644 src/main/java/de/hysky/skyblocker/utils/render/SkyblockerRenderLayers.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/special/EquipmentGuiElementRenderer.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/special/InstancedGuiElementRenderer.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/state/EquipmentGuiElementRenderState.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/state/HorizontalGradientGuiElementRenderState.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/state/InstancedGuiElementRenderState.java create mode 100644 src/main/java/de/hysky/skyblocker/utils/render/gui/state/OutlinedTextGuiElementRenderState.java (limited to 'src/main/java/de') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java b/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java index 891507b2..93c965d7 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerScreen.java @@ -7,11 +7,11 @@ import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ConfirmLinkScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.*; -import net.minecraft.client.render.RenderLayer; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.OrderedText; import net.minecraft.text.StringVisitable; @@ -136,7 +136,7 @@ public class SkyblockerScreen extends Screen { int iconY = y - 13; context.drawTextWithShadow(textRenderer, orderedText, x, y, this.getTextColor()); - context.drawTexture(RenderLayer::getGuiTextured, this.icon, iconX, iconY, 0, 0, 32, 32, 32, 32); + context.drawTexture(RenderPipelines.GUI_TEXTURED, this.icon, iconX, iconY, 0, 0, 32, 32, 32, 32); } private OrderedText trim(Text text, int width) { diff --git a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java index bef99848..1decb8cd 100644 --- a/src/main/java/de/hysky/skyblocker/UpdateNotifications.java +++ b/src/main/java/de/hysky/skyblocker/UpdateNotifications.java @@ -43,7 +43,7 @@ public class UpdateNotifications { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); private static final String BASE_URL = "https://api.modrinth.com/v2/project/y6DuFGwJ/version?loaders=[%22fabric%22]&game_versions="; private static final Version MOD_VERSION = SkyblockerMod.SKYBLOCKER_MOD.getMetadata().getVersion(); - private static final String MC_VERSION = SharedConstants.getGameVersion().getId(); + private static final String MC_VERSION = SharedConstants.getGameVersion().id(); private static final Path CONFIG_PATH = SkyblockerMod.CONFIG_DIR.resolve("update_notifications.json"); @VisibleForTesting protected static final Comparator COMPARATOR = Version::compareTo; diff --git a/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java b/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java index 2af8860e..badcc5cc 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/MixinPlugin.java @@ -27,7 +27,7 @@ public class MixinPlugin implements IMixinConfigPlugin { public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { return switch (mixinClassName) { case String s when s.endsWith("WorldRendererMixin") -> !OPTIFABRIC_LOADED; - case String s when s.endsWith("GlResourceManagerMixin") -> SystemUtils.IS_OS_MAC && "aarch64".equalsIgnoreCase(SystemUtils.OS_ARCH); + case String s when s.endsWith("GlCommandEncoderMixin") -> SystemUtils.IS_OS_MAC && "aarch64".equalsIgnoreCase(SystemUtils.OS_ARCH); default -> true; }; diff --git a/src/main/java/de/hysky/skyblocker/compatibility/rei/recipe/SkyblockRecipeCategory.java b/src/main/java/de/hysky/skyblocker/compatibility/rei/recipe/SkyblockRecipeCategory.java index 167bafcf..e413a686 100644 --- a/src/main/java/de/hysky/skyblocker/compatibility/rei/recipe/SkyblockRecipeCategory.java +++ b/src/main/java/de/hysky/skyblocker/compatibility/rei/recipe/SkyblockRecipeCategory.java @@ -10,7 +10,6 @@ import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.EntryStacks; import net.minecraft.client.gui.ScreenPos; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -18,6 +17,8 @@ import net.minecraft.util.Identifier; import java.util.ArrayList; import java.util.List; +import org.joml.Matrix3x2fStack; + /** * Skyblock recipe category class for REI */ @@ -79,11 +80,11 @@ public class SkyblockRecipeCategory implements DisplayCategory { - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.translate(bounds.getX(), bounds.getY(), 0.f); + Matrix3x2fStack matrices = context.getMatrices(); + matrices.pushMatrix(); + matrices.translate(bounds.getX(), bounds.getY()); recipe.render(context, bounds.getWidth(), bounds.getHeight(), mouseX - bounds.getX(), mouseY - bounds.getY()); - matrices.pop(); + matrices.popMatrix(); })); ScreenPos arrowLocation = recipe.getArrowLocation(bounds.getWidth(), bounds.getHeight()); if (arrowLocation != null) diff --git a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java index 9c725fa7..64ee3ff5 100644 --- a/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/HudConfigScreen.java @@ -1,6 +1,6 @@ package de.hysky.skyblocker.config; -import de.hysky.skyblocker.utils.render.RenderHelper; +import de.hysky.skyblocker.utils.render.HudHelper; import de.hysky.skyblocker.utils.render.gui.AbstractWidget; import it.unimi.dsi.fastutil.ints.IntIntMutablePair; import net.minecraft.client.gui.DrawContext; @@ -90,7 +90,7 @@ public abstract class HudConfigScreen extends Screen { public final boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { for (AbstractWidget widget : widgets) { - if (RenderHelper.pointIsInArea(mouseX, mouseY, widget.getX() + getWidgetXOffset(widget), widget.getY(), widget.getX() + getWidgetXOffset(widget) + widget.getWidth(), widget.getY() + widget.getHeight())) { + if (HudHelper.pointIsInArea(mouseX, mouseY, widget.getX() + getWidgetXOffset(widget), widget.getY(), widget.getX() + getWidgetXOffset(widget) + widget.getWidth(), widget.getY() + widget.getHeight())) { draggingWidget = widget; mouseClickRelativeX = mouseX - widget.getX() - getWidgetXOffset(widget); mouseClickRelativeY = mouseY - widget.getY(); diff --git a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java index 4fd9ade9..ade771c2 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/DungeonsConfig.java @@ -19,9 +19,9 @@ public class DungeonsConfig { public boolean classBasedPlayerGlow = true; - public boolean starredMobGlow = false; + public boolean starredMobGlow = true; - public boolean starredMobBoundingBoxes = true; + public boolean starredMobBoundingBoxes = false; public boolean highlightDoorKeys = true; diff --git a/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java b/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java index 710b8133..500cafe6 100644 --- a/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/config/screens/powdertracker/PowderFilterConfigScreen.java @@ -9,6 +9,7 @@ import net.minecraft.client.gui.widget.GridWidget; import net.minecraft.client.gui.widget.SimplePositioningWidget; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; +import net.minecraft.util.Colors; import net.minecraft.util.Formatting; import org.jetbrains.annotations.Nullable; @@ -32,7 +33,7 @@ public class PowderFilterConfigScreen extends Screen { protected void init() { addDrawable((context, mouseX, mouseY, delta) -> { assert client != null; - context.drawCenteredTextWithShadow(client.textRenderer, Text.translatable("skyblocker.config.mining.crystalHollows.powderTrackerFilter.screenTitle").formatted(Formatting.BOLD), width / 2, (32 - client.textRenderer.fontHeight) / 2, 0xFFFFFF); + context.drawCenteredTextWithShadow(client.textRenderer, Text.translatable("skyblocker.config.mining.crystalHollows.powderTrackerFilter.screenTitle").formatted(Formatting.BOLD), width / 2, (32 - client.textRenderer.fontHeight) / 2, Colors.WHITE); }); ItemTickList itemTickList = addDrawableChild(new ItemTickList<>(MinecraftClient.getInstance(), width, height - 96, 32, 24, filters, allItems).init()); //Grid code gratuitously stolen from WaypointsScreen. Same goes for the y and heights above. diff --git a/src/main/java/de/hysky/skyblocker/debug/Debug.java b/src/main/java/de/hysky/skyblocker/debug/Debug.java index 559c09d1..35fde3aa 100644 --- a/src/main/java/de/hysky/skyblocker/debug/Debug.java +++ b/src/main/java/de/hysky/skyblocker/debug/Debug.java @@ -3,6 +3,7 @@ package de.hysky.skyblocker.debug; import com.google.gson.JsonElement; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.logging.LogUtils; import com.mojang.serialization.JsonOps; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; @@ -28,23 +29,27 @@ import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.option.KeyBinding; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtHelper; import net.minecraft.nbt.NbtOps; import net.minecraft.predicate.entity.EntityPredicates; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.screen.slot.Slot; +import net.minecraft.storage.NbtWriteView; import net.minecraft.text.Text; import net.minecraft.text.TextCodecs; +import net.minecraft.util.ErrorReporter; import net.minecraft.world.biome.Biome; import org.lwjgl.glfw.GLFW; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.MixinEnvironment; import java.util.List; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; public class Debug { + private static final Logger LOGGER = LogUtils.getLogger(); private static final boolean DEBUG_ENABLED = Boolean.parseBoolean(System.getProperty("skyblocker.debug", "false")); //This is necessary to not spam the chat with 20 messages per second private static boolean keyDown = false; @@ -81,6 +86,7 @@ public class Debug { .then(EventNotifications.debugToasts()) .then(dumpBiome()) .then(dumpActionBar()) + .then(auditMixins()) ) )); ClientTickEvents.END_CLIENT_TICK.register(client -> { @@ -88,7 +94,12 @@ public class Debug { if (dumpNearbyEntitiesKey.wasPressed() && !keyDown) { client.world.getOtherEntities(client.player, client.player.getBoundingBox().expand(SkyblockerConfigManager.get().debug.dumpRange)) .stream() - .map(entity -> entity.writeNbt(new NbtCompound())) + .map(entity -> { + NbtWriteView writeView = NbtWriteView.create(new ErrorReporter.Logging(LOGGER), Utils.getRegistryWrapperLookup()); + entity.writeData(writeView); + + return writeView.getNbt(); + }) .map(NbtHelper::toPrettyPrintedText) .forEach(text -> client.player.sendMessage(text, false)); keyDown = true; @@ -187,6 +198,15 @@ public class Debug { }); } + private static LiteralArgumentBuilder auditMixins() { + return literal("auditMixins") + .executes(context -> { + MixinEnvironment.getCurrentEnvironment().audit(); + + return Command.SINGLE_SUCCESS; + }); + } + public enum DumpFormat { JSON { @Override diff --git a/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java b/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java index fb876bb4..421791d4 100644 --- a/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java +++ b/src/main/java/de/hysky/skyblocker/debug/SnapshotDebug.java @@ -16,11 +16,12 @@ public class SnapshotDebug { private static final float[] RED = { 1.0f, 0.0f, 0.0f }; private static final float ALPHA = 0.5f; private static final int CYAN = ColorHelper.withAlpha(ColorHelper.channelFromFloat(ALPHA), Colors.CYAN); + private static final int BLUE = ColorHelper.withAlpha(ColorHelper.channelFromFloat(ALPHA), Colors.BLUE); private static final float LINE_WIDTH = 8f; public static final long AARON_WORLD_SEED = 5629719634239627355L; public static boolean isInSnapshot() { - return !SharedConstants.getGameVersion().isStable(); + return !SharedConstants.getGameVersion().stable(); } static void init() { @@ -34,15 +35,16 @@ public class SnapshotDebug { RenderHelper.renderFilledWithBeaconBeam(wrc, new BlockPos(175, 63, -14), RED, ALPHA, true); RenderHelper.renderLinesFromPoints(wrc, new Vec3d[] { new Vec3d(173, 66, -7.5), new Vec3d(178, 66, -7.5) }, RED, ALPHA, LINE_WIDTH, false); RenderHelper.renderQuad(wrc, new Vec3d[] { new Vec3d(183, 66, -16), new Vec3d(183, 63, -16), new Vec3d(183, 63, -14), new Vec3d(183, 66, -14) }, RED, ALPHA, false); - RenderHelper.renderText(wrc, Text.of("Skyblocker on " + SharedConstants.getGameVersion().getName() + "!"), new Vec3d(175.5, 67.5, -7.5), false); + RenderHelper.renderText(wrc, Text.of("Skyblocker on " + SharedConstants.getGameVersion().name() + "!"), new Vec3d(175.5, 67.5, -7.5), false); RenderHelper.renderCylinder(wrc, new BlockPos(172, 78, 44).toCenterPos(), 12, 12, 32, CYAN); + RenderHelper.renderCylinder(wrc, new BlockPos(144, 78, 44).toCenterPos(), 12, 12, 32, BLUE); } else if (isInSnapshot()) { RenderHelper.renderFilledWithBeaconBeam(wrc, new BlockPos(-3, 63, 5), RED, ALPHA, true); RenderHelper.renderOutline(wrc, new BlockPos(-3, 63, 5), RED, 5, true); // Use waypoint default line width RenderHelper.renderLinesFromPoints(wrc, new Vec3d[] { new Vec3d(-2, 65, 6.5), new Vec3d(3, 65, 6.5) }, RED, ALPHA, LINE_WIDTH, false); RenderHelper.renderLineFromCursor(wrc, new Vec3d(-2.5, 63.5, 5.5), RED, ALPHA, LINE_WIDTH); RenderHelper.renderQuad(wrc, new Vec3d[] { new Vec3d(3, 66, 3), new Vec3d(3, 63, 3), new Vec3d(3, 63, 5), new Vec3d(3, 66, 5) }, RED, ALPHA, false); - RenderHelper.renderText(wrc, Text.of("Skyblocker on " + SharedConstants.getGameVersion().getName() + "!"), new Vec3d(0.5, 66.5, 6.5), false); + RenderHelper.renderText(wrc, Text.of("Skyblocker on " + SharedConstants.getGameVersion().name() + "!"), new Vec3d(0.5, 66.5, 6.5), false); } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/BackgroundRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/BackgroundRendererMixin.java deleted file mode 100644 index 327ef8f5..00000000 --- a/src/main/java/de/hysky/skyblocker/mixins/BackgroundRendererMixin.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.hysky.skyblocker.mixins; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import com.llamalad7.mixinextras.sugar.Local; - -import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.config.configs.CrimsonIsleConfig; -import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.enums.CameraSubmersionType; -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.Camera; -import net.minecraft.client.render.Fog; - -import org.joml.Vector4f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -@Mixin(BackgroundRenderer.class) -public abstract class BackgroundRendererMixin { - - /** - * Moves fog farther away from the player when in the crimson isles. - * This sets it to be the same distance as what you would see in the overworld (every other skyblock island) - */ - @ModifyReturnValue(method = "applyFog", at = @At("RETURN")) - private static Fog applyFogModifyDistance(Fog original, @Local(argsOnly = true) Camera camera, @Local(argsOnly = true) BackgroundRenderer.FogType fogType, @Local(argsOnly = true) Vector4f color, @Local(argsOnly = true, ordinal = 0) float viewDistance, @Local(argsOnly = true) boolean thickFog) { - final CameraSubmersionType cameraSubmersionType = camera.getSubmersionType(); - CrimsonIsleConfig config = SkyblockerConfigManager.get().crimsonIsle; - - if (Utils.isOnSkyblock() && config.extendNetherFog && cameraSubmersionType == CameraSubmersionType.NONE && thickFog) { - float start; - if (fogType == BackgroundRenderer.FogType.FOG_SKY) { - start = 0.0f; - } else { - start = viewDistance - Math.clamp(viewDistance / 10.0f, 4.0f, 64.0f); - } - - return new Fog(start, original.end(), original.shape(), original.red(), original.green(), original.blue(), original.alpha()); - } - - return original; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/BossBarHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/BossBarHudMixin.java index a15489c5..c208cb45 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/BossBarHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/BossBarHudMixin.java @@ -7,6 +7,8 @@ import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.BossBarHud; import net.minecraft.client.gui.hud.ClientBossBar; import net.minecraft.entity.boss.BossBar; +import net.minecraft.util.Colors; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -31,7 +33,7 @@ public abstract class BossBarHudMixin { ClientBossBar bar = SlayerBossBars.updateBossBar(); int textWidth = this.client.textRenderer.getWidth(bar.getName()); - context.drawTextWithShadow(this.client.textRenderer, bar.getName(), context.getScaledWindowWidth() / 2 - textWidth / 2, 3, 16777215); + context.drawTextWithShadow(this.client.textRenderer, bar.getName(), context.getScaledWindowWidth() / 2 - textWidth / 2, 3, Colors.WHITE); this.renderBossBar(context, (context.getScaledWindowWidth() / 2) - 91, 12, bar); diff --git a/src/main/java/de/hysky/skyblocker/mixins/DownloadingTerrainScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/DownloadingTerrainScreenMixin.java index bea1cf91..e9ae4a6e 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/DownloadingTerrainScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/DownloadingTerrainScreenMixin.java @@ -11,7 +11,7 @@ import net.minecraft.client.gui.screen.DownloadingTerrainScreen; @Mixin(DownloadingTerrainScreen.class) public class DownloadingTerrainScreenMixin { - @Inject(method = "render", at = @At("HEAD"), cancellable = true) + @Inject(method = { "render", "renderBackground" }, at = @At("HEAD"), cancellable = true) private void skyblocker$hideWorldLoadingScreen(CallbackInfo ci) { if (Utils.isOnHypixel()) ci.cancel(); } diff --git a/src/main/java/de/hysky/skyblocker/mixins/FogRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/FogRendererMixin.java new file mode 100644 index 00000000..cbd0a5c3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/FogRendererMixin.java @@ -0,0 +1,29 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Utils; +import net.minecraft.client.render.fog.FogRenderer; + +import org.joml.Vector4f; +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.CallbackInfoReturnable; + +@Mixin(FogRenderer.class) +public class FogRendererMixin { + + /** + * Moves fog farther away from the player when in the crimson isles. + * This sets it to be the same distance as what you would see in the overworld (every other skyblock island) + */ + @Inject(method = "applyFog(Lnet/minecraft/client/render/Camera;IZLnet/minecraft/client/render/RenderTickCounter;FLnet/minecraft/client/world/ClientWorld;)Lorg/joml/Vector4f;", at = @At("HEAD")) + private void applyFogModifyDistance(CallbackInfoReturnable ci, @Local(argsOnly = true) LocalBooleanRef thickFog) { + if (Utils.isOnSkyblock() && Utils.isInCrimson() && SkyblockerConfigManager.get().crimsonIsle.extendNetherFog && thickFog.get()) { + thickFog.set(false); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java index 6c4fe75d..59951305 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/GameRendererMixin.java @@ -3,13 +3,23 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.GlowRenderer; +import de.hysky.skyblocker.utils.render.Renderer; import net.minecraft.client.render.GameRenderer; 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; @Mixin(GameRenderer.class) public class GameRendererMixin { + @Inject(method = "close", at = @At("TAIL")) + private void skyblocker$onGameRendererClose(CallbackInfo ci) { + Renderer.close(); + GlowRenderer.getInstance().close(); + } + @ModifyReturnValue(method = "getNightVisionStrength", at = @At("RETURN")) private static float onGetNightVisionStrength(float original) { if (original == 1.0F && Utils.isOnSkyblock()) { diff --git a/src/main/java/de/hysky/skyblocker/mixins/GlCommandEncoderMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GlCommandEncoderMixin.java new file mode 100644 index 00000000..b418d364 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/GlCommandEncoderMixin.java @@ -0,0 +1,30 @@ +package de.hysky.skyblocker.mixins; + +import java.nio.ByteBuffer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.opengl.GlConst; + +import de.hysky.skyblocker.mixins.accessors.BufferManagerInvoker; +import net.minecraft.client.gl.BufferManager; +import net.minecraft.client.gl.GlCommandEncoder; + +@Mixin(GlCommandEncoder.class) +public class GlCommandEncoderMixin { + + @WrapWithCondition(method = "writeToBuffer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/BufferManager;setBufferSubData(IILjava/nio/ByteBuffer;)V")) + private static boolean aaronMod$replaceBufferData(BufferManager manager, int buffer, int offset, ByteBuffer data, @Local(argsOnly = true) GpuBufferSlice gpuBufferSlice) { + if (offset == 0 && gpuBufferSlice.length() == gpuBufferSlice.buffer().size()) { + ((BufferManagerInvoker) manager).invokeSetBufferData(buffer, data, GlConst.bufferUsageToGlEnum(gpuBufferSlice.buffer().usage())); + + return false; + } + + return true; + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java deleted file mode 100644 index 582b4087..00000000 --- a/src/main/java/de/hysky/skyblocker/mixins/GlResourceManagerMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.hysky.skyblocker.mixins; - -import java.nio.ByteBuffer; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.buffers.GpuBuffer; -import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlStateManager; - -import net.minecraft.client.gl.GlResourceManager; - -@Mixin(GlResourceManager.class) -public class GlResourceManagerMixin { - - @WrapWithCondition(method = "writeToBuffer", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/opengl/GlStateManager;_glBufferSubData(IILjava/nio/ByteBuffer;)V", ordinal = 0)) - private static boolean skyblocker$replaceBufferData(int target, int offset, ByteBuffer data, @Local(argsOnly = true) GpuBuffer gpuBuffer) { - GlStateManager._glBufferData(target, data, GlConst.toGl(gpuBuffer.usage())); - - return false; - } -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/GuiRendererMixin.java b/src/main/java/de/hysky/skyblocker/mixins/GuiRendererMixin.java new file mode 100644 index 00000000..fd5288be --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/GuiRendererMixin.java @@ -0,0 +1,70 @@ +package de.hysky.skyblocker.mixins; + +import java.util.Iterator; +import java.util.Map; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import de.hysky.skyblocker.utils.render.gui.special.InstancedGuiElementRenderer; +import de.hysky.skyblocker.utils.render.gui.state.InstancedGuiElementRenderState; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.client.gui.render.GuiRenderer; +import net.minecraft.client.gui.render.SpecialGuiElementRenderer; +import net.minecraft.client.gui.render.state.GuiRenderState; +import net.minecraft.client.gui.render.state.special.SpecialGuiElementRenderState; +import net.minecraft.client.render.VertexConsumerProvider; + +@Mixin(GuiRenderer.class) +public class GuiRendererMixin { + @Shadow + @Final + GuiRenderState state; + @Shadow + @Final + private VertexConsumerProvider.Immediate vertexConsumers; + @Unique + private final Map> instancedRenderers = new Object2ObjectOpenHashMap<>(); + + @Inject(method = "prepareSpecialElement", at = @At("HEAD"), cancellable = true) + private void skyblocker$instancedGuiElementRendering(SpecialGuiElementRenderState specialGuiElementRenderState, int windowScaleFactor, CallbackInfo ci) { + if (specialGuiElementRenderState instanceof InstancedGuiElementRenderState instanced) { + @SuppressWarnings("unchecked") + InstancedGuiElementRenderer renderer = (InstancedGuiElementRenderer) this.instancedRenderers.computeIfAbsent(instanced, ignored -> instanced.newRenderer(this.vertexConsumers)); + renderer.render(instanced, this.state, windowScaleFactor); + + ci.cancel(); + } + } + + @Inject(method = "render", at = @At("TAIL")) + private void skyblocker$clearUnusedRenderers(CallbackInfo ci) { + this.closeUnusedRenderers(); + } + + @Inject(method = "close", at = @At("TAIL")) + public void skyblocker$closeInstancedRenderers(CallbackInfo ci) { + this.instancedRenderers.values().forEach(SpecialGuiElementRenderer::close); + } + + @Unique + private void closeUnusedRenderers() { + Iterator>> iterator = this.instancedRenderers.entrySet().iterator(); + + while (iterator.hasNext()) { + InstancedGuiElementRenderer renderer = iterator.next().getValue(); + + if (!renderer.usedThisFrame()) { + renderer.close(); + iterator.remove(); + } else { + renderer.resetUsedThisFrame(); + } + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java index 11aa83ea..c59a2f54 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/HandledScreenMixin.java @@ -25,13 +25,13 @@ import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.container.ContainerSolver; import de.hysky.skyblocker.utils.container.ContainerSolverManager; import net.fabricmc.fabric.api.client.screen.v1.Screens; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.widget.ClickableWidget; -import net.minecraft.client.render.RenderLayer; import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -200,6 +200,12 @@ public abstract class HandledScreenMixin extends Screen } } + @SuppressWarnings("unchecked") + @Inject(method = "drawMouseoverTooltip", at = @At("HEAD")) + private void skyblocker$beforeTooltipDrawn(CallbackInfo ci, @Local(argsOnly = true) DrawContext context) { + ContainerSolverManager.onDraw(context, (HandledScreen) (Object) this, this.handler.slots); + } + @SuppressWarnings("DataFlowIssue") // makes intellij be quiet about this.focusedSlot maybe being null. It's already null checked in mixined method. @WrapOperation(method = "drawMouseoverTooltip", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;Ljava/util/Optional;IILnet/minecraft/util/Identifier;)V")) @@ -381,13 +387,13 @@ public abstract class HandledScreenMixin extends Screen // Item Protection if (ItemProtection.isItemProtected(slot.getStack())) { - context.drawTexture(RenderLayer::getGuiTextured, ItemProtection.ITEM_PROTECTION_TEX, slot.x, slot.y, 0, 0, 16, 16, 16, 16); + context.drawTexture(RenderPipelines.GUI_TEXTURED, ItemProtection.ITEM_PROTECTION_TEX, slot.x, slot.y, 0, 0, 16, 16, 16, 16); } // Search // Darken the slots if (InventorySearch.isSearching() && !InventorySearch.slotMatches(slot)) { - context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, 100, 0x88_000000); + context.fill(slot.x, slot.y, slot.x + 16, slot.y + 16, 0x88_000000); } } diff --git a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java index 6f502bb6..2fd9cd4b 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InGameHudMixin.java @@ -15,10 +15,13 @@ import de.hysky.skyblocker.utils.Utils; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.gui.hud.PlayerListHud; -import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.gui.hud.bar.Bar; +import net.minecraft.client.render.RenderTickCounter; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.scoreboard.Scoreboard; @@ -58,20 +61,32 @@ public abstract class InGameHudMixin { // slot lock if (HotbarSlotLock.isLocked(index)) { - context.drawTexture(RenderLayer::getGuiTextured, SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16); + context.drawTexture(RenderPipelines.GUI_TEXTURED, SLOT_LOCK_ICON.get(), x, y, 0, 0, 16, 16, 16, 16); } //item protection if (ItemProtection.isItemProtected(player.getInventory().getMainStacks().get(index))) { - context.drawTexture(RenderLayer::getGuiTextured, ItemProtection.ITEM_PROTECTION_TEX, x, y, 0, 0, 16, 16, 16, 16); + context.drawTexture(RenderPipelines.GUI_TEXTURED, ItemProtection.ITEM_PROTECTION_TEX, x, y, 0, 0, 16, 16, 16, 16); } } } - @Inject(method = { "renderExperienceBar", "renderExperienceLevel" }, at = @At("HEAD"), cancellable = true, require = 2) - private void skyblocker$renderExperienceBar(CallbackInfo ci) { - if (Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && FancyStatusBars.isExperienceFancyBarEnabled()) - ci.cancel(); + @WrapWithCondition(method = "renderMainHud", at = { + @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/bar/Bar;renderBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V"), + @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/bar/Bar;renderAddons(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V") + }, require = 2) + private boolean skyblocker$renderExperienceBar(Bar bar, DrawContext context, RenderTickCounter tickCounter) { + return shouldShowExperienceBar(); + } + + @WrapWithCondition(method = "renderMainHud", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/bar/Bar;drawExperienceLevel(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/font/TextRenderer;I)V")) + private boolean skyblocker$renderExperienceLevel(DrawContext context, TextRenderer textRenderer, int level) { + return shouldShowExperienceBar(); + } + + @Unique + private static boolean shouldShowExperienceBar() { + return !(Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && FancyStatusBars.isExperienceFancyBarEnabled()); } @Inject(method = "renderStatusBars", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHealthBar(Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/entity/player/PlayerEntity;IIIIFIIIZ)V", shift = At.Shift.AFTER), cancellable = true) diff --git a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java index 44674a14..65cc0ef2 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/InventoryScreenMixin.java @@ -51,14 +51,16 @@ public abstract class InventoryScreenMixin extends HandledScreen components, int x, int y, TooltipPositioner positioner, @Nullable Identifier texture); -} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/OutlineVertexConsumerProviderAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/OutlineVertexConsumerProviderAccessor.java new file mode 100644 index 00000000..28e3bee6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/OutlineVertexConsumerProviderAccessor.java @@ -0,0 +1,16 @@ +package de.hysky.skyblocker.mixins.accessors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.render.OutlineVertexConsumerProvider; +import net.minecraft.client.render.VertexConsumerProvider; + +@Mixin(OutlineVertexConsumerProvider.class) +public interface OutlineVertexConsumerProviderAccessor { + + @Accessor + @Mutable + void setPlainDrawer(VertexConsumerProvider.Immediate immediate); +} diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/TextRendererAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/TextRendererAccessor.java new file mode 100644 index 00000000..c4402eac --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/TextRendererAccessor.java @@ -0,0 +1,19 @@ +package de.hysky.skyblocker.mixins.accessors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.font.FontStorage; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.util.Identifier; + +@Mixin(TextRenderer.class) +public interface TextRendererAccessor { + + @Accessor + boolean getValidateAdvance(); + + @Invoker + FontStorage invokeGetFontStorage(Identifier id); +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 83c5e5c5..66115a38 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -26,6 +26,7 @@ import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Colors; import net.minecraft.util.Formatting; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; @@ -352,10 +353,10 @@ public class ChestValue { double f = Math.sin((Math.PI / 2) * Math.cos((Math.PI * 2) * d / e)) / 2.0 + 0.5; double g = MathHelper.lerp(f, 0.0, l); context.enableScissor(startX, getY(), endX, getY() + textRenderer.fontHeight); - context.drawText(textRenderer, text, startX - (int) g, getY(), -1, shadow); + context.drawText(textRenderer, text, startX - (int) g, getY(), Colors.WHITE, shadow); context.disableScissor(); } else { - context.drawText(textRenderer, text, startX, getY(), -1, shadow); + context.drawText(textRenderer, text, startX, getY(), Colors.WHITE, shadow); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java b/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java index cef7a84b..bc822bfe 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/HealthBars.java @@ -229,9 +229,8 @@ public class HealthBars { int mixedColor = ColorUtils.interpolate(health, emptyColor.getRGB(), halfColor.getRGB(), fullColor.getRGB()); float[] components = ColorUtils.getFloatComponents(mixedColor); // Render the health bar texture with scaling based on health percentage - RenderHelper.renderTextureInWorld(context, armorStand.getCameraPosVec(tickDelta).add(0, 0.25 - height, 0), width * health, height, health, 1f, new Vec3d(width * -0.5f, 0, 0.003f), HEALTH_BAR_TEXTURE, components, 1f, true); RenderHelper.renderTextureInWorld(context, armorStand.getCameraPosVec(tickDelta).add(0, 0.25 - height, 0), width, height, 1f, 1f, new Vec3d(width * -0.5f, 0, 0), HEALTH_BAR_BACKGROUND_TEXTURE, components, 1f, true); - + RenderHelper.renderTextureInWorld(context, armorStand.getCameraPosVec(tickDelta).add(0, 0.25 - height, 0), width * health, height, health, 1f, new Vec3d(width * -0.5f, 0, -0.003f), HEALTH_BAR_TEXTURE, components, 1f, true); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java index a7ff1883..625e850b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/auction/AuctionBrowserScreen.java @@ -13,12 +13,11 @@ import de.hysky.skyblocker.utils.render.gui.AbstractCustomHypixelGUI; import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gl.RenderPipelines; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.render.RenderLayer; import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; @@ -30,6 +29,8 @@ import net.minecraft.util.Colors; import net.minecraft.util.Identifier; import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.MathHelper; + +import org.joml.Matrix3x2fStack; import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -125,7 +126,7 @@ public class AuctionBrowserScreen extends AbstractCustomHypixelGUI