From edd3a0e909a657d379fd5fa8459779f759dbb400 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 22 Nov 2020 00:44:29 +0800 Subject: [PATCH] Add RecipeUpdateEvent --- .../event/events/RecipeUpdateEvent.java | 33 +++++++++++++++++++ .../client/MixinClientPacketListener.java | 10 ++++++ .../event/forge/EventHandlerImplClient.java | 6 ++++ 3 files changed, 49 insertions(+) create mode 100644 common/src/main/java/me/shedaniel/architectury/event/events/RecipeUpdateEvent.java diff --git a/common/src/main/java/me/shedaniel/architectury/event/events/RecipeUpdateEvent.java b/common/src/main/java/me/shedaniel/architectury/event/events/RecipeUpdateEvent.java new file mode 100644 index 00000000..063a6b14 --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/event/events/RecipeUpdateEvent.java @@ -0,0 +1,33 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020 shedaniel + * + * 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 me.shedaniel.architectury.event.events; + +import me.shedaniel.architectury.event.Event; +import me.shedaniel.architectury.event.EventFactory; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.world.item.crafting.RecipeManager; + +@Environment(EnvType.CLIENT) +public interface RecipeUpdateEvent { + Event EVENT = EventFactory.createLoop(RecipeUpdateEvent.class); + + void update(RecipeManager recipeManager); +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinClientPacketListener.java b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinClientPacketListener.java index 0bb1a2f1..59c0ece5 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinClientPacketListener.java +++ b/fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/client/MixinClientPacketListener.java @@ -21,6 +21,7 @@ package me.shedaniel.architectury.mixin.fabric.client; import me.shedaniel.architectury.event.events.ChatEvent; import me.shedaniel.architectury.event.events.PlayerEvent; +import me.shedaniel.architectury.event.events.RecipeUpdateEvent; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; @@ -28,8 +29,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundChatPacket; import net.minecraft.network.protocol.game.ClientboundLoginPacket; import net.minecraft.network.protocol.game.ClientboundRespawnPacket; +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.item.crafting.RecipeManager; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -40,6 +44,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ClientPacketListener.class) public class MixinClientPacketListener { @Shadow private Minecraft minecraft; + @Shadow @Final private RecipeManager recipeManager; @Unique private LocalPlayer tmpPlayer; @Inject(method = "handleLogin", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Options;broadcastOptions()V")) @@ -71,4 +76,9 @@ public class MixinClientPacketListener { ci.cancel(); } } + + @Inject(method = "handleUpdateRecipes", at = @At("RETURN")) + private void handleUpdateRecipes(ClientboundUpdateRecipesPacket clientboundUpdateRecipesPacket, CallbackInfo ci) { + RecipeUpdateEvent.EVENT.invoker().update(recipeManager); + } } diff --git a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImplClient.java b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImplClient.java index 78864b8f..c7a03b79 100644 --- a/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImplClient.java +++ b/forge/src/main/java/me/shedaniel/architectury/event/forge/EventHandlerImplClient.java @@ -24,6 +24,7 @@ import me.shedaniel.architectury.event.events.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.IGuiEventListener; import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.play.server.SUpdateRecipesPacket; import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResultType; import net.minecraft.util.text.ITextComponent; @@ -140,6 +141,11 @@ public class EventHandlerImplClient { InteractionEvent.CLIENT_LEFT_CLICK_AIR.invoker().click(event.getPlayer(), event.getHand()); } + @SubscribeEvent + public static void event(RecipesUpdatedEvent event) { + RecipeUpdateEvent.EVENT.invoker().update(event.getRecipeManager()); + } + @OnlyIn(Dist.CLIENT) public static class ModBasedEventHandler { @SubscribeEvent