From cda94e2bf1a4c18e0ec0de85b92e5da68c28bef7 Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 15:40:18 -0500 Subject: [PATCH 1/8] Add advancement renderers --- fabric-rendering-v1/build.gradle | 4 + .../AbstractAdvancementRenderContext.java | 63 ++++++++ .../AdvancementBackgroundRenderContext.java | 40 ++++++ .../AdvancementFrameRenderContext.java | 37 +++++ .../AdvancementIconRenderContext.java | 42 ++++++ .../v1/advancement/AdvancementRenderer.java | 109 ++++++++++++++ ...dvancementBackgroundRenderContextImpl.java | 29 ++++ .../AdvancementFrameRenderContextImpl.java | 28 ++++ .../AdvancementIconRenderContextImpl.java | 90 ++++++++++++ .../AdvancementRendererRegistryImpl.java | 77 ++++++++++ .../advancement/AdvancementTabAccessor.java | 29 ++++ .../advancement/AdvancementTabMixin.java | 95 ++++++++++++ .../advancement/AdvancementTabTypeMixin.java | 50 +++++++ .../advancement/AdvancementToastMixin.java | 58 ++++++++ .../AdvancementWidgetAccessor.java | 30 ++++ .../advancement/AdvancementWidgetMixin.java | 135 ++++++++++++++++++ .../advancement/AdvancementsScreenMixin.java | 57 ++++++++ .../ClientAdvancementsAccessor.java | 32 +++++ .../fabric-rendering-v1.accesswidener | 2 + .../resources/fabric-rendering-v1.mixins.json | 8 ++ .../src/client/resources/fabric.mod.json | 1 + .../src/testmod/resources/fabric.mod.json | 1 + .../client/AdvancementRenderingTests.java | 85 +++++++++++ 23 files changed, 1102 insertions(+) create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java create mode 100644 fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener create mode 100644 fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java diff --git a/fabric-rendering-v1/build.gradle b/fabric-rendering-v1/build.gradle index 39ce24e204b..655f48abdce 100644 --- a/fabric-rendering-v1/build.gradle +++ b/fabric-rendering-v1/build.gradle @@ -1,5 +1,9 @@ version = getSubprojectVersion(project) +loom { + accessWidenerPath = file("src/client/resources/fabric-rendering-v1.accesswidener") +} + moduleDependencies(project, [ ':fabric-api-base', ':fabric-transitive-access-wideners-v1', diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java new file mode 100644 index 00000000000..b4a224193bb --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.rendering.v1.advancement; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.Nullable; + +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.advancements.DisplayInfo; +import net.minecraft.client.gui.GuiGraphics; + +@ApiStatus.NonExtendable +public interface AbstractAdvancementRenderContext { + /** + * The graphics instance used for rendering. + * @return {@link GuiGraphics} instance + */ + GuiGraphics graphics(); + + /** + * The holder for the advancement. + * @return {@link AdvancementHolder} instance + */ + AdvancementHolder holder(); + + /** + * @return The advancement's progress, or {@code null} if there is no progress. + */ + @Nullable + AdvancementProgress progress(); + + default Advancement advancement() { + return holder().value(); + } + + default DisplayInfo display() { + return advancement().display().orElseThrow(); + } + + /** + * @return {@code true} if the advancement has been obtained. + */ + default boolean isObtained() { + AdvancementProgress progress = progress(); + return progress != null && progress.getPercent() >= 1; + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java new file mode 100644 index 00000000000..c93b2bf7c95 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.rendering.v1.advancement; + +import org.jetbrains.annotations.ApiStatus; + +import net.minecraft.client.gui.navigation.ScreenRectangle; + +@ApiStatus.NonExtendable +public interface AdvancementBackgroundRenderContext extends AbstractAdvancementRenderContext { + /** + * @return the {@link ScreenRectangle} that the background is contained within. + * @apiNote use {@link ScreenRectangle#left()} and {@link ScreenRectangle#top()} for the starting coordinates of the background. + */ + ScreenRectangle bounds(); + + /** + * @return the background's x scroll offset. + */ + double scrollX(); + + /** + * @return the background's y scroll offset. + */ + double scrollY(); +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java new file mode 100644 index 00000000000..8d7cabaf6a7 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.rendering.v1.advancement; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.NonExtendable +public interface AdvancementFrameRenderContext extends AbstractAdvancementRenderContext { + /** + * @return The x coordinate of the frame's top-left corner. + */ + int x(); + + /** + * @return The y coordinate of the frame's top-left corner. + */ + int y(); + + /** + * @return {@code true} if the mouse is hovered over the frame. + */ + boolean isHovered(); +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java new file mode 100644 index 00000000000..97f3a5bc859 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.rendering.v1.advancement; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.NonExtendable +public interface AdvancementIconRenderContext extends AbstractAdvancementRenderContext { + /** + * @return The x coordinate of the icon's top-left corner. + */ + int x(); + + /** + * @return The y coordinate of the icon's top-left corner. + */ + int y(); + + /** + * @return {@code true} if the mouse is hovered over the icon. + */ + boolean isHovered(); + + /** + * @return {@code true} if the icon is rendered as a selected tab. + */ + boolean isSelected(); +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java new file mode 100644 index 00000000000..482f943f5ae --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.api.client.rendering.v1.advancement; + +import net.minecraft.resources.Identifier; + +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; + +/** + * Advancement renderers allow for custom advancement icons, frames, and backgrounds + * which render in the {@link net.minecraft.client.gui.screens.advancements.AdvancementsScreen advancements screen} + * and {@link net.minecraft.client.gui.components.toasts.AdvancementToast advancement toasts}. + */ +public final class AdvancementRenderer { + /** + * Registers an {@link IconRenderer} for advancement icons that show on advancement widgets, tabs, and toasts. + * @param iconRenderer the icon renderer + * @param advancementIds identifiers of the advancements + * @throws IllegalArgumentException if an advancement already has a registered icon renderer + * @throws NullPointerException if either an advancement id or the icon renderer is null + */ + public static void registerIcon(IconRenderer iconRenderer, Identifier... advancementIds) { + AdvancementRendererRegistryImpl.registerIcon(iconRenderer, advancementIds); + } + + /** + * Registers a {@link FrameRenderer} for advancement frames that show on advancement widgets. + * @param frameRenderer the frame renderer + * @param advancementIds identifiers of the advancements + * @throws IllegalArgumentException if an advancement already has a registered frame renderer + * @throws NullPointerException if either an advancement id or the frame renderer is null + */ + public static void registerFrame(FrameRenderer frameRenderer, Identifier... advancementIds) { + AdvancementRendererRegistryImpl.registerFrame(frameRenderer, advancementIds); + } + + /** + * Registers a {@link BackgroundRenderer} for the backgrounds of advancement tabs. + * + *

Only root advancements render their backgrounds. + * @param backgroundRenderer the frame renderer + * @param advancementIds identifiers of the advancements + * @throws IllegalArgumentException if an advancement already has a registered background renderer + * @throws NullPointerException if either an advancement id or the background renderer is null + */ + public static void registerBackground(BackgroundRenderer backgroundRenderer, Identifier... advancementIds) { + AdvancementRendererRegistryImpl.registerBackground(backgroundRenderer, advancementIds); + } + + @FunctionalInterface + public interface IconRenderer { + void renderAdvancementIcon(AdvancementIconRenderContext context); + + /** + * @return {@code true} if the original advancement icon should render alongside this icon renderer. + */ + default boolean shouldRenderOriginalIcon() { + return false; + } + } + + @FunctionalInterface + public interface FrameRenderer { + void renderAdvancementFrame(AdvancementFrameRenderContext context); + + /** + * @return {@code true} if the original advancement frame should render alongside this frame renderer. + */ + default boolean shouldRenderOriginalFrame() { + return false; + } + + /** + * @return {@code true} if the tooltip of a hovered advancement widget should render. + */ + default boolean shouldRenderTooltip() { + return true; + } + } + + @FunctionalInterface + public interface BackgroundRenderer { + void renderAdvancementBackground(AdvancementBackgroundRenderContext context); + + /** + * @return {@code true} if the original advancement background should render alongside this background renderer. + */ + default boolean shouldRenderOriginalBackground() { + return false; + } + } + + private AdvancementRenderer() { + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java new file mode 100644 index 00000000000..ef2598f591f --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.rendering.advancement; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementBackgroundRenderContext; + +public record AdvancementBackgroundRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, ScreenRectangle bounds, double scrollX, double scrollY) implements AdvancementBackgroundRenderContext { +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java new file mode 100644 index 00000000000..71606118749 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.rendering.advancement; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.GuiGraphics; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementFrameRenderContext; + +public record AdvancementFrameRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean isHovered) implements AdvancementFrameRenderContext { +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java new file mode 100644 index 00000000000..8739f37be11 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.rendering.advancement; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.GuiGraphics; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementIconRenderContext; + +public final class AdvancementIconRenderContextImpl implements AdvancementIconRenderContext { + private final GuiGraphics graphics; + private final AdvancementHolder holder; + @Nullable + private final AdvancementProgress progress; + private int x; + private int y; + private final boolean hovered; + private final boolean selected; + + public AdvancementIconRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean hovered, boolean selected) { + this.graphics = graphics; + this.holder = holder; + this.progress = progress; + this.x = x; + this.y = y; + this.hovered = hovered; + this.selected = selected; + } + + public AdvancementIconRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, boolean hovered, boolean selected) { + this(graphics, holder, progress, 0, 0, hovered, selected); + } + + @Override + public GuiGraphics graphics() { + return graphics; + } + + @Override + public AdvancementHolder holder() { + return holder; + } + + @Override + public @Nullable AdvancementProgress progress() { + return progress; + } + + @Override + public int x() { + return x; + } + + @Override + public int y() { + return y; + } + + @Override + public boolean isHovered() { + return hovered; + } + + @Override + public boolean isSelected() { + return selected; + } + + public void setPos(int x, int y) { + this.x = x; + this.y = y; + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java new file mode 100644 index 00000000000..89d71566491 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.rendering.advancement; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.resources.Identifier; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; + +public final class AdvancementRendererRegistryImpl { + public static final ScopedValue TAB_ICON_RENDER_CONTEXT = ScopedValue.newInstance(); + private static final Map ICONS = new HashMap<>(); + private static final Map FRAMES = new HashMap<>(); + private static final Map BACKGROUNDS = new HashMap<>(); + + public static void registerIcon(AdvancementRenderer.IconRenderer iconRenderer, Identifier... advancementIds) { + registerRenderer("Icon", ICONS, iconRenderer, advancementIds); + } + + public static void registerFrame(AdvancementRenderer.FrameRenderer frameRenderer, Identifier... advancementIds) { + registerRenderer("Frame", FRAMES, frameRenderer, advancementIds); + } + + public static void registerBackground(AdvancementRenderer.BackgroundRenderer backgroundRenderer, Identifier... advancementIds) { + registerRenderer("Background", BACKGROUNDS, backgroundRenderer, advancementIds); + } + + public static AdvancementRenderer.@Nullable IconRenderer getIconRenderer(Identifier advancementId) { + return ICONS.get(advancementId); + } + + public static AdvancementRenderer.@Nullable FrameRenderer getFrameRenderer(Identifier advancementId) { + return FRAMES.get(advancementId); + } + + public static AdvancementRenderer.@Nullable BackgroundRenderer getBackgroundRenderer(Identifier advancementId) { + return BACKGROUNDS.get(advancementId); + } + + private static void registerRenderer(String type, Map renderers, T renderer, Identifier... advancementIds) { + Objects.requireNonNull(renderers, type + " renderer is null"); + + if (advancementIds.length == 0) { + throw new IllegalArgumentException(type + "advancement renderer registered for no advancements"); + } + + for (Identifier advancementId : advancementIds) { + Objects.requireNonNull(advancementId, "advancement id is null"); + + if (renderers.putIfAbsent(advancementId, renderer) != null) { + throw new IllegalArgumentException(type + "advancement renderer already exists for " + advancementId); + } + } + } + + private AdvancementRendererRegistryImpl() { + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java new file mode 100644 index 00000000000..eccc266c046 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.gui.screens.advancements.AdvancementTab; +import net.minecraft.client.gui.screens.advancements.AdvancementWidget; + +@Mixin(AdvancementTab.class) +public interface AdvancementTabAccessor { + @Accessor("root") + AdvancementWidget fabric$root(); +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java new file mode 100644 index 00000000000..d34a7a71808 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementNode; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.screens.advancements.AdvancementTab; +import net.minecraft.client.gui.screens.advancements.AdvancementTabType; +import net.minecraft.client.gui.screens.advancements.AdvancementWidget; +import net.minecraft.world.item.ItemStack; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementBackgroundRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; + +@Mixin(AdvancementTab.class) +abstract class AdvancementTabMixin { + @Shadow + @Final + private AdvancementNode rootNode; + + @Shadow + private double scrollX; + + @Shadow + private double scrollY; + + @Shadow + @Final + private AdvancementWidget root; + + @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementTabType;drawIcon(Lnet/minecraft/client/gui/GuiGraphics;IIILnet/minecraft/world/item/ItemStack;)V")) + private void wrapDrawIcon(AdvancementTabType type, GuiGraphics graphics, int xo, int yo, int index, ItemStack icon, Operation original) { + if (AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.isBound()) { + final AdvancementIconRenderContextImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); + ScopedValue.where(AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, context) + .call(() -> original.call(type, graphics, xo, yo, index, icon)); + } else { + original.call(type, graphics, xo, yo, index, icon); + } + } + + @WrapOperation(method = "drawContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;enableScissor(IIII)V")) + private void captureWindowSize(GuiGraphics graphics, int x0, int y0, int x1, int y1, Operation original, @Share("bounds") LocalRef bounds) { + bounds.set(new ScreenRectangle(0, 0, x1 - x0, y1 - y0)); + original.call(graphics, x0, y0, x1, y1); + } + + @ModifyExpressionValue(method = "drawContents", at = @At(value = "CONSTANT", args = "intValue=-1", ordinal = 0)) + private int preBackgroundRender(int original, @Share("backgroundRenderer") LocalRef backgroundRenderer) { + AdvancementHolder holder = rootNode.holder(); + backgroundRenderer.set(AdvancementRendererRegistryImpl.getBackgroundRenderer(holder.id())); + return backgroundRenderer.get() == null || backgroundRenderer.get().shouldRenderOriginalBackground() ? original : Integer.MAX_VALUE; + } + + @Inject(method = "drawContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementWidget;drawConnectivity(Lnet/minecraft/client/gui/GuiGraphics;IIZ)V", ordinal = 0)) + private void renderAdvancementBackground(GuiGraphics graphics, int windowLeft, int windowTop, CallbackInfo ci, @Share("backgroundRenderer") LocalRef backgroundRenderer, @Share("bounds") LocalRef bounds) { + if (backgroundRenderer.get() != null) { + AdvancementProgress progress = ((AdvancementWidgetAccessor) root).fabric$progress(); + backgroundRenderer.get().renderAdvancementBackground( + new AdvancementBackgroundRenderContextImpl(graphics, rootNode.holder(), progress, bounds.get(), scrollX, scrollY) + ); + } + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java new file mode 100644 index 00000000000..016b377351c --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.ItemStack; +import net.minecraft.client.gui.screens.advancements.AdvancementTabType; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; + +@Mixin(AdvancementTabType.class) +abstract class AdvancementTabTypeMixin { + @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) + private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { + if (AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.isBound()) { + final AdvancementIconRenderContextImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); + context.setPos(x, y); + AdvancementRenderer.IconRenderer iconRenderer = AdvancementRendererRegistryImpl.getIconRenderer(context.holder().id()); + + if (iconRenderer.shouldRenderOriginalIcon()) { + original.call(graphics, icon, x, y); + } + + iconRenderer.renderAdvancementIcon(context); + } else { + original.call(graphics, icon, x, y); + } + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java new file mode 100644 index 00000000000..da8cde3647c --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.toasts.AdvancementToast; +import net.minecraft.client.multiplayer.ClientAdvancements; +import net.minecraft.world.item.ItemStack; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; + +@Mixin(AdvancementToast.class) +abstract class AdvancementToastMixin { + @Shadow + @Final + private AdvancementHolder advancement; + + @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) + private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { + AdvancementRenderer.IconRenderer iconRenderer = AdvancementRendererRegistryImpl.getIconRenderer(advancement.id()); + + if (iconRenderer == null || iconRenderer.shouldRenderOriginalIcon()) { + original.call(graphics, icon, x, y); + } + + if (iconRenderer != null) { + ClientAdvancements advancements = Minecraft.getInstance().getConnection().getAdvancements(); + AdvancementProgress progress = ((ClientAdvancementsAccessor) advancements).fabric$progress().get(advancement); + iconRenderer.renderAdvancementIcon(new AdvancementIconRenderContextImpl(graphics, advancement, progress, x, y, false, false)); + } + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java new file mode 100644 index 00000000000..5a6e9044d43 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.screens.advancements.AdvancementWidget; + +@Mixin(AdvancementWidget.class) +public interface AdvancementWidgetAccessor { + @Accessor("progress") + @Nullable AdvancementProgress fabric$progress(); +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java new file mode 100644 index 00000000000..cf86e695105 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import java.util.List; + +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import org.jspecify.annotations.Nullable; +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.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.advancements.AdvancementNode; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.advancements.AdvancementWidget; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.item.ItemStack; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementFrameRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; + +@Mixin(AdvancementWidget.class) +abstract class AdvancementWidgetMixin { + @Shadow + @Final + private AdvancementNode advancementNode; + + @Shadow + private @Nullable AdvancementProgress progress; + + @WrapOperation(method = "draw", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) + private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { + renderAdvancementIcon(graphics, x, y, false, () -> original.call(graphics, icon, x, y)); + } + + @WrapOperation(method = "drawHover", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) + private void renderAdvancementIconHover(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { + renderAdvancementIcon(graphics, x, y, true, () -> original.call(graphics, icon, x, y)); + } + + @Unique + private void renderAdvancementIcon(GuiGraphics graphics, int x, int y, boolean hovered, Runnable original) { + AdvancementRenderer.IconRenderer iconRenderer = AdvancementRendererRegistryImpl.getIconRenderer(advancementNode.holder().id()); + + if (iconRenderer == null || iconRenderer.shouldRenderOriginalIcon()) { + original.run(); + } + + if (iconRenderer != null) { + iconRenderer.renderAdvancementIcon(new AdvancementIconRenderContextImpl(graphics, advancementNode.holder(), progress, x, y, hovered, false)); + } + } + + @WrapOperation(method = "draw", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blitSprite(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIII)V")) + private void renderAdvancementFrame(GuiGraphics graphics, RenderPipeline renderPipeline, Identifier location, int x, int y, int width, int height, Operation original) { + renderAdvancementFrame(graphics, x, y, false, () -> original.call(graphics, renderPipeline, location, x, y, width, height)); + } + + @WrapOperation(method = "drawHover", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blitSprite(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIII)V", ordinal = 3)) + private void renderAdvancementFrameHover(GuiGraphics graphics, RenderPipeline renderPipeline, Identifier location, int x, int y, int width, int height, Operation original) { + renderAdvancementFrame(graphics, x, y, true, () -> original.call(graphics, renderPipeline, location, x, y, width, height)); + } + + @Unique + private void renderAdvancementFrame(GuiGraphics graphics, int x, int y, boolean hovered, Runnable original) { + AdvancementRenderer.FrameRenderer frameRenderer = AdvancementRendererRegistryImpl.getFrameRenderer(advancementNode.holder().id()); + + if (frameRenderer == null || frameRenderer.shouldRenderOriginalFrame()) { + original.run(); + } + + if (frameRenderer != null) { + frameRenderer.renderAdvancementFrame(new AdvancementFrameRenderContextImpl(graphics, advancementNode.holder(), progress, x, y, hovered)); + } + } + + @Inject(method = "drawHover", at = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z")) + private void captureRenderTooltip(GuiGraphics graphics, int xo, int yo, float fade, int screenxo, int screenyo, CallbackInfo ci, @Share("renderTooltip")LocalBooleanRef renderTooltip) { + AdvancementRenderer.FrameRenderer frameRenderer = AdvancementRendererRegistryImpl.getFrameRenderer(advancementNode.holder().id()); + renderTooltip.set(frameRenderer == null || frameRenderer.shouldRenderTooltip()); + } + + @WrapWithCondition(method = "drawHover", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementWidget;drawMultilineText(Lnet/minecraft/client/gui/GuiGraphics;Ljava/util/List;III)V")) + private boolean cancelTooltipMultilineTextRendering(AdvancementWidget widget, GuiGraphics graphics, List lines, int x, int y, int color, @Share("renderTooltip")LocalBooleanRef renderTooltip) { + return renderTooltip.get(); + } + + @WrapWithCondition(method = "drawHover", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;drawString(Lnet/minecraft/client/gui/Font;Lnet/minecraft/network/chat/Component;III)V")) + private boolean cancelTooltipStringRendering(GuiGraphics graphics, Font font, Component str, int x, int y, int color, @Share("renderTooltip") LocalBooleanRef renderTooltip) { + return renderTooltip.get(); + } + + @WrapWithCondition(method = "drawHover", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blitSprite(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIIIIIII)V")) + private boolean cancelTooltipTitleBarRendering(GuiGraphics graphics, RenderPipeline renderPipeline, Identifier location, int spriteWidth, int spriteHeight, int textureX, int textureY, int x, int y, int width, int height, @Share("renderTooltip") LocalBooleanRef renderTooltip) { + return renderTooltip.get(); + } + + @WrapWithCondition(method = "drawHover", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blitSprite(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIII)V"), + slice = @Slice(from = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z"), to = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;blitSprite(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIII)V", ordinal = 2)) + ) + private boolean cancelTooltipTitleBoxRendering(GuiGraphics graphics, RenderPipeline renderPipeline, Identifier location, int x, int y, int width, int height, @Share("renderTooltip") LocalBooleanRef renderTooltip) { + return renderTooltip.get(); + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java new file mode 100644 index 00000000000..dce902490c8 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.advancements.AdvancementTab; +import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; + +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; + +@Mixin(AdvancementsScreen.class) +abstract class AdvancementsScreenMixin { + @Shadow + private @Nullable AdvancementTab selectedTab; + + @WrapOperation(method = "renderWindow", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementTab;drawIcon(Lnet/minecraft/client/gui/GuiGraphics;II)V")) + private void wrapDrawIcon(AdvancementTab tab, GuiGraphics graphics, int xo, int yo, Operation original, @Local(argsOnly = true, ordinal = 2) int mouseX, @Local(argsOnly = true, ordinal = 3) int mouseY) { + AdvancementHolder holder = tab.getRootNode().holder(); + + if (AdvancementRendererRegistryImpl.getIconRenderer(holder.id()) != null) { + boolean hovered = tab.isMouseOver(xo, yo, mouseX, mouseY); + boolean selected = selectedTab == tab; + AdvancementProgress progress = ((AdvancementWidgetAccessor) ((AdvancementTabAccessor) tab).fabric$root()).fabric$progress(); + ScopedValue.where( + AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, + new AdvancementIconRenderContextImpl(graphics, holder, progress, hovered, selected) + ).call(() -> original.call(tab, graphics, xo, yo)); + } else { + original.call(tab, graphics, xo, yo); + } + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java new file mode 100644 index 00000000000..4c0c0086a30 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.client.rendering.advancement; + +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.multiplayer.ClientAdvancements; + +@Mixin(ClientAdvancements.class) +public interface ClientAdvancementsAccessor { + @Accessor("progress") + Map fabric$progress(); +} diff --git a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener new file mode 100644 index 00000000000..5aa680f3dce --- /dev/null +++ b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 official +accessible class net/minecraft/client/gui/screens/advancements/AdvancementTabType diff --git a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json index a09d8eb3ffd..bed1dc4a57a 100644 --- a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json +++ b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.mixins.json @@ -35,6 +35,14 @@ "SpecialModelRenderersMixin", "ClientTooltipComponentMixin", "LevelRendererMixin", + "advancement.AdvancementsScreenMixin", + "advancement.AdvancementTabAccessor", + "advancement.AdvancementTabMixin", + "advancement.AdvancementTabTypeMixin", + "advancement.AdvancementToastMixin", + "advancement.AdvancementWidgetAccessor", + "advancement.AdvancementWidgetMixin", + "advancement.ClientAdvancementsAccessor", "renderstate.ItemStackRenderStateLayerRenderStateMixin", "renderstate.ItemStackRenderStateMixin", "renderstate.SkyRenderStateMixin", diff --git a/fabric-rendering-v1/src/client/resources/fabric.mod.json b/fabric-rendering-v1/src/client/resources/fabric.mod.json index 83a5ababb67..4320704c86f 100644 --- a/fabric-rendering-v1/src/client/resources/fabric.mod.json +++ b/fabric-rendering-v1/src/client/resources/fabric.mod.json @@ -29,6 +29,7 @@ "mixins": [ "fabric-rendering-v1.mixins.json" ], + "accessWidener": "fabric-rendering-v1.accesswidener", "custom": { "fabric-api:module-lifecycle": "stable", "loom:injected_interfaces": { diff --git a/fabric-rendering-v1/src/testmod/resources/fabric.mod.json b/fabric-rendering-v1/src/testmod/resources/fabric.mod.json index dd2a5b6f01a..55f98104ad5 100644 --- a/fabric-rendering-v1/src/testmod/resources/fabric.mod.json +++ b/fabric-rendering-v1/src/testmod/resources/fabric.mod.json @@ -13,6 +13,7 @@ "net.fabricmc.fabric.test.rendering.TooltipComponentTestInit" ], "client": [ + "net.fabricmc.fabric.test.rendering.client.AdvancementRenderingTests", "net.fabricmc.fabric.test.rendering.client.ArmorRenderingTests", "net.fabricmc.fabric.test.rendering.client.CustomSpriteSourcesTest", "net.fabricmc.fabric.test.rendering.client.CustomColorResolverTest", diff --git a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java new file mode 100644 index 00000000000..76db41ff65b --- /dev/null +++ b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.test.rendering.client; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.resources.Identifier; +import net.minecraft.util.CommonColors; +import net.minecraft.util.Mth; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementBackgroundRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementFrameRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementIconRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; + +public class AdvancementRenderingTests implements ClientModInitializer { + @Override + public void onInitializeClient() { + AdvancementRenderer.registerIcon(new StoryRootIconRenderer(), Identifier.withDefaultNamespace("story/root")); + AdvancementRenderer.registerBackground(new StoryBackgroundRenderer(), Identifier.withDefaultNamespace("story/root")); + AdvancementRenderer.registerFrame(new MineDiamondFrameRenderer(), Identifier.withDefaultNamespace("story/mine_diamond")); + } + + static class StoryRootIconRenderer implements AdvancementRenderer.IconRenderer { + @Override + public void renderAdvancementIcon(AdvancementIconRenderContext context) { + if (context.isHovered()) { + context.graphics().drawString(Minecraft.getInstance().font, "hovered", context.x(), context.y(), -1); + } + + if (context.isSelected()) { + context.graphics().drawString(Minecraft.getInstance().font, "selected", context.x(), context.y() + 9, -1); + } + } + + @Override + public boolean shouldRenderOriginalIcon() { + return true; + } + } + + static class StoryBackgroundRenderer implements AdvancementRenderer.BackgroundRenderer { + private static final Identifier BACKGROUND = Identifier.withDefaultNamespace("textures/painting/unpacked.png"); + + @Override + public void renderAdvancementBackground(AdvancementBackgroundRenderContext context) { + ScreenRectangle bounds = context.bounds(); + context.graphics().blit(RenderPipelines.GUI_TEXTURED, BACKGROUND, bounds.left(), bounds.top(), 1 - Mth.floor(context.scrollX()), 3 - Mth.floor(context.scrollY()), bounds.width(), bounds.height(), 64, 64); + } + } + + static class MineDiamondFrameRenderer implements AdvancementRenderer.FrameRenderer { + @Override + public void renderAdvancementFrame(AdvancementFrameRenderContext context) { + int x = context.x(); + int y = context.y(); + context.graphics().fill(x, y, x + 26, y + 26, context.isObtained() ? CommonColors.GREEN : CommonColors.RED); + + if (context.isHovered()) { + context.graphics().drawString(Minecraft.getInstance().font, "hovered", context.x(), context.y(), -1); + } + } + + @Override + public boolean shouldRenderTooltip() { + return false; + } + } +} From 50429ef3ad4ed11462572090f64e5bd255355fdd Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 16:26:17 -0500 Subject: [PATCH 2/8] Fix import ordering --- .../mixin/client/rendering/advancement/AdvancementTabMixin.java | 2 +- .../client/rendering/advancement/AdvancementTabTypeMixin.java | 2 +- .../client/rendering/advancement/AdvancementToastMixin.java | 2 +- .../client/rendering/advancement/AdvancementWidgetMixin.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java index d34a7a71808..976e6089c19 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java @@ -28,9 +28,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.advancements.AdvancementProgress; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementNode; +import net.minecraft.advancements.AdvancementProgress; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.advancements.AdvancementTab; diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java index 016b377351c..acbccf063d5 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java @@ -22,8 +22,8 @@ import org.spongepowered.asm.mixin.injection.At; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.world.item.ItemStack; import net.minecraft.client.gui.screens.advancements.AdvancementTabType; +import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java index da8cde3647c..d9e3dd81e5d 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java @@ -32,8 +32,8 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementToast.class) abstract class AdvancementToastMixin { diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java index cf86e695105..fb2c12f5495 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java @@ -45,8 +45,8 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementFrameRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementWidget.class) From c1d93f64ac3da63129caa08f23c9fdf8df49da2d Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 19:05:56 -0500 Subject: [PATCH 3/8] Move context classes into inner classes --- .../AdvancementBackgroundRenderContext.java | 40 ------- .../AdvancementFrameRenderContext.java | 37 ------- .../AdvancementIconRenderContext.java | 42 -------- ...ext.java => AdvancementRenderContext.java} | 71 +++++++++++- .../v1/advancement/AdvancementRenderer.java | 6 +- ...dvancementBackgroundRenderContextImpl.java | 29 ----- .../AdvancementFrameRenderContextImpl.java | 28 ----- .../AdvancementIconRenderContextImpl.java | 90 ---------------- .../AdvancementRenderContextImpl.java | 102 ++++++++++++++++++ .../AdvancementRendererRegistryImpl.java | 2 +- .../advancement/AdvancementTabMixin.java | 7 +- .../advancement/AdvancementTabTypeMixin.java | 4 +- .../advancement/AdvancementToastMixin.java | 4 +- .../advancement/AdvancementWidgetMixin.java | 7 +- .../advancement/AdvancementsScreenMixin.java | 4 +- .../client/AdvancementRenderingTests.java | 10 +- 16 files changed, 192 insertions(+), 291 deletions(-) delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java rename fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/{AbstractAdvancementRenderContext.java => AdvancementRenderContext.java} (50%) delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java delete mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java create mode 100644 fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRenderContextImpl.java diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java deleted file mode 100644 index c93b2bf7c95..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementBackgroundRenderContext.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.api.client.rendering.v1.advancement; - -import org.jetbrains.annotations.ApiStatus; - -import net.minecraft.client.gui.navigation.ScreenRectangle; - -@ApiStatus.NonExtendable -public interface AdvancementBackgroundRenderContext extends AbstractAdvancementRenderContext { - /** - * @return the {@link ScreenRectangle} that the background is contained within. - * @apiNote use {@link ScreenRectangle#left()} and {@link ScreenRectangle#top()} for the starting coordinates of the background. - */ - ScreenRectangle bounds(); - - /** - * @return the background's x scroll offset. - */ - double scrollX(); - - /** - * @return the background's y scroll offset. - */ - double scrollY(); -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java deleted file mode 100644 index 8d7cabaf6a7..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementFrameRenderContext.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.api.client.rendering.v1.advancement; - -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.NonExtendable -public interface AdvancementFrameRenderContext extends AbstractAdvancementRenderContext { - /** - * @return The x coordinate of the frame's top-left corner. - */ - int x(); - - /** - * @return The y coordinate of the frame's top-left corner. - */ - int y(); - - /** - * @return {@code true} if the mouse is hovered over the frame. - */ - boolean isHovered(); -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java deleted file mode 100644 index 97f3a5bc859..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementIconRenderContext.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.api.client.rendering.v1.advancement; - -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.NonExtendable -public interface AdvancementIconRenderContext extends AbstractAdvancementRenderContext { - /** - * @return The x coordinate of the icon's top-left corner. - */ - int x(); - - /** - * @return The y coordinate of the icon's top-left corner. - */ - int y(); - - /** - * @return {@code true} if the mouse is hovered over the icon. - */ - boolean isHovered(); - - /** - * @return {@code true} if the icon is rendered as a selected tab. - */ - boolean isSelected(); -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderContext.java similarity index 50% rename from fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java rename to fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderContext.java index b4a224193bb..1b48bbff6d8 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AbstractAdvancementRenderContext.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderContext.java @@ -24,9 +24,10 @@ import net.minecraft.advancements.AdvancementProgress; import net.minecraft.advancements.DisplayInfo; import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; @ApiStatus.NonExtendable -public interface AbstractAdvancementRenderContext { +public sealed interface AdvancementRenderContext permits AdvancementRenderContext.Icon, AdvancementRenderContext.Frame, AdvancementRenderContext.Background { /** * The graphics instance used for rendering. * @return {@link GuiGraphics} instance @@ -45,10 +46,18 @@ public interface AbstractAdvancementRenderContext { @Nullable AdvancementProgress progress(); + /** + * The advancement being rendered. + * @return {@link Advancement} instance + */ default Advancement advancement() { return holder().value(); } + /** + * The display info of the advancement. + * @return {@link DisplayInfo} instance + */ default DisplayInfo display() { return advancement().display().orElseThrow(); } @@ -60,4 +69,64 @@ default boolean isObtained() { AdvancementProgress progress = progress(); return progress != null && progress.getPercent() >= 1; } + + @ApiStatus.NonExtendable + non-sealed interface Icon extends AdvancementRenderContext { + /** + * @return The x coordinate of the icon's top-left corner. + */ + int x(); + + /** + * @return The y coordinate of the icon's top-left corner. + */ + int y(); + + /** + * @return {@code true} if the mouse is hovered over the icon. + */ + boolean isHovered(); + + /** + * @return {@code true} if the icon is rendered as a selected tab. + */ + boolean isSelected(); + } + + @ApiStatus.NonExtendable + non-sealed interface Frame extends AdvancementRenderContext { + /** + * @return The x coordinate of the frame's top-left corner. + */ + int x(); + + /** + * @return The y coordinate of the frame's top-left corner. + */ + int y(); + + /** + * @return {@code true} if the mouse is hovered over the frame. + */ + boolean isHovered(); + } + + @ApiStatus.NonExtendable + non-sealed interface Background extends AdvancementRenderContext { + /** + * @return the {@link ScreenRectangle} that the background is contained within. + * @apiNote use {@link ScreenRectangle#left()} and {@link ScreenRectangle#top()} for the starting coordinates of the background. + */ + ScreenRectangle bounds(); + + /** + * @return the background's x scroll offset. + */ + double scrollX(); + + /** + * @return the background's y scroll offset. + */ + double scrollY(); + } } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java index 482f943f5ae..6cbeaeae174 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java @@ -63,7 +63,7 @@ public static void registerBackground(BackgroundRenderer backgroundRenderer, Ide @FunctionalInterface public interface IconRenderer { - void renderAdvancementIcon(AdvancementIconRenderContext context); + void renderAdvancementIcon(AdvancementRenderContext.Icon context); /** * @return {@code true} if the original advancement icon should render alongside this icon renderer. @@ -75,7 +75,7 @@ default boolean shouldRenderOriginalIcon() { @FunctionalInterface public interface FrameRenderer { - void renderAdvancementFrame(AdvancementFrameRenderContext context); + void renderAdvancementFrame(AdvancementRenderContext.Frame context); /** * @return {@code true} if the original advancement frame should render alongside this frame renderer. @@ -94,7 +94,7 @@ default boolean shouldRenderTooltip() { @FunctionalInterface public interface BackgroundRenderer { - void renderAdvancementBackground(AdvancementBackgroundRenderContext context); + void renderAdvancementBackground(AdvancementRenderContext.Background context); /** * @return {@code true} if the original advancement background should render alongside this background renderer. diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java deleted file mode 100644 index ef2598f591f..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementBackgroundRenderContextImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.impl.client.rendering.advancement; - -import org.jspecify.annotations.Nullable; - -import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.advancements.AdvancementProgress; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.navigation.ScreenRectangle; - -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementBackgroundRenderContext; - -public record AdvancementBackgroundRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, ScreenRectangle bounds, double scrollX, double scrollY) implements AdvancementBackgroundRenderContext { -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java deleted file mode 100644 index 71606118749..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementFrameRenderContextImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.impl.client.rendering.advancement; - -import org.jspecify.annotations.Nullable; - -import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.advancements.AdvancementProgress; -import net.minecraft.client.gui.GuiGraphics; - -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementFrameRenderContext; - -public record AdvancementFrameRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean isHovered) implements AdvancementFrameRenderContext { -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java deleted file mode 100644 index 8739f37be11..00000000000 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementIconRenderContextImpl.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.impl.client.rendering.advancement; - -import org.jspecify.annotations.Nullable; - -import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.advancements.AdvancementProgress; -import net.minecraft.client.gui.GuiGraphics; - -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementIconRenderContext; - -public final class AdvancementIconRenderContextImpl implements AdvancementIconRenderContext { - private final GuiGraphics graphics; - private final AdvancementHolder holder; - @Nullable - private final AdvancementProgress progress; - private int x; - private int y; - private final boolean hovered; - private final boolean selected; - - public AdvancementIconRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean hovered, boolean selected) { - this.graphics = graphics; - this.holder = holder; - this.progress = progress; - this.x = x; - this.y = y; - this.hovered = hovered; - this.selected = selected; - } - - public AdvancementIconRenderContextImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, boolean hovered, boolean selected) { - this(graphics, holder, progress, 0, 0, hovered, selected); - } - - @Override - public GuiGraphics graphics() { - return graphics; - } - - @Override - public AdvancementHolder holder() { - return holder; - } - - @Override - public @Nullable AdvancementProgress progress() { - return progress; - } - - @Override - public int x() { - return x; - } - - @Override - public int y() { - return y; - } - - @Override - public boolean isHovered() { - return hovered; - } - - @Override - public boolean isSelected() { - return selected; - } - - public void setPos(int x, int y) { - this.x = x; - this.y = y; - } -} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRenderContextImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRenderContextImpl.java new file mode 100644 index 00000000000..42222da2f32 --- /dev/null +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRenderContextImpl.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.impl.client.rendering.advancement; + +import org.jspecify.annotations.Nullable; + +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.advancements.AdvancementProgress; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; + +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderContext; + +public final class AdvancementRenderContextImpl { + public static final class IconImpl implements AdvancementRenderContext.Icon { + private final GuiGraphics graphics; + private final AdvancementHolder holder; + @Nullable + private final AdvancementProgress progress; + private int x; + private int y; + private final boolean hovered; + private final boolean selected; + + public IconImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean hovered, boolean selected) { + this.graphics = graphics; + this.holder = holder; + this.progress = progress; + this.x = x; + this.y = y; + this.hovered = hovered; + this.selected = selected; + } + + public IconImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, boolean hovered, boolean selected) { + this(graphics, holder, progress, 0, 0, hovered, selected); + } + + @Override + public GuiGraphics graphics() { + return graphics; + } + + @Override + public AdvancementHolder holder() { + return holder; + } + + @Override + public @Nullable AdvancementProgress progress() { + return progress; + } + + @Override + public int x() { + return x; + } + + @Override + public int y() { + return y; + } + + @Override + public boolean isHovered() { + return hovered; + } + + @Override + public boolean isSelected() { + return selected; + } + + public void setPos(int x, int y) { + this.x = x; + this.y = y; + } + } + + public record FrameImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, int x, int y, boolean isHovered) implements AdvancementRenderContext.Frame { + } + + public record BackgroundImpl(GuiGraphics graphics, AdvancementHolder holder, @Nullable AdvancementProgress progress, ScreenRectangle bounds, double scrollX, double scrollY) implements AdvancementRenderContext.Background { + } + + private AdvancementRenderContextImpl() { + } +} diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java index 89d71566491..255702bcd16 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java @@ -27,7 +27,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; public final class AdvancementRendererRegistryImpl { - public static final ScopedValue TAB_ICON_RENDER_CONTEXT = ScopedValue.newInstance(); + public static final ScopedValue TAB_ICON_RENDER_CONTEXT = ScopedValue.newInstance(); private static final Map ICONS = new HashMap<>(); private static final Map FRAMES = new HashMap<>(); private static final Map BACKGROUNDS = new HashMap<>(); diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java index 976e6089c19..3046854dc3e 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java @@ -39,8 +39,7 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementBackgroundRenderContextImpl; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementTab.class) @@ -62,7 +61,7 @@ abstract class AdvancementTabMixin { @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementTabType;drawIcon(Lnet/minecraft/client/gui/GuiGraphics;IIILnet/minecraft/world/item/ItemStack;)V")) private void wrapDrawIcon(AdvancementTabType type, GuiGraphics graphics, int xo, int yo, int index, ItemStack icon, Operation original) { if (AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.isBound()) { - final AdvancementIconRenderContextImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); + final AdvancementRenderContextImpl.IconImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); ScopedValue.where(AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, context) .call(() -> original.call(type, graphics, xo, yo, index, icon)); } else { @@ -88,7 +87,7 @@ private void renderAdvancementBackground(GuiGraphics graphics, int windowLeft, i if (backgroundRenderer.get() != null) { AdvancementProgress progress = ((AdvancementWidgetAccessor) root).fabric$progress(); backgroundRenderer.get().renderAdvancementBackground( - new AdvancementBackgroundRenderContextImpl(graphics, rootNode.holder(), progress, bounds.get(), scrollX, scrollY) + new AdvancementRenderContextImpl.BackgroundImpl(graphics, rootNode.holder(), progress, bounds.get(), scrollX, scrollY) ); } } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java index acbccf063d5..d2a12e3670a 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java @@ -26,7 +26,7 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementTabType.class) @@ -34,7 +34,7 @@ abstract class AdvancementTabTypeMixin { @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { if (AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.isBound()) { - final AdvancementIconRenderContextImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); + final AdvancementRenderContextImpl.IconImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); context.setPos(x, y); AdvancementRenderer.IconRenderer iconRenderer = AdvancementRendererRegistryImpl.getIconRenderer(context.holder().id()); diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java index d9e3dd81e5d..5886d96b9dc 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java @@ -32,7 +32,7 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementToast.class) @@ -52,7 +52,7 @@ private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, if (iconRenderer != null) { ClientAdvancements advancements = Minecraft.getInstance().getConnection().getAdvancements(); AdvancementProgress progress = ((ClientAdvancementsAccessor) advancements).fabric$progress().get(advancement); - iconRenderer.renderAdvancementIcon(new AdvancementIconRenderContextImpl(graphics, advancement, progress, x, y, false, false)); + iconRenderer.renderAdvancementIcon(new AdvancementRenderContextImpl.IconImpl(graphics, advancement, progress, x, y, false, false)); } } } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java index fb2c12f5495..0f093b8a7a3 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetMixin.java @@ -45,8 +45,7 @@ import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementFrameRenderContextImpl; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementWidget.class) @@ -77,7 +76,7 @@ private void renderAdvancementIcon(GuiGraphics graphics, int x, int y, boolean h } if (iconRenderer != null) { - iconRenderer.renderAdvancementIcon(new AdvancementIconRenderContextImpl(graphics, advancementNode.holder(), progress, x, y, hovered, false)); + iconRenderer.renderAdvancementIcon(new AdvancementRenderContextImpl.IconImpl(graphics, advancementNode.holder(), progress, x, y, hovered, false)); } } @@ -100,7 +99,7 @@ private void renderAdvancementFrame(GuiGraphics graphics, int x, int y, boolean } if (frameRenderer != null) { - frameRenderer.renderAdvancementFrame(new AdvancementFrameRenderContextImpl(graphics, advancementNode.holder(), progress, x, y, hovered)); + frameRenderer.renderAdvancementFrame(new AdvancementRenderContextImpl.FrameImpl(graphics, advancementNode.holder(), progress, x, y, hovered)); } } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java index dce902490c8..750808c2288 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java @@ -30,7 +30,7 @@ import net.minecraft.client.gui.screens.advancements.AdvancementTab; import net.minecraft.client.gui.screens.advancements.AdvancementsScreen; -import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementIconRenderContextImpl; +import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; @Mixin(AdvancementsScreen.class) @@ -48,7 +48,7 @@ private void wrapDrawIcon(AdvancementTab tab, GuiGraphics graphics, int xo, int AdvancementProgress progress = ((AdvancementWidgetAccessor) ((AdvancementTabAccessor) tab).fabric$root()).fabric$progress(); ScopedValue.where( AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, - new AdvancementIconRenderContextImpl(graphics, holder, progress, hovered, selected) + new AdvancementRenderContextImpl.IconImpl(graphics, holder, progress, hovered, selected) ).call(() -> original.call(tab, graphics, xo, yo)); } else { original.call(tab, graphics, xo, yo); diff --git a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java index 76db41ff65b..4418c092563 100644 --- a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java +++ b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/AdvancementRenderingTests.java @@ -24,9 +24,7 @@ import net.minecraft.util.Mth; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementBackgroundRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementFrameRenderContext; -import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementIconRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderContext; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; public class AdvancementRenderingTests implements ClientModInitializer { @@ -39,7 +37,7 @@ public void onInitializeClient() { static class StoryRootIconRenderer implements AdvancementRenderer.IconRenderer { @Override - public void renderAdvancementIcon(AdvancementIconRenderContext context) { + public void renderAdvancementIcon(AdvancementRenderContext.Icon context) { if (context.isHovered()) { context.graphics().drawString(Minecraft.getInstance().font, "hovered", context.x(), context.y(), -1); } @@ -59,7 +57,7 @@ static class StoryBackgroundRenderer implements AdvancementRenderer.BackgroundRe private static final Identifier BACKGROUND = Identifier.withDefaultNamespace("textures/painting/unpacked.png"); @Override - public void renderAdvancementBackground(AdvancementBackgroundRenderContext context) { + public void renderAdvancementBackground(AdvancementRenderContext.Background context) { ScreenRectangle bounds = context.bounds(); context.graphics().blit(RenderPipelines.GUI_TEXTURED, BACKGROUND, bounds.left(), bounds.top(), 1 - Mth.floor(context.scrollX()), 3 - Mth.floor(context.scrollY()), bounds.width(), bounds.height(), 64, 64); } @@ -67,7 +65,7 @@ public void renderAdvancementBackground(AdvancementBackgroundRenderContext conte static class MineDiamondFrameRenderer implements AdvancementRenderer.FrameRenderer { @Override - public void renderAdvancementFrame(AdvancementFrameRenderContext context) { + public void renderAdvancementFrame(AdvancementRenderContext.Frame context) { int x = context.x(); int y = context.y(); context.graphics().fill(x, y, x + 26, y + 26, context.isObtained() ? CommonColors.GREEN : CommonColors.RED); From d327bf1972d1356c0b42f3ca4c3e41334b377a21 Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 19:42:17 -0500 Subject: [PATCH 4/8] Add missing renderer javadocs --- .../v1/advancement/AdvancementRenderer.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java index 6cbeaeae174..c2c407285bf 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/advancement/AdvancementRenderer.java @@ -61,8 +61,19 @@ public static void registerBackground(BackgroundRenderer backgroundRenderer, Ide AdvancementRendererRegistryImpl.registerBackground(backgroundRenderer, advancementIds); } + /** + * Called after the icon (display item) of an advancement renders. + * + *

By default, the original icon does not render. + * To have it render, override {@link #shouldRenderOriginalIcon()} and return {@code true}. + */ @FunctionalInterface public interface IconRenderer { + /** + * @param context the context of the icon rendering, which has + * {@link net.minecraft.client.gui.GuiGraphics gui graphics} for rendering, + * the {@link net.minecraft.advancements.Advancement advancement} instance, and the icon's coordinates. + */ void renderAdvancementIcon(AdvancementRenderContext.Icon context); /** @@ -73,8 +84,22 @@ default boolean shouldRenderOriginalIcon() { } } + /** + * Called after the frame of an advancement renders. + * + *

By default, the original frame does not render. + * To have it render, override {@link #shouldRenderOriginalFrame()} and return {@code true}. + * + *

The tooltip which shows the advancement's name, description, and progress when hovered will render by default. + * To cancel its rendering, override {@link #shouldRenderTooltip()} and return {@code false}. + */ @FunctionalInterface public interface FrameRenderer { + /** + * @param context the context of the frame rendering, which has + * {@link net.minecraft.client.gui.GuiGraphics gui graphics} for rendering, + * the {@link net.minecraft.advancements.Advancement advancement} instance, and the frame's coordinates. + */ void renderAdvancementFrame(AdvancementRenderContext.Frame context); /** @@ -92,8 +117,20 @@ default boolean shouldRenderTooltip() { } } + /** + * Called after the background of an advancement tab renders. + * + *

By default, the original background does not render. + * To have it render, override {@link #shouldRenderOriginalBackground()} and return {@code true}. + */ @FunctionalInterface public interface BackgroundRenderer { + /** + * @param context the context of the frame rendering, which has + * {@link net.minecraft.client.gui.GuiGraphics gui graphics} for rendering, + * the {@link net.minecraft.advancements.Advancement advancement} instance, + * and the background's {@link net.minecraft.client.gui.navigation.ScreenRectangle bounds}. + */ void renderAdvancementBackground(AdvancementRenderContext.Background context); /** From cf1f23140525c8a68ad9f40ae9275f5d4cc0ef8b Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 21:38:58 -0500 Subject: [PATCH 5/8] Rename accessor methods --- .../client/rendering/advancement/AdvancementTabAccessor.java | 2 +- .../mixin/client/rendering/advancement/AdvancementTabMixin.java | 2 +- .../client/rendering/advancement/AdvancementToastMixin.java | 2 +- .../client/rendering/advancement/AdvancementWidgetAccessor.java | 2 +- .../client/rendering/advancement/AdvancementsScreenMixin.java | 2 +- .../rendering/advancement/ClientAdvancementsAccessor.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java index eccc266c046..69224503534 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabAccessor.java @@ -25,5 +25,5 @@ @Mixin(AdvancementTab.class) public interface AdvancementTabAccessor { @Accessor("root") - AdvancementWidget fabric$root(); + AdvancementWidget fabric_getRoot(); } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java index 3046854dc3e..7c5bc9591e6 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java @@ -85,7 +85,7 @@ private int preBackgroundRender(int original, @Share("backgroundRenderer") Local @Inject(method = "drawContents", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementWidget;drawConnectivity(Lnet/minecraft/client/gui/GuiGraphics;IIZ)V", ordinal = 0)) private void renderAdvancementBackground(GuiGraphics graphics, int windowLeft, int windowTop, CallbackInfo ci, @Share("backgroundRenderer") LocalRef backgroundRenderer, @Share("bounds") LocalRef bounds) { if (backgroundRenderer.get() != null) { - AdvancementProgress progress = ((AdvancementWidgetAccessor) root).fabric$progress(); + AdvancementProgress progress = ((AdvancementWidgetAccessor) root).fabric_getProgress(); backgroundRenderer.get().renderAdvancementBackground( new AdvancementRenderContextImpl.BackgroundImpl(graphics, rootNode.holder(), progress, bounds.get(), scrollX, scrollY) ); diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java index 5886d96b9dc..b84df91c390 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementToastMixin.java @@ -51,7 +51,7 @@ private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, if (iconRenderer != null) { ClientAdvancements advancements = Minecraft.getInstance().getConnection().getAdvancements(); - AdvancementProgress progress = ((ClientAdvancementsAccessor) advancements).fabric$progress().get(advancement); + AdvancementProgress progress = ((ClientAdvancementsAccessor) advancements).fabric_getProgress().get(advancement); iconRenderer.renderAdvancementIcon(new AdvancementRenderContextImpl.IconImpl(graphics, advancement, progress, x, y, false, false)); } } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java index 5a6e9044d43..73ff0670d87 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementWidgetAccessor.java @@ -26,5 +26,5 @@ @Mixin(AdvancementWidget.class) public interface AdvancementWidgetAccessor { @Accessor("progress") - @Nullable AdvancementProgress fabric$progress(); + @Nullable AdvancementProgress fabric_getProgress(); } diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java index 750808c2288..94e92481985 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java @@ -45,7 +45,7 @@ private void wrapDrawIcon(AdvancementTab tab, GuiGraphics graphics, int xo, int if (AdvancementRendererRegistryImpl.getIconRenderer(holder.id()) != null) { boolean hovered = tab.isMouseOver(xo, yo, mouseX, mouseY); boolean selected = selectedTab == tab; - AdvancementProgress progress = ((AdvancementWidgetAccessor) ((AdvancementTabAccessor) tab).fabric$root()).fabric$progress(); + AdvancementProgress progress = ((AdvancementWidgetAccessor) ((AdvancementTabAccessor) tab).fabric_getRoot()).fabric_getProgress(); ScopedValue.where( AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, new AdvancementRenderContextImpl.IconImpl(graphics, holder, progress, hovered, selected) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java index 4c0c0086a30..218db96d51a 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/ClientAdvancementsAccessor.java @@ -28,5 +28,5 @@ @Mixin(ClientAdvancements.class) public interface ClientAdvancementsAccessor { @Accessor("progress") - Map fabric$progress(); + Map fabric_getProgress(); } From 576b4412590def1a6dd2029d352da301a6557fb5 Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Mon, 12 Jan 2026 22:07:27 -0500 Subject: [PATCH 6/8] Remove accesswidener --- fabric-rendering-v1/build.gradle | 4 ---- .../client/rendering/advancement/AdvancementTabMixin.java | 4 ++-- .../client/rendering/advancement/AdvancementTabTypeMixin.java | 3 +-- .../src/client/resources/fabric-rendering-v1.accesswidener | 2 -- fabric-rendering-v1/src/client/resources/fabric.mod.json | 1 - 5 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener diff --git a/fabric-rendering-v1/build.gradle b/fabric-rendering-v1/build.gradle index 655f48abdce..39ce24e204b 100644 --- a/fabric-rendering-v1/build.gradle +++ b/fabric-rendering-v1/build.gradle @@ -1,9 +1,5 @@ version = getSubprojectVersion(project) -loom { - accessWidenerPath = file("src/client/resources/fabric-rendering-v1.accesswidener") -} - moduleDependencies(project, [ ':fabric-api-base', ':fabric-transitive-access-wideners-v1', diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java index 7c5bc9591e6..867e5452d54 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabMixin.java @@ -25,6 +25,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Coerce; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -34,7 +35,6 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.screens.advancements.AdvancementTab; -import net.minecraft.client.gui.screens.advancements.AdvancementTabType; import net.minecraft.client.gui.screens.advancements.AdvancementWidget; import net.minecraft.world.item.ItemStack; @@ -59,7 +59,7 @@ abstract class AdvancementTabMixin { private AdvancementWidget root; @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementTabType;drawIcon(Lnet/minecraft/client/gui/GuiGraphics;IIILnet/minecraft/world/item/ItemStack;)V")) - private void wrapDrawIcon(AdvancementTabType type, GuiGraphics graphics, int xo, int yo, int index, ItemStack icon, Operation original) { + private void wrapDrawIcon(@Coerce Object type, GuiGraphics graphics, int xo, int yo, int index, ItemStack icon, Operation original) { if (AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.isBound()) { final AdvancementRenderContextImpl.IconImpl context = AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT.get(); ScopedValue.where(AdvancementRendererRegistryImpl.TAB_ICON_RENDER_CONTEXT, context) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java index d2a12e3670a..d99389e397b 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementTabTypeMixin.java @@ -22,14 +22,13 @@ import org.spongepowered.asm.mixin.injection.At; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.advancements.AdvancementTabType; import net.minecraft.world.item.ItemStack; import net.fabricmc.fabric.api.client.rendering.v1.advancement.AdvancementRenderer; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRenderContextImpl; import net.fabricmc.fabric.impl.client.rendering.advancement.AdvancementRendererRegistryImpl; -@Mixin(AdvancementTabType.class) +@Mixin(targets = "net/minecraft/client/gui/screens/advancements/AdvancementTabType") abstract class AdvancementTabTypeMixin { @WrapOperation(method = "drawIcon", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;renderFakeItem(Lnet/minecraft/world/item/ItemStack;II)V")) private void renderAdvancementIcon(GuiGraphics graphics, ItemStack icon, int x, int y, Operation original) { diff --git a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener b/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener deleted file mode 100644 index 5aa680f3dce..00000000000 --- a/fabric-rendering-v1/src/client/resources/fabric-rendering-v1.accesswidener +++ /dev/null @@ -1,2 +0,0 @@ -accessWidener v2 official -accessible class net/minecraft/client/gui/screens/advancements/AdvancementTabType diff --git a/fabric-rendering-v1/src/client/resources/fabric.mod.json b/fabric-rendering-v1/src/client/resources/fabric.mod.json index 4320704c86f..83a5ababb67 100644 --- a/fabric-rendering-v1/src/client/resources/fabric.mod.json +++ b/fabric-rendering-v1/src/client/resources/fabric.mod.json @@ -29,7 +29,6 @@ "mixins": [ "fabric-rendering-v1.mixins.json" ], - "accessWidener": "fabric-rendering-v1.accesswidener", "custom": { "fabric-api:module-lifecycle": "stable", "loom:injected_interfaces": { From e6265059b22f08b54cda2d8a2eb27a26005a02bb Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Sun, 25 Jan 2026 13:30:56 -0500 Subject: [PATCH 7/8] Fix renderer registration check and exceptions --- .../advancement/AdvancementRendererRegistryImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java index 255702bcd16..6822d04129c 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/advancement/AdvancementRendererRegistryImpl.java @@ -57,17 +57,17 @@ public static void registerBackground(AdvancementRenderer.BackgroundRenderer bac } private static void registerRenderer(String type, Map renderers, T renderer, Identifier... advancementIds) { - Objects.requireNonNull(renderers, type + " renderer is null"); + Objects.requireNonNull(renderer, type + " renderer is null"); if (advancementIds.length == 0) { - throw new IllegalArgumentException(type + "advancement renderer registered for no advancements"); + throw new IllegalArgumentException(type + " advancement renderer registered for no advancements"); } for (Identifier advancementId : advancementIds) { - Objects.requireNonNull(advancementId, "advancement id is null"); + Objects.requireNonNull(advancementId, " advancement id is null"); if (renderers.putIfAbsent(advancementId, renderer) != null) { - throw new IllegalArgumentException(type + "advancement renderer already exists for " + advancementId); + throw new IllegalArgumentException(type + " advancement renderer already exists for " + advancementId); } } } From 1f43277a132e0440cb5035cd84e36771fc0ed470 Mon Sep 17 00:00:00 2001 From: EightSidedSquare Date: Sun, 25 Jan 2026 13:36:58 -0500 Subject: [PATCH 8/8] Use named locals for args --- .../client/rendering/advancement/AdvancementsScreenMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java index 94e92481985..b76ce73bca8 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/advancement/AdvancementsScreenMixin.java @@ -39,7 +39,7 @@ abstract class AdvancementsScreenMixin { private @Nullable AdvancementTab selectedTab; @WrapOperation(method = "renderWindow", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/advancements/AdvancementTab;drawIcon(Lnet/minecraft/client/gui/GuiGraphics;II)V")) - private void wrapDrawIcon(AdvancementTab tab, GuiGraphics graphics, int xo, int yo, Operation original, @Local(argsOnly = true, ordinal = 2) int mouseX, @Local(argsOnly = true, ordinal = 3) int mouseY) { + private void wrapDrawIcon(AdvancementTab tab, GuiGraphics graphics, int xo, int yo, Operation original, @Local(name = "mouseX") int mouseX, @Local(name = "mouseY") int mouseY) { AdvancementHolder holder = tab.getRootNode().holder(); if (AdvancementRendererRegistryImpl.getIconRenderer(holder.id()) != null) {