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..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 @@ -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.createLoop(); + /** + * @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/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/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 366f5279..4940f155 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; 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/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..0a6c3dba 100644 --- a/fabric/src/main/resources/architectury.mixins.json +++ b/fabric/src/main/resources/architectury.mixins.json @@ -5,6 +5,8 @@ "compatibilityLevel": "JAVA_16", "minVersion": "0.7.11", "client": [ + "client.ClientPlayerAttackInvoker", + "client.MixinAbstractContainerScreen", "client.MixinClientLevel", "client.MixinClientPacketListener", "client.MixinDebugScreenOverlay", @@ -16,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/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()); 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(); + } +} diff --git a/gradle.properties b/gradle.properties index 8f05650c..8b55f931 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ cf_type=beta archives_base_name=architectury archives_base_name_snapshot=architectury-snapshot -base_version=5.1 +base_version=5.2 maven_group=dev.architectury fabric_loader_version=0.13.3