From 2c818cf492a05c74681fbc5f5dfacba2960ae56a Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 15 Apr 2022 12:39:44 +0800 Subject: [PATCH 1/5] [ci skip] Add container render events (#240) --- .../event/events/client/ClientGuiEvent.java | 39 ++++++++++++++ .../client/MixinAbstractContainerScreen.java | 51 +++++++++++++++++++ .../main/resources/architectury.mixins.json | 1 + .../event/forge/EventHandlerImplClient.java | 10 ++++ 4 files changed, 101 insertions(+) create mode 100644 fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinAbstractContainerScreen.java diff --git a/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java b/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java index 43198961..201af93a 100644 --- a/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java +++ b/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java @@ -28,6 +28,7 @@ import dev.architectury.hooks.client.screen.ScreenAccess; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import java.util.List; @@ -58,6 +59,14 @@ public interface ClientGuiEvent { * @see ScreenRenderPost#render(Screen, PoseStack, int, int, float) */ Event RENDER_POST = EventFactory.createLoop(); + /** + * @see ContainerScreenRenderBackground#render(AbstractContainerScreen, PoseStack, int, int, float) + */ + Event RENDER_CONTAINER_BACKGROUND = EventFactory.createEventResult(); + /** + * @see ContainerScreenRenderForeground#render(AbstractContainerScreen, PoseStack, int, int, float) + */ + Event RENDER_CONTAINER_FOREGROUND = EventFactory.createLoop(); /** * @see SetScreen#modifyScreen(Screen) */ @@ -145,6 +154,36 @@ public interface ClientGuiEvent { void render(Screen screen, PoseStack matrices, int mouseX, int mouseY, float delta); } + @Environment(EnvType.CLIENT) + interface ContainerScreenRenderBackground { + /** + * Invoked after a container screen's background are rendered. + * Equivalent to Forge's {@code ContainerScreenEvent.DrawBackground} event. + * + * @param screen The screen. + * @param matrices The pose stack. + * @param mouseX The scaled x-coordinate of the mouse cursor. + * @param mouseY The scaled y-coordinate of the mouse cursor. + * @param delta The current tick delta. + */ + void render(AbstractContainerScreen screen, PoseStack matrices, int mouseX, int mouseY, float delta); + } + + @Environment(EnvType.CLIENT) + interface ContainerScreenRenderForeground { + /** + * Invoked after a screen has finished rendering most of the foreground, but before any floating widgets are rendered. + * Equivalent to Forge's {@code ContainerScreenEvent.DrawForeground} event. + * + * @param screen The screen. + * @param matrices The pose stack. + * @param mouseX The scaled x-coordinate of the mouse cursor. + * @param mouseY The scaled y-coordinate of the mouse cursor. + * @param delta The current tick delta. + */ + void render(AbstractContainerScreen screen, PoseStack matrices, int mouseX, int mouseY, float delta); + } + @Environment(EnvType.CLIENT) interface SetScreen { /** diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinAbstractContainerScreen.java b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinAbstractContainerScreen.java new file mode 100644 index 00000000..1b07b20a --- /dev/null +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/client/MixinAbstractContainerScreen.java @@ -0,0 +1,51 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.mixin.fabric.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.architectury.event.events.client.ClientGuiEvent; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(AbstractContainerScreen.class) +public abstract class MixinAbstractContainerScreen extends Screen { + protected MixinAbstractContainerScreen(Component component) { + super(component); + } + + @Inject(method = "render", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderBg(Lcom/mojang/blaze3d/vertex/PoseStack;FII)V", + ordinal = 0, shift = At.Shift.AFTER)) + public void renderBackground(PoseStack poseStack, int mouseX, int mouseY, float delta, CallbackInfo ci) { + ClientGuiEvent.RENDER_CONTAINER_BACKGROUND.invoker().render((AbstractContainerScreen) (Object) this, poseStack, mouseX, mouseY, delta); + } + + @Inject(method = "render", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/inventory/AbstractContainerScreen;renderLabels(Lcom/mojang/blaze3d/vertex/PoseStack;II)V", + ordinal = 0, shift = At.Shift.AFTER)) + public void renderForeground(PoseStack poseStack, int mouseX, int mouseY, float delta, CallbackInfo ci) { + ClientGuiEvent.RENDER_CONTAINER_FOREGROUND.invoker().render((AbstractContainerScreen) (Object) this, poseStack, mouseX, mouseY, delta); + } +} \ No newline at end of file diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index f036e515..79cb1f92 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_16", "minVersion": "0.7.11", "client": [ + "client.MixinAbstractContainerScreen", "client.MixinClientLevel", "client.MixinClientPacketListener", "client.MixinDebugScreenOverlay", diff --git a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java index f45685ba..84b55af5 100644 --- a/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java +++ b/forge/src/main/java/dev/architectury/event/forge/EventHandlerImplClient.java @@ -150,6 +150,16 @@ public class EventHandlerImplClient { ClientGuiEvent.RENDER_POST.invoker().render(event.getScreen(), event.getPoseStack(), event.getMouseX(), event.getMouseY(), event.getPartialTicks()); } + @SubscribeEvent(priority = EventPriority.HIGH) + public static void event(ContainerScreenEvent.DrawBackground event) { + ClientGuiEvent.RENDER_CONTAINER_BACKGROUND.invoker().render(event.getContainerScreen(), event.getPoseStack(), event.getMouseX(), event.getMouseY(), Minecraft.getInstance().getDeltaFrameTime()); + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void event(ContainerScreenEvent.DrawForeground event) { + ClientGuiEvent.RENDER_CONTAINER_FOREGROUND.invoker().render(event.getContainerScreen(), event.getPoseStack(), event.getMouseX(), event.getMouseY(), Minecraft.getInstance().getDeltaFrameTime()); + } + @SubscribeEvent(priority = EventPriority.HIGH) public static void event(PlayerInteractEvent.RightClickEmpty event) { InteractionEvent.CLIENT_RIGHT_CLICK_AIR.invoker().click(event.getPlayer(), event.getHand()); From 2c6784560e0f86a71d91b7e17b68ca2c7b680126 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 15 Apr 2022 12:40:06 +0800 Subject: [PATCH 2/5] Bump to 4.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index fdbdd6a1..d521fcd9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ cf_type=release archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=4.1 +base_version=4.2 maven_group=dev.architectury fabric_loader_version=0.13.3 From b58658ac69c3ec1b802d4ce6561308d18fe06188 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 15 Apr 2022 12:46:54 +0800 Subject: [PATCH 3/5] Fix createLoop for RENDER_CONTAINER_BACKGROUND (cherry picked from commit 05444b723a914574c9a3b4450e059e17678cac90) --- .../dev/architectury/event/events/client/ClientGuiEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java b/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java index 201af93a..a7a26c82 100644 --- a/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java +++ b/common/src/main/java/dev/architectury/event/events/client/ClientGuiEvent.java @@ -62,7 +62,7 @@ public interface ClientGuiEvent { /** * @see ContainerScreenRenderBackground#render(AbstractContainerScreen, PoseStack, int, int, float) */ - Event RENDER_CONTAINER_BACKGROUND = EventFactory.createEventResult(); + Event RENDER_CONTAINER_BACKGROUND = EventFactory.createLoop(); /** * @see ContainerScreenRenderForeground#render(AbstractContainerScreen, PoseStack, int, int, float) */ From c4ab2332866d150648af6394fbda98016bf642e3 Mon Sep 17 00:00:00 2001 From: "Emma C. Pointer-Null" Date: Sat, 16 Apr 2022 08:16:46 -0400 Subject: [PATCH 4/5] Make AW for `MenuType$MenuSupplier` transitive, deprecate `MenuRegistry.of` (#244) --- .../java/dev/architectury/registry/menu/MenuRegistry.java | 3 +++ common/src/main/resources/architectury.accessWidener | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/dev/architectury/registry/menu/MenuRegistry.java b/common/src/main/java/dev/architectury/registry/menu/MenuRegistry.java index 3f6db5d9..8891844f 100644 --- a/common/src/main/java/dev/architectury/registry/menu/MenuRegistry.java +++ b/common/src/main/java/dev/architectury/registry/menu/MenuRegistry.java @@ -97,7 +97,9 @@ public final class MenuRegistry { * @param factory A functional interface to create the {@link MenuType} from an id (Integer) and inventory * @param The type of {@link AbstractContainerMenu} that handles the logic for the {@link MenuType} * @return The {@link MenuType} for your {@link AbstractContainerMenu} + * @deprecated Use the constructor directly. */ + @Deprecated(forRemoval = true) @ExpectPlatform public static MenuType of(SimpleMenuTypeFactory factory) { throw new AssertionError(); @@ -154,6 +156,7 @@ public final class MenuRegistry { * * @param The {@link AbstractContainerMenu} type */ + @Deprecated(forRemoval = true) @FunctionalInterface public interface SimpleMenuTypeFactory { /** diff --git a/common/src/main/resources/architectury.accessWidener b/common/src/main/resources/architectury.accessWidener index 8a469517..b08f2c69 100644 --- a/common/src/main/resources/architectury.accessWidener +++ b/common/src/main/resources/architectury.accessWidener @@ -52,8 +52,8 @@ mutable field net/minecraft/world/level/block/state/BlockBehaviour$Properties dy accessible method net/minecraft/world/level/block/state/BlockBehaviour$Properties (Lnet/minecraft/world/level/material/Material;Ljava/util/function/Function;)V transitive-accessible method net/minecraft/world/entity/player/Player closeContainer ()V transitive-accessible method net/minecraft/advancements/CriteriaTriggers register (Lnet/minecraft/advancements/CriterionTrigger;)Lnet/minecraft/advancements/CriterionTrigger; -accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;)V -accessible class net/minecraft/world/inventory/MenuType$MenuSupplier +transitive-accessible method net/minecraft/world/inventory/MenuType (Lnet/minecraft/world/inventory/MenuType$MenuSupplier;)V +transitive-accessible class net/minecraft/world/inventory/MenuType$MenuSupplier accessible method net/minecraft/world/entity/Entity getEncodeId ()Ljava/lang/String; accessible field net/minecraft/server/packs/repository/PackRepository sources Ljava/util/Set; mutable field net/minecraft/server/packs/repository/PackRepository sources Ljava/util/Set; From 85146c5cc08f9197533860bb9272f9e7bf73534c Mon Sep 17 00:00:00 2001 From: shedaniel Date: Tue, 19 Apr 2022 01:37:13 +0800 Subject: [PATCH 5/5] Introduce FluidBucketHooks.getFluid (#243) * Introduce FluidBucketHooks.getFluid * Update common/src/main/java/dev/architectury/hooks/fluid/FluidBucketHooks.java Co-authored-by: Juuxel <6596629+Juuxel@users.noreply.github.com> Co-authored-by: Juuxel <6596629+Juuxel@users.noreply.github.com> --- .../hooks/fluid/FluidBucketHooks.java | 38 +++++++++++++++++++ .../fluid/fabric/FluidBucketHooksImpl.java | 30 +++++++++++++++ .../mixin/fabric/BucketItemAccessor.java | 31 +++++++++++++++ .../main/resources/architectury.mixins.json | 5 ++- .../fluid/forge/FluidBucketHooksImpl.java | 29 ++++++++++++++ 5 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/dev/architectury/hooks/fluid/FluidBucketHooks.java create mode 100644 fabric/src/main/java/dev/architectury/hooks/fluid/fabric/FluidBucketHooksImpl.java create mode 100644 fabric/src/main/java/dev/architectury/mixin/fabric/BucketItemAccessor.java create mode 100644 forge/src/main/java/dev/architectury/hooks/fluid/forge/FluidBucketHooksImpl.java diff --git a/common/src/main/java/dev/architectury/hooks/fluid/FluidBucketHooks.java b/common/src/main/java/dev/architectury/hooks/fluid/FluidBucketHooks.java new file mode 100644 index 00000000..3c4e414a --- /dev/null +++ b/common/src/main/java/dev/architectury/hooks/fluid/FluidBucketHooks.java @@ -0,0 +1,38 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.hooks.fluid; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluid; + +public final class FluidBucketHooks { + /** + * Returns the fluid contained in the bucket. + * This requires special handling since forge defers the fiuid. + * + * @param item the bucket item + * @return the fluid contained in the bucket + */ + @ExpectPlatform + public static Fluid getFluid(BucketItem item) { + throw new AssertionError(); + } +} diff --git a/fabric/src/main/java/dev/architectury/hooks/fluid/fabric/FluidBucketHooksImpl.java b/fabric/src/main/java/dev/architectury/hooks/fluid/fabric/FluidBucketHooksImpl.java new file mode 100644 index 00000000..27e00235 --- /dev/null +++ b/fabric/src/main/java/dev/architectury/hooks/fluid/fabric/FluidBucketHooksImpl.java @@ -0,0 +1,30 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.hooks.fluid.fabric; + +import dev.architectury.mixin.fabric.BucketItemAccessor; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluid; + +public class FluidBucketHooksImpl { + public static Fluid getFluid(BucketItem item) { + return ((BucketItemAccessor) item).getContent(); + } +} diff --git a/fabric/src/main/java/dev/architectury/mixin/fabric/BucketItemAccessor.java b/fabric/src/main/java/dev/architectury/mixin/fabric/BucketItemAccessor.java new file mode 100644 index 00000000..46ff906c --- /dev/null +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/BucketItemAccessor.java @@ -0,0 +1,31 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.mixin.fabric; + +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluid; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(BucketItem.class) +public interface BucketItemAccessor { + @Accessor("content") + Fluid getContent(); +} diff --git a/fabric/src/main/resources/architectury.mixins.json b/fabric/src/main/resources/architectury.mixins.json index 79cb1f92..0a6c3dba 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_16", "minVersion": "0.7.11", "client": [ + "client.ClientPlayerAttackInvoker", "client.MixinAbstractContainerScreen", "client.MixinClientLevel", "client.MixinClientPacketListener", @@ -17,10 +18,10 @@ "client.MixinMouseHandler", "client.MixinMultiPlayerGameMode", "client.MixinScreen", - "client.MixinTextureAtlas", - "client.ClientPlayerAttackInvoker" + "client.MixinTextureAtlas" ], "mixins": [ + "BucketItemAccessor", "ExplosionPreInvoker", "HorseTameInvoker", "LivingDeathInvoker", diff --git a/forge/src/main/java/dev/architectury/hooks/fluid/forge/FluidBucketHooksImpl.java b/forge/src/main/java/dev/architectury/hooks/fluid/forge/FluidBucketHooksImpl.java new file mode 100644 index 00000000..b4eb4d3f --- /dev/null +++ b/forge/src/main/java/dev/architectury/hooks/fluid/forge/FluidBucketHooksImpl.java @@ -0,0 +1,29 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021, 2022 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package dev.architectury.hooks.fluid.forge; + +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluid; + +public class FluidBucketHooksImpl { + public static Fluid getFluid(BucketItem item) { + return item.getFluid(); + } +}