From 31fe6f7419a73ea1845246179ae542ef68ced93c Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 3 Jul 2026 22:30:00 +0700 Subject: [PATCH] creativetab: add a forge fallback for creative tabs --- .../CreativeModeTabBuilderImpl.java | 1 + .../impl/creativetab/CreativeModeTabDuck.java | 7 ++++ .../CreativeModeTabForgeMixin.java | 35 +++++++++++++++++++ .../creativetab/CreativeModeTabMixin.java | 22 ++++++++++++ src/main/resources/pulsar.mixins.json | 6 ++-- 5 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabDuck.java create mode 100644 src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabForgeMixin.java create mode 100644 src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabMixin.java diff --git a/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabBuilderImpl.java b/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabBuilderImpl.java index 451030a..0257885 100644 --- a/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabBuilderImpl.java +++ b/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabBuilderImpl.java @@ -69,6 +69,7 @@ public class CreativeModeTabBuilderImpl implements CreativeModeTabBuilder { (displayContext, entries1) -> this.entries.collect(new PulsarEntriesImpl(entries1))); CreativeModeTab group = builder.build(); + ((CreativeModeTabDuck) group).pulsar$isPulsarTab(true); Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, this.location, group); return group; } diff --git a/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabDuck.java b/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabDuck.java new file mode 100644 index 0000000..3129ce2 --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/impl/creativetab/CreativeModeTabDuck.java @@ -0,0 +1,7 @@ +package dev.zenfyr.pulsar.impl.creativetab; + +public interface CreativeModeTabDuck { + boolean pulsar$isPulsarTab(); + + void pulsar$isPulsarTab(boolean is); +} diff --git a/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabForgeMixin.java b/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabForgeMixin.java new file mode 100644 index 0000000..8e972c9 --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabForgeMixin.java @@ -0,0 +1,35 @@ +package dev.zenfyr.pulsar.impl.mixins.creativetab; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import dev.zenfyr.pulsar.impl.creativetab.CreativeModeTabDuck; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.CreativeModeTab; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(CreativeModeTab.class) +public class CreativeModeTabForgeMixin { + + @WrapOperation( + at = + @At( + value = "INVOKE", + target = + "Lnet/minecraftforge/common/ForgeHooks;onCreativeModeTabBuildContents(Lnet/minecraft/world/item/CreativeModeTab;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/item/CreativeModeTab$DisplayItemsGenerator;Lnet/minecraft/world/item/CreativeModeTab$ItemDisplayParameters;Lnet/minecraft/world/item/CreativeModeTab$Output;)V"), + method = "buildContents", + require = 0) + private void pulsar$disableForgeEvent( + CreativeModeTab tab, + ResourceKey tabKey, + CreativeModeTab.DisplayItemsGenerator originalGenerator, + CreativeModeTab.ItemDisplayParameters params, + CreativeModeTab.Output output, + Operation original) { + if (!((CreativeModeTabDuck) tab).pulsar$isPulsarTab()) { + original.call(tab, tabKey, originalGenerator, params, output); + } else { + originalGenerator.accept(params, output); + } + } +} diff --git a/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabMixin.java b/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabMixin.java new file mode 100644 index 0000000..ba2846a --- /dev/null +++ b/src/main/java/dev/zenfyr/pulsar/impl/mixins/creativetab/CreativeModeTabMixin.java @@ -0,0 +1,22 @@ +package dev.zenfyr.pulsar.impl.mixins.creativetab; + +import dev.zenfyr.pulsar.impl.creativetab.CreativeModeTabDuck; +import net.minecraft.world.item.CreativeModeTab; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(CreativeModeTab.class) +public class CreativeModeTabMixin implements CreativeModeTabDuck { + + @Unique private boolean pulsar$Tab = false; + + @Override + public boolean pulsar$isPulsarTab() { + return this.pulsar$Tab; + } + + @Override + public void pulsar$isPulsarTab(boolean is) { + this.pulsar$Tab = is; + } +} diff --git a/src/main/resources/pulsar.mixins.json b/src/main/resources/pulsar.mixins.json index 9faa3fe..14152d6 100644 --- a/src/main/resources/pulsar.mixins.json +++ b/src/main/resources/pulsar.mixins.json @@ -4,14 +4,16 @@ "package": "dev.zenfyr.pulsar.impl.mixins", "compatibilityLevel": "JAVA_17", "mixins": [ - "resources.ReloadableServerResourcesMixin", + "creativetab.CreativeModeTabForgeMixin", + "creativetab.CreativeModeTabMixin", "resources.MinecraftServerMixin", + "resources.ReloadableServerResourcesMixin", "resources.ResourceManagerHelperImplMixin" ], "client": [ - "client.events.MinecraftMixin", "client.creativetab.CreativeModeInventoryScreenMixin", "client.creativetab.CreativeModeTabMixin", + "client.events.MinecraftMixin", "client.particles.GameRendererMixin", "client.particles.MinecraftMixin", "client.particles.ParticleEngineAccessor", -- 2.51.2