diff --git a/Common/src/main/java/dev/upcraft/sparkweave/api/event/CustomLecternMenuEvent.java b/Common/src/main/java/dev/upcraft/sparkweave/api/event/CustomLecternMenuEvent.java index ab4c613..2eba50d 100644 --- a/Common/src/main/java/dev/upcraft/sparkweave/api/event/CustomLecternMenuEvent.java +++ b/Common/src/main/java/dev/upcraft/sparkweave/api/event/CustomLecternMenuEvent.java @@ -6,11 +6,11 @@ import java.util.function.Supplier; public class CustomLecternMenuEvent { - public void register(LecternMenuRegistry.MenuFactory factory, ItemLike item) { + public void register(LecternMenuRegistry.MenuProviderFactory factory, ItemLike item) { LecternMenuRegistry.register(factory, item); } - public void register(LecternMenuRegistry.MenuFactory factory, Supplier item) { + public void register(LecternMenuRegistry.MenuProviderFactory factory, Supplier item) { LecternMenuRegistry.register(factory, item); } diff --git a/Common/src/main/java/dev/upcraft/sparkweave/event/LecternMenuRegistry.java b/Common/src/main/java/dev/upcraft/sparkweave/event/LecternMenuRegistry.java index e58a176..bf84738 100644 --- a/Common/src/main/java/dev/upcraft/sparkweave/event/LecternMenuRegistry.java +++ b/Common/src/main/java/dev/upcraft/sparkweave/event/LecternMenuRegistry.java @@ -3,23 +3,26 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.LecternBlockEntity; import org.jetbrains.annotations.Nullable; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.function.Supplier; public class LecternMenuRegistry { - private static final Map FACTORIES = new Object2ObjectOpenHashMap<>(); + private static final Map FACTORIES = new Object2ObjectOpenHashMap<>(); - public static void register(MenuFactory factory, Supplier itemLike) { + public static void register(MenuProviderFactory factory, Supplier itemLike) { Preconditions.checkNotNull(itemLike, "Item for menu is null or doesn't exist"); Item item = Preconditions.checkNotNull(itemLike.get().asItem(), "Item for menu is null or doesn't exist"); @@ -28,7 +31,7 @@ public static void register(MenuFactory factory, Supplier itemLike) { } } - public static void register(MenuFactory factory, ItemLike item) { + public static void register(MenuProviderFactory factory, ItemLike item) { register(factory, () -> item); } @@ -36,16 +39,15 @@ public static Set validItems() { return ImmutableSet.copyOf(FACTORIES.keySet()); } - @Nullable - public static MenuFactory get(ItemStack stack) { + public static Optional get(ItemStack stack) { if(stack.isEmpty()) - return null; + return Optional.empty(); - return FACTORIES.get(stack.getItem()); + return Optional.ofNullable(FACTORIES.get(stack.getItem())); } @FunctionalInterface - public interface MenuFactory { - @Nullable AbstractContainerMenu create(int containerId, Inventory inventory, Player player); + public interface MenuProviderFactory { + @Nullable MenuProvider create(Level level, BlockPos pos, Player player, LecternBlockEntity blockEntity, ItemStack stack); } } diff --git a/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockEntityMixin.java b/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockEntityMixin.java index cb8b86c..67a93c7 100644 --- a/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockEntityMixin.java +++ b/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockEntityMixin.java @@ -5,9 +5,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.Clearable; import net.minecraft.world.MenuProvider; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -16,8 +13,6 @@ 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.CallbackInfoReturnable; @Mixin(LecternBlockEntity.class) public abstract class LecternBlockEntityMixin extends BlockEntity implements Clearable, MenuProvider { @@ -29,13 +24,4 @@ public abstract class LecternBlockEntityMixin extends BlockEntity implements Cle private boolean allItemsAreBooks(boolean original) { return original || LecternMenuRegistry.validItems().contains(getBook().getItem()); } - - @Inject(method = "createMenu", at = @At("HEAD"), cancellable = true) - private void applyCustomLecternMenus(int containerId, Inventory inventory, Player player, CallbackInfoReturnable info) { - LecternMenuRegistry.MenuFactory factory = LecternMenuRegistry.get(getBook()); - - System.out.println(factory); - if(factory != null) - info.setReturnValue(factory.create(containerId, inventory, player)); - } } diff --git a/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockMixin.java b/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockMixin.java new file mode 100644 index 0000000..56da9e2 --- /dev/null +++ b/Common/src/main/java/dev/upcraft/sparkweave/mixin/LecternBlockMixin.java @@ -0,0 +1,35 @@ +package dev.upcraft.sparkweave.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dev.upcraft.sparkweave.event.LecternMenuRegistry; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.LecternBlock; +import net.minecraft.world.level.block.entity.LecternBlockEntity; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.OptionalInt; + +@Mixin(LecternBlock.class) +public class LecternBlockMixin { + + @WrapOperation(method = "openScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;openMenu(Lnet/minecraft/world/MenuProvider;)Ljava/util/OptionalInt;")) + private OptionalInt customMenuProvider(Player instance, MenuProvider menu, Operation original) { + if (menu instanceof LecternBlockEntity lectern) { + var provider = LecternMenuRegistry.get(lectern.getBook()).map(factory -> sparkweave$createProvider(factory, instance, lectern)).orElse(menu); + return original.call(instance, provider); + } + + return original.call(instance, menu); + } + + @Unique + @Nullable + private static MenuProvider sparkweave$createProvider(LecternMenuRegistry.MenuProviderFactory factory, Player player, LecternBlockEntity lectern) { + return factory.create(player.level(), lectern.getBlockPos(), player, lectern, lectern.getBook()); + } +} diff --git a/Common/src/main/resources/sparkweave.mixins.json b/Common/src/main/resources/sparkweave.mixins.json index 9d63b17..ac0c3ab 100644 --- a/Common/src/main/resources/sparkweave.mixins.json +++ b/Common/src/main/resources/sparkweave.mixins.json @@ -1,20 +1,21 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.upcraft.sparkweave.mixin", - "plugin": "dev.upcraft.sparkweave.SparkweaveMixinConfigPlugin", - "refmap": "${mod_id}.refmap.json", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "BlockEntityMixin", - "LecternBlockEntityMixin" - ], - "client": [ - "client.LecternRendererMixin", - "client.MainMixin", - "client.RenderLayerMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "minVersion": "0.8", + "package": "dev.upcraft.sparkweave.mixin", + "plugin": "dev.upcraft.sparkweave.SparkweaveMixinConfigPlugin", + "refmap": "${mod_id}.refmap.json", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "BlockEntityMixin", + "LecternBlockEntityMixin", + "LecternBlockMixin" + ], + "client": [ + "client.LecternRendererMixin", + "client.MainMixin", + "client.RenderLayerMixin" + ], + "injectors": { + "defaultRequire": 1 } }