diff --git a/.gitignore b/.gitignore index 550b373c..4ff547f0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ bin/ # fabric run/ + +.omc/ diff --git a/build.gradle b/build.gradle index de06df7d..b655e259 100644 --- a/build.gradle +++ b/build.gradle @@ -1,94 +1,56 @@ plugins { - id 'fabric-loom' version '1.1-SNAPSHOT' - id 'maven-publish' + id 'java' + id 'net.neoforged.moddev' version '2.0.142' + id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 - -archivesBaseName = project.archives_base_name version = project.mod_version group = project.maven_group +base { + archivesName = project.archives_base_name +} -repositories { - maven { - url "https://maven.shedaniel.me/" - } - maven { - name = 'terraformers maven' - url "https://maven.terraformersmc.com/releases" - } +java { + toolchain.languageVersion = JavaLanguageVersion.of(21) } -dependencies { - // To change the versions see the gradle.properties file - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" - modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" +repositories { + maven { url = 'https://maven.shedaniel.me/' } +} - // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" +neoForge { + version = project.neoforge_version - modApi("me.shedaniel.cloth:cloth-config-fabric:${project.clothconfig_version}") { - exclude(group: "net.fabricmc.fabric-api") + mods { + inventorytabs { + sourceSet sourceSets.main + } } - modCompileOnly("com.terraformersmc:modmenu:${project.modmenu_version}") { - transitive = false - } - // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. - // You may need to force-disable transitiveness on them. + runs { + client { + client() + } + } } -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } +dependencies { + implementation "me.shedaniel.cloth:cloth-config-neoforge:${project.cloth_config_version}" } tasks.withType(JavaCompile).configureEach { - // ensure that the encoding is set to UTF-8, no matter what the system default is - // this fixes some edge cases with special characters not displaying correctly - // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html - // If Javadoc is generated, this must be specified in that task too. - it.options.encoding = "UTF-8" - - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + options.encoding = 'UTF-8' + options.release = 21 } -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() +processResources { + def props = [version: project.version] + inputs.properties props + filesMatching('META-INF/neoforge.mods.toml') { + expand props + } } jar { - from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} - } -} - -loom { - accessWidenerPath = file("src/main/resources/inventorytabs.accesswidener") -} - -// configure the maven publication -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } + from('LICENSE') } diff --git a/gradle.properties b/gradle.properties index 602cce8a..fed2645e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,12 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx1G - -# Fabric Properties - # check these on https://fabricmc.net/versions.html - minecraft_version=1.19.4 - yarn_mappings=1.19.4+build.1 - loader_version=0.14.19 +# Gradle +org.gradle.jvmargs=-Xmx2G +org.gradle.parallel=true # Mod Properties - mod_version = 0.9.1-1.19.4-beta - maven_group = com.kqp - archives_base_name = inventorytabs +mod_version=0.9.1-1.21.1-neoforge +maven_group=com.kqp +archives_base_name=inventorytabs # Dependencies - fabric_version=0.77.0+1.19.4 - clothconfig_version=10.0.96 - modmenu_version=6.1.0-rc.4 +neoforge_version=21.1.242 +cloth_config_version=15.0.140 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 070cb702..0d184210 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index b02216ba..5f9fac72 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1,8 @@ pluginManagement { repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - mavenCentral() gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } } } + +rootProject.name = 'inventorytabs' diff --git a/src/main/java/com/kqp/inventorytabs/api/TabProviderRegistry.java b/src/main/java/com/kqp/inventorytabs/api/TabProviderRegistry.java index e868d0b9..1ae8c5c0 100644 --- a/src/main/java/com/kqp/inventorytabs/api/TabProviderRegistry.java +++ b/src/main/java/com/kqp/inventorytabs/api/TabProviderRegistry.java @@ -3,12 +3,15 @@ import com.kqp.inventorytabs.init.InventoryTabs; import com.kqp.inventorytabs.interf.TabManagerContainer; import com.kqp.inventorytabs.tabs.provider.*; -import net.minecraft.block.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.util.Identifier; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.piston.MovingPistonBlock; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -19,7 +22,7 @@ */ public class TabProviderRegistry { private static final Logger LOGGER = LogManager.getLogger("InventoryTabs"); - private static final Map TAB_PROVIDERS = new HashMap<>(); + private static final Map TAB_PROVIDERS = new HashMap<>(); public static final PlayerInventoryTabProvider PLAYER_INVENTORY_TAB_PROVIDER = (PlayerInventoryTabProvider) register( InventoryTabs.id("player_inventory_tab_provider"), new PlayerInventoryTabProvider()); @@ -55,11 +58,11 @@ public static void init(String configMsg) { blockSet.add(overrideEntry); } } - Registries.BLOCK.forEach(block -> { - if (block instanceof BlockEntityProvider) { + BuiltInRegistries.BLOCK.forEach(block -> { + if (block instanceof EntityBlock) { if (block instanceof AbstractChestBlock) { registerChest(block); - } else if (!(block instanceof AbstractBannerBlock) && !(block instanceof AbstractSignBlock) && !(block instanceof AbstractSkullBlock) && !(block instanceof BeehiveBlock) && !(block instanceof BedBlock) && !(block instanceof BellBlock) && !(block instanceof CampfireBlock) && !(block instanceof CommandBlock) && !(block instanceof ComparatorBlock) && !(block instanceof ConduitBlock) && !(block instanceof DaylightDetectorBlock) && !(block instanceof EndGatewayBlock) && !(block instanceof EndPortalBlock) && !(block instanceof JigsawBlock) && !(block instanceof JukeboxBlock) && !(block instanceof PistonExtensionBlock) && !(block instanceof SculkSensorBlock) && !(block instanceof SpawnerBlock) && !(block instanceof StructureBlock)) { + } else if (!(block instanceof AbstractBannerBlock) && !(block instanceof SignBlock) && !(block instanceof AbstractSkullBlock) && !(block instanceof BeehiveBlock) && !(block instanceof BedBlock) && !(block instanceof BellBlock) && !(block instanceof CampfireBlock) && !(block instanceof CommandBlock) && !(block instanceof ComparatorBlock) && !(block instanceof ConduitBlock) && !(block instanceof DaylightDetectorBlock) && !(block instanceof EndGatewayBlock) && !(block instanceof EndPortalBlock) && !(block instanceof JigsawBlock) && !(block instanceof JukeboxBlock) && !(block instanceof MovingPistonBlock) && !(block instanceof SculkSensorBlock) && !(block instanceof SpawnerBlock) && !(block instanceof StructureBlock)) { registerSimpleBlock(block); } } else if (block instanceof CraftingTableBlock && !(block instanceof FletchingTableBlock) || block instanceof AnvilBlock || block instanceof CartographyTableBlock || block instanceof GrindstoneBlock || block instanceof LoomBlock || block instanceof StonecutterBlock) { @@ -69,23 +72,23 @@ public static void init(String configMsg) { }); configRemove(blockSet); configAdd(); - registerEntity(new Identifier("minecraft:entity.minecraft.chest_minecart")); + registerEntity(ResourceLocation.parse("minecraft:entity.minecraft.chest_minecart")); - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManagerContainer tabManagerContainer = (TabManagerContainer) client; tabManagerContainer.getTabManager().removeTabs(); LOGGER.info(configMsg.equals("save") ? "InventoryTabs: Config saved!" : "InventoryTabs: Config " + configMsg + "ed!"); } private static void modCompatAdd() { - registerInventoryTab(new Identifier("onastick", "crafting_table_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "smithing_table_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "cartography_table_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "anvil_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "loom_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "grindstone_on_a_stick")); - registerInventoryTab(new Identifier("onastick", "stonecutter_on_a_stick")); - registerInventoryTab(new Identifier("craftingpad", "craftingpad")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "crafting_table_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "smithing_table_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "cartography_table_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "anvil_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "loom_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "grindstone_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("onastick", "stonecutter_on_a_stick")); + registerInventoryTab(ResourceLocation.fromNamespaceAndPath("craftingpad", "craftingpad")); } public static boolean isValid(String overrideEntry, String[] splitEntry, Set invalidSet) { @@ -101,7 +104,7 @@ private static void configRemove(Set blockSet) { if (InventoryTabs.getConfig().debugEnabled) { LOGGER.info("Excluding: " + overrideEntry); } - removeSimpleBlock(new Identifier(overrideEntry)); + removeSimpleBlock(ResourceLocation.parse(overrideEntry)); } } @@ -109,9 +112,9 @@ private static void configRemove(Block block, Set tagSet, Set in for (String overrideEntry : tagSet) { String[] splitEntry = overrideEntry.split(":"); // split into two parts: tag id, item name if (isValid(overrideEntry, splitEntry, invalidSet)) { - List> blockStream = block.getRegistryEntry().streamTags().toList(); + List> blockStream = block.builtInRegistryHolder().tags().toList(); for (TagKey tagKey : blockStream) { - if (block.getRegistryEntry().isIn(TagKey.of(RegistryKeys.BLOCK, new Identifier(splitEntry[0], splitEntry[1])))) { + if (block.builtInRegistryHolder().is(TagKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath(splitEntry[0], splitEntry[1])))) { removeSimpleBlock(block); if (InventoryTabs.getConfig().debugEnabled) { LOGGER.info("Excluding: " + block); @@ -127,11 +130,11 @@ private static void configAdd() { if (InventoryTabs.getConfig().debugEnabled) { LOGGER.info("Including: " + included_tab); } - registerSimpleBlock(new Identifier(included_tab)); + registerSimpleBlock(ResourceLocation.parse(included_tab)); } } - public static void registerInventoryTab(Identifier itemId) { + public static void registerInventoryTab(ResourceLocation itemId) { INVENTORY_TAB_PROVIDER.addItem(itemId); } @@ -152,7 +155,7 @@ public static void registerSimpleBlock(Block block) { * * @param blockId */ - public static void registerSimpleBlock(Identifier blockId) { + public static void registerSimpleBlock(ResourceLocation blockId) { if (InventoryTabs.getConfig().debugEnabled) { LOGGER.info("Registering: " + blockId); } @@ -163,7 +166,7 @@ public static void removeSimpleBlock(Block block) { SIMPLE_BLOCK_TAB_PROVIDER.removeBlock(block); } - public static void removeSimpleBlock(Identifier blockId) { + public static void removeSimpleBlock(ResourceLocation blockId) { SIMPLE_BLOCK_TAB_PROVIDER.removeBlock(blockId); } @@ -186,7 +189,7 @@ public static void registerUniqueBlock(Block block) { UNIQUE_TAB_PROVIDER.addUniqueBlock(block); } - public static void registerEntity(Identifier entityId) { + public static void registerEntity(ResourceLocation entityId) { if (InventoryTabs.getConfig().debugEnabled) { LOGGER.info("Registering: " + entityId); } @@ -198,11 +201,11 @@ public static void registerEntity(Identifier entityId) { * * @param blockId */ - public static void registerChest(Identifier blockId) { + public static void registerChest(ResourceLocation blockId) { CHEST_TAB_PROVIDER.addChestBlock(blockId); } - public static TabProvider register(Identifier id, TabProvider tabProvider) { + public static TabProvider register(ResourceLocation id, TabProvider tabProvider) { TAB_PROVIDERS.put(id, tabProvider); return tabProvider; @@ -211,4 +214,4 @@ public static TabProvider register(Identifier id, TabProvider tabProvider) { public static List getTabProviders() { return new ArrayList<>(TAB_PROVIDERS.values()); } -} \ No newline at end of file +} diff --git a/src/main/java/com/kqp/inventorytabs/init/InventoryTabs.java b/src/main/java/com/kqp/inventorytabs/init/InventoryTabs.java index db40d74e..1bb9a667 100644 --- a/src/main/java/com/kqp/inventorytabs/init/InventoryTabs.java +++ b/src/main/java/com/kqp/inventorytabs/init/InventoryTabs.java @@ -1,44 +1,93 @@ package com.kqp.inventorytabs.init; import com.kqp.inventorytabs.api.TabProviderRegistry; +import com.kqp.inventorytabs.interf.TabManagerContainer; + +import com.mojang.blaze3d.platform.InputConstants; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.ConfigHolder; import me.shedaniel.autoconfig.serializer.GsonConfigSerializer; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Identifier; - -public class InventoryTabs implements ModInitializer { + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionResult; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; +import net.neoforged.neoforge.common.NeoForge; + +import org.lwjgl.glfw.GLFW; + +@Mod(value = "inventorytabs", dist = Dist.CLIENT) +public class InventoryTabs { public static final String ID = "inventorytabs"; + + public static final KeyMapping NEXT_TAB_KEY_BIND = new KeyMapping( + "inventorytabs.key.next_tab", InputConstants.Type.KEYSYM, GLFW.GLFW_KEY_TAB, "key.categories.inventory"); + static ConfigHolder inventoryTabsConfig; public static boolean isBigInvLoaded; public static boolean isPlayerExLoaded; public static boolean isLevelzLoaded; - public static Identifier id(String path) { - return new Identifier(ID, path); + public static boolean serverDoSightCheckFlag = true; + + public static ResourceLocation id(String path) { + return ResourceLocation.fromNamespaceAndPath(ID, path); } - @Override - public void onInitialize() { + public InventoryTabs(IEventBus modBus, ModContainer container) { inventoryTabsConfig = AutoConfig.register(InventoryTabsConfig.class, GsonConfigSerializer::new); inventoryTabsConfig.registerSaveListener((configHolder, config) -> { TabProviderRegistry.init("save"); - return ActionResult.success(true); + return InteractionResult.SUCCESS; }); - ClientLoginConnectionEvents.INIT.register((handler, client) -> TabProviderRegistry.init("load")); - ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> TabProviderRegistry.init("reload")); - isBigInvLoaded = FabricLoader.getInstance().isModLoaded("biginv"); - isPlayerExLoaded = FabricLoader.getInstance().isModLoaded("playerex"); - isLevelzLoaded = FabricLoader.getInstance().isModLoaded("levelz"); + modBus.addListener(this::onRegisterKeyMappings); + container.registerExtensionPoint(IConfigScreenFactory.class, + (c, parent) -> AutoConfig.getConfigScreen(InventoryTabsConfig.class, parent).get()); + + NeoForge.EVENT_BUS.addListener(this::onClientTick); + NeoForge.EVENT_BUS.addListener(this::onLoggingIn); + + isBigInvLoaded = ModList.get().isLoaded("biginv"); + isPlayerExLoaded = ModList.get().isLoaded("playerex"); + isLevelzLoaded = ModList.get().isLoaded("levelz"); + // ponytail: dropped Fabric END_DATA_PACK_RELOAD re-init hook; LoggingIn covers load, save listener covers config saves. + } + + private void onRegisterKeyMappings(RegisterKeyMappingsEvent event) { + event.register(NEXT_TAB_KEY_BIND); + } + + private void onClientTick(ClientTickEvent.Post event) { + Minecraft client = Minecraft.getInstance(); + if (client.screen != null) { + ((TabManagerContainer) client).getTabManager().update(); + } + } + + private void onLoggingIn(ClientPlayerNetworkEvent.LoggingIn event) { + TabProviderRegistry.init("load"); } public static InventoryTabsConfig getConfig() { return AutoConfig.getConfigHolder(InventoryTabsConfig.class).getConfig(); } + + public static boolean screenSupported(Screen screen) { + return (screen instanceof AbstractContainerScreen) && !(screen instanceof CreativeModeInventoryScreen); + } } diff --git a/src/main/java/com/kqp/inventorytabs/init/InventoryTabsClient.java b/src/main/java/com/kqp/inventorytabs/init/InventoryTabsClient.java deleted file mode 100644 index 9d792078..00000000 --- a/src/main/java/com/kqp/inventorytabs/init/InventoryTabsClient.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kqp.inventorytabs.init; - -import com.kqp.inventorytabs.api.TabProviderRegistry; -import com.kqp.inventorytabs.interf.TabManagerContainer; - -import org.lwjgl.glfw.GLFW; - -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; - -public class InventoryTabsClient implements ClientModInitializer { - public static final KeyBinding NEXT_TAB_KEY_BIND = KeyBindingHelper.registerKeyBinding(new KeyBinding( - "inventorytabs.key.next_tab", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_TAB, "key.categories.inventory")); - - public static boolean serverDoSightCheckFlag = true; - - @Override - public void onInitializeClient() { - // Handle state of tab managerInventoryTabsClient - ClientTickEvents.START_WORLD_TICK.register(world -> { - MinecraftClient client = MinecraftClient.getInstance(); - - if (client.currentScreen != null) { - TabManagerContainer tabManagerContainer = (TabManagerContainer) client; - - tabManagerContainer.getTabManager().update(); - } - }); - } - - public static boolean screenSupported(Screen screen) { - return (screen instanceof HandledScreen) && !(screen instanceof CreativeInventoryScreen); - } -} diff --git a/src/main/java/com/kqp/inventorytabs/init/InventoryTabsModMenu.java b/src/main/java/com/kqp/inventorytabs/init/InventoryTabsModMenu.java deleted file mode 100644 index e98869ba..00000000 --- a/src/main/java/com/kqp/inventorytabs/init/InventoryTabsModMenu.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.kqp.inventorytabs.init; - -import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import com.terraformersmc.modmenu.api.ModMenuApi; -import me.shedaniel.autoconfig.AutoConfig; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -@Environment(EnvType.CLIENT) -public class InventoryTabsModMenu implements ModMenuApi { - @Override - public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> AutoConfig.getConfigScreen(InventoryTabsConfig.class, parent).get(); - } -} diff --git a/src/main/java/com/kqp/inventorytabs/interf/TabManagerContainer.java b/src/main/java/com/kqp/inventorytabs/interf/TabManagerContainer.java index 643351c0..9b75a376 100644 --- a/src/main/java/com/kqp/inventorytabs/interf/TabManagerContainer.java +++ b/src/main/java/com/kqp/inventorytabs/interf/TabManagerContainer.java @@ -2,14 +2,10 @@ import com.kqp.inventorytabs.tabs.TabManager; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - /** * Interface for holding the tab manager. Gets injected into - * {@link net.minecraft.client.MinecraftClient}. + * {@link net.minecraft.client.Minecraft}. */ -@Environment(EnvType.CLIENT) public interface TabManagerContainer { TabManager getTabManager(); } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/CartographyTableScreenTabAdder.java b/src/main/java/com/kqp/inventorytabs/mixin/CartographyTableScreenTabAdder.java index c17bc229..352a40cf 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/CartographyTableScreenTabAdder.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/CartographyTableScreenTabAdder.java @@ -8,21 +8,21 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.CartographyTableScreen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.CartographyTableScreen; -@Environment(EnvType.CLIENT) +// ponytail: 1.21.1's renderBg no longer calls renderBackground (that moved up into render()), +// so the old INVOKE-after-renderBackground target is gone. Inject at renderBg HEAD instead; +// tabs render outside the panel bounds so ordering vs the panel blit is irrelevant. @Mixin(CartographyTableScreen.class) public class CartographyTableScreenTabAdder { - @Inject(method = "drawBackground", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/ingame/CartographyTableScreen;renderBackground(Lnet/minecraft/client/util/math/MatrixStack;)V")) - protected void drawBackgroundTabs(MatrixStack matrices, float delta, int mouseX, int mouseY, + @Inject(method = "renderBg", at = @At("HEAD")) + protected void drawBackgroundTabs(GuiGraphics guiGraphics, float delta, int mouseX, int mouseY, CallbackInfo callbackInfo) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.tabRenderer.renderBackground(matrices); + tabManager.tabRenderer.renderBackground(guiGraphics); } } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/ControlsListWidget$KeyBindingEntryMixin_SoftConflict.java b/src/main/java/com/kqp/inventorytabs/mixin/ControlsListWidget$KeyBindingEntryMixin_SoftConflict.java deleted file mode 100644 index 5aaba9d2..00000000 --- a/src/main/java/com/kqp/inventorytabs/mixin/ControlsListWidget$KeyBindingEntryMixin_SoftConflict.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.kqp.inventorytabs.mixin; - -import com.kqp.inventorytabs.init.InventoryTabsClient; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.MutableText; -import org.spongepowered.asm.mixin.Final; -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.ModifyArg; - -import net.minecraft.client.gui.screen.option.ControlsListWidget; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.util.Formatting; -import org.spongepowered.asm.mixin.injection.Redirect; - -/** - * The 'Tab' keybinding conflicts with the multiplayer player list keybind, but since you can only see the player list when outside the inventory - * anyways, the conflict can be soft and not hard. - */ -@Mixin(ControlsListWidget.KeyBindingEntry.class) -public class ControlsListWidget$KeyBindingEntryMixin_SoftConflict { - @Shadow @Final private KeyBinding binding; - - @ModifyArg(method = "render", index = 5, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawableHelper;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V")) - public int fill(MatrixStack matrices, int x1, int y1, int x2, int y2, int color) { - if(this.binding == InventoryTabsClient.NEXT_TAB_KEY_BIND) { - return Formatting.GOLD.getColorValue() | 0xFF000000; - } - return color; - } - - @Redirect(method="update", at=@At(value="INVOKE", target="Lnet/minecraft/text/MutableText;formatted(Lnet/minecraft/util/Formatting;)Lnet/minecraft/text/MutableText;")) - public MutableText formatText(MutableText instance, Formatting formatting) { - if(formatting == Formatting.RED && this.binding == InventoryTabsClient.NEXT_TAB_KEY_BIND) { - return instance.formatted(Formatting.GOLD); - } - return instance.formatted(formatting); - } -} diff --git a/src/main/java/com/kqp/inventorytabs/mixin/KeyBindingMixin_SoftConflict.java b/src/main/java/com/kqp/inventorytabs/mixin/KeyBindingMixin_SoftConflict.java deleted file mode 100644 index 92bd4dba..00000000 --- a/src/main/java/com/kqp/inventorytabs/mixin/KeyBindingMixin_SoftConflict.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.kqp.inventorytabs.mixin; - -import java.util.Map; -import java.util.Objects; - -import com.kqp.inventorytabs.init.InventoryTabsClient; -import org.spongepowered.asm.mixin.Final; -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.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; - -@Mixin(KeyBinding.class) -public abstract class KeyBindingMixin_SoftConflict { - @Shadow @Final private static Map KEYS_BY_ID; - - @Shadow private InputUtil.Key boundKey; - - @Shadow private int timesPressed; - - @Shadow public abstract void setPressed(boolean pressed); - - @Shadow private boolean pressed; - - @Inject(method = "onKeyPressed", at = @At(value = "FIELD", target = "Lnet/minecraft/client/option/KeyBinding;timesPressed:I"), - locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) - private static void onKeyPressed(InputUtil.Key key, CallbackInfo ci, KeyBinding binding) { - KeyBindingMixin_SoftConflict alternative = (KeyBindingMixin_SoftConflict) (Object) findAlternative(key, binding, InventoryTabsClient.NEXT_TAB_KEY_BIND); - if(alternative != null) { - alternative.timesPressed++; - ci.cancel(); - } - } - - @Inject(method = "setKeyPressed", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/KeyBinding;setPressed(Z)V"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) - private static void keyPressed(InputUtil.Key key, boolean pressed, CallbackInfo ci, KeyBinding keyBinding) { - KeyBinding alternative = findAlternative(key, keyBinding, InventoryTabsClient.NEXT_TAB_KEY_BIND); - if(alternative != null) { - alternative.setPressed(pressed); - ci.cancel(); - } - } - - private static KeyBinding findAlternative(InputUtil.Key key, KeyBinding binding, KeyBinding alternativeTo) { - Screen screen = MinecraftClient.getInstance().currentScreen; - if(binding == alternativeTo && !InventoryTabsClient.screenSupported(screen)) { - for(KeyBinding value : KEYS_BY_ID.values()) { - KeyBindingMixin_SoftConflict self = (KeyBindingMixin_SoftConflict) (Object) value; - InputUtil.Key bound = self.boundKey; - if(Objects.equals(bound, key) && value != alternativeTo) { - return value; - } - } - } - return null; - } -} diff --git a/src/main/java/com/kqp/inventorytabs/mixin/KeyBindsListMixin_SoftConflict.java b/src/main/java/com/kqp/inventorytabs/mixin/KeyBindsListMixin_SoftConflict.java new file mode 100644 index 00000000..826c0130 --- /dev/null +++ b/src/main/java/com/kqp/inventorytabs/mixin/KeyBindsListMixin_SoftConflict.java @@ -0,0 +1,42 @@ +package com.kqp.inventorytabs.mixin; + +import com.kqp.inventorytabs.init.InventoryTabs; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.options.controls.KeyBindsList; +import net.minecraft.network.chat.MutableComponent; + +import org.spongepowered.asm.mixin.Final; +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * The 'Tab' keybinding conflicts with the multiplayer player list keybind, but since you can only see the player list when outside the inventory + * anyways, the conflict can be soft and not hard. This recolors the conflict indicator for the Tab keybind from red to gold. + */ +@Mixin(KeyBindsList.KeyEntry.class) +public class KeyBindsListMixin_SoftConflict { + @Shadow @Final private KeyMapping key; + + @ModifyArg(method = "render", index = 4, at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;fill(IIIII)V")) + public int fill(int minX, int minY, int maxX, int maxY, int color) { + if (this.key == InventoryTabs.NEXT_TAB_KEY_BIND) { + Integer gold = ChatFormatting.GOLD.getColor(); + return (gold == null ? 0 : gold) | 0xFF000000; + } + return color; + } + + @Redirect(method = "refreshEntry", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/MutableComponent;withStyle(Lnet/minecraft/ChatFormatting;)Lnet/minecraft/network/chat/MutableComponent;")) + public MutableComponent formatText(MutableComponent instance, ChatFormatting formatting) { + if (formatting == ChatFormatting.RED && this.key == InventoryTabs.NEXT_TAB_KEY_BIND) { + return instance.withStyle(ChatFormatting.GOLD); + } + return instance.withStyle(formatting); + } +} diff --git a/src/main/java/com/kqp/inventorytabs/mixin/LoomScreenTabAdder.java b/src/main/java/com/kqp/inventorytabs/mixin/LoomScreenTabAdder.java index b75577bc..054e1d5a 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/LoomScreenTabAdder.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/LoomScreenTabAdder.java @@ -8,21 +8,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.LoomScreen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.LoomScreen; -@Environment(EnvType.CLIENT) +// ponytail: renderBg no longer calls renderBackground in 1.21.1; inject at renderBg HEAD (see CartographyTableScreenTabAdder). @Mixin(LoomScreen.class) public class LoomScreenTabAdder { - @Inject(method = "drawBackground", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/ingame/LoomScreen;renderBackground(Lnet/minecraft/client/util/math/MatrixStack;)V")) - protected void drawBackgroundTabs(MatrixStack matrices, float delta, int mouseX, int mouseY, + @Inject(method = "renderBg", at = @At("HEAD")) + protected void drawBackgroundTabs(GuiGraphics guiGraphics, float delta, int mouseX, int mouseY, CallbackInfo callbackInfo) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.tabRenderer.renderBackground(matrices); + tabManager.tabRenderer.renderBackground(guiGraphics); } } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/ShulkerBoxBlockInvoker.java b/src/main/java/com/kqp/inventorytabs/mixin/ShulkerBoxBlockInvoker.java index 0374485e..04bec71a 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/ShulkerBoxBlockInvoker.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/ShulkerBoxBlockInvoker.java @@ -3,16 +3,16 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.block.entity.ShulkerBoxBlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ShulkerBoxBlock; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.state.BlockState; @Mixin(ShulkerBoxBlock.class) public interface ShulkerBoxBlockInvoker { - @Invoker("canOpen") - public static boolean invokeCanOpen(BlockState state, World world, BlockPos pos, ShulkerBoxBlockEntity entity) { - throw new AssertionError(); - }; + @Invoker("canOpen") + static boolean invokeCanOpen(BlockState state, Level level, BlockPos pos, ShulkerBoxBlockEntity entity) { + throw new AssertionError(); + } } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/StonecutterScreenTabAdder.java b/src/main/java/com/kqp/inventorytabs/mixin/StonecutterScreenTabAdder.java index 5b93942d..27e47d3e 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/StonecutterScreenTabAdder.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/StonecutterScreenTabAdder.java @@ -8,21 +8,19 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.StonecutterScreen; -import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.StonecutterScreen; -@Environment(EnvType.CLIENT) +// ponytail: renderBg no longer calls renderBackground in 1.21.1; inject at renderBg HEAD (see CartographyTableScreenTabAdder). @Mixin(StonecutterScreen.class) public class StonecutterScreenTabAdder { - @Inject(method = "drawBackground", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/client/gui/screen/ingame/StonecutterScreen;renderBackground(Lnet/minecraft/client/util/math/MatrixStack;)V")) - protected void drawBackgroundTabs(MatrixStack matrices, float delta, int mouseX, int mouseY, + @Inject(method = "renderBg", at = @At("HEAD")) + protected void drawBackgroundTabs(GuiGraphics guiGraphics, float delta, int mouseX, int mouseY, CallbackInfo callbackInfo) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.tabRenderer.renderBackground(matrices); + tabManager.tabRenderer.renderBackground(guiGraphics); } } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/TabManagerContainerImplementer.java b/src/main/java/com/kqp/inventorytabs/mixin/TabManagerContainerImplementer.java index 91e45d5a..8fff33ce 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/TabManagerContainerImplementer.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/TabManagerContainerImplementer.java @@ -5,12 +5,9 @@ import org.spongepowered.asm.mixin.Mixin; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; -@Environment(EnvType.CLIENT) -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public class TabManagerContainerImplementer implements TabManagerContainer { private final TabManager tabManager = new TabManager(); diff --git a/src/main/java/com/kqp/inventorytabs/mixin/VanillaScreenTabAdder.java b/src/main/java/com/kqp/inventorytabs/mixin/VanillaScreenTabAdder.java index a43c79f6..759da05d 100644 --- a/src/main/java/com/kqp/inventorytabs/mixin/VanillaScreenTabAdder.java +++ b/src/main/java/com/kqp/inventorytabs/mixin/VanillaScreenTabAdder.java @@ -3,7 +3,7 @@ import java.util.HashSet; import java.util.Set; -import com.kqp.inventorytabs.init.InventoryTabsClient; +import com.kqp.inventorytabs.init.InventoryTabs; import com.kqp.inventorytabs.interf.TabManagerContainer; import com.kqp.inventorytabs.tabs.TabManager; import com.kqp.inventorytabs.tabs.render.TabRenderingHints; @@ -11,52 +11,49 @@ import com.kqp.inventorytabs.tabs.tab.Tab; import com.kqp.inventorytabs.util.ChestUtil; -import net.fabricmc.loader.api.FabricLoader; +import net.neoforged.fml.ModList; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.*; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.phys.BlockHitResult; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.*; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.ChestBlock; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -@Environment(EnvType.CLIENT) -@Mixin(HandledScreen.class) +@Mixin(AbstractContainerScreen.class) public abstract class VanillaScreenTabAdder extends Screen implements TabRenderingHints { - private static final boolean isBRBLoaded = FabricLoader.getInstance().isModLoaded("brb"); // Better Recipe Book compat - - protected VanillaScreenTabAdder(Text title) { + private static final boolean isBRBLoaded = ModList.get().isLoaded("brb"); // Better Recipe Book compat + + protected VanillaScreenTabAdder(Component title) { super(title); } @Inject(method = "init", at = @At("HEAD")) private void initRestoreStack(CallbackInfo callbackInfo) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); if (tabManager.screenOpenedViaTab()) { - tabManager.restoreCursorStack(client.interactionManager, client.player, ((HandledScreen) (Object) this).getScreenHandler()); + tabManager.restoreCursorStack(client.gameMode, client.player, ((AbstractContainerScreen) (Object) this).getMenu()); tabManager.tabOpenedRecently = true; // Preserve value for later } } - + @Inject(method = "init", at = @At("RETURN")) private void initTabRenderer(CallbackInfo callbackInfo) { - if (InventoryTabsClient.screenSupported(this)) { - MinecraftClient client = MinecraftClient.getInstance(); + if (InventoryTabs.screenSupported(this)) { + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.onScreenOpen((HandledScreen) (Object) this); + tabManager.onScreenOpen((AbstractContainerScreen) (Object) this); Tab tabOpened = null; @@ -66,18 +63,18 @@ private void initTabRenderer(CallbackInfo callbackInfo) { // If the screen was NOT opened via tab, // check what block player is looking at for context - if (client.crosshairTarget instanceof BlockHitResult) { - BlockHitResult blockHitResult = (BlockHitResult) client.crosshairTarget; + if (client.hitResult instanceof BlockHitResult) { + BlockHitResult blockHitResult = (BlockHitResult) client.hitResult; BlockPos blockPos = blockHitResult.getBlockPos(); Set matchingBlockPositions = new HashSet<>(); matchingBlockPositions.add(blockPos); // For double chests - World world = client.player.world; - if (world.getBlockState(blockPos).getBlock() instanceof ChestBlock) { - if (ChestUtil.isDouble(world, blockPos)) { - matchingBlockPositions.add(ChestUtil.getOtherChestBlockPos(world, blockPos)); + Level level = client.player.level(); + if (level.getBlockState(blockPos).getBlock() instanceof ChestBlock) { + if (ChestUtil.isDouble(level, blockPos)) { + matchingBlockPositions.add(ChestUtil.getOtherChestBlockPos(level, blockPos)); } } @@ -101,34 +98,34 @@ private void initTabRenderer(CallbackInfo callbackInfo) { } @Inject(method = "render", at = @At("HEAD")) - protected void drawBackgroundTabs(MatrixStack matrices, int mouseX, int mouseY, float delta, + protected void drawBackgroundTabs(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta, CallbackInfo callbackInfo) { - if (InventoryTabsClient.screenSupported(this)) { + if (InventoryTabs.screenSupported(this)) { if (!screenDoesDumbBlock()) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.tabRenderer.renderBackground(matrices); + tabManager.tabRenderer.renderBackground(guiGraphics); } } } @Inject(method = "render", at = @At("TAIL")) - protected void drawForegroundTabs(MatrixStack matrices, int mouseX, int mouseY, float delta, + protected void drawForegroundTabs(GuiGraphics guiGraphics, int mouseX, int mouseY, float delta, CallbackInfo callbackInfo) { - if (InventoryTabsClient.screenSupported(this)) { - MinecraftClient client = MinecraftClient.getInstance(); + if (InventoryTabs.screenSupported(this)) { + Minecraft client = Minecraft.getInstance(); TabManager tabManager = ((TabManagerContainer) client).getTabManager(); - tabManager.tabRenderer.renderForeground(matrices, mouseX, mouseY); - tabManager.tabRenderer.renderHoverTooltips(matrices, mouseX, mouseY); + tabManager.tabRenderer.renderForeground(guiGraphics, mouseX, mouseY); + tabManager.tabRenderer.renderHoverTooltips(guiGraphics, mouseX, mouseY); } } @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable callbackInfo) { - if (InventoryTabsClient.screenSupported(this)) { - TabManager tabManager = ((TabManagerContainer) MinecraftClient.getInstance()).getTabManager(); + if (InventoryTabs.screenSupported(this)) { + TabManager tabManager = ((TabManagerContainer) Minecraft.getInstance()).getTabManager(); if (tabManager.mouseClicked(mouseX, mouseY, button)) { callbackInfo.setReturnValue(true); @@ -138,8 +135,8 @@ public void mouseClicked(double mouseX, double mouseY, int button, CallbackInfoR @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable callbackInfo) { - if (InventoryTabsClient.screenSupported(this)) { - TabManager tabManager = ((TabManagerContainer) MinecraftClient.getInstance()).getTabManager(); + if (InventoryTabs.screenSupported(this)) { + TabManager tabManager = ((TabManagerContainer) Minecraft.getInstance()).getTabManager(); if (tabManager.keyPressed(keyCode, scanCode, modifiers)) { callbackInfo.setReturnValue(true); @@ -150,17 +147,17 @@ public void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoRet @Override public int getTopRowXOffset() { if (!isBRBLoaded) { - HandledScreen screen = (HandledScreen) (Object) this; + AbstractContainerScreen screen = (AbstractContainerScreen) (Object) this; if (screen instanceof InventoryScreen) { - if (((InventoryScreen) screen).getRecipeBookWidget().isOpen()) { + if (((InventoryScreen) screen).getRecipeBookComponent().isVisible()) { return 77; } } else if (screen instanceof AbstractFurnaceScreen) { - if (((AbstractFurnaceScreen) screen).recipeBook.isOpen()) { + if (((AbstractFurnaceScreen) screen).getRecipeBookComponent().isVisible()) { return 77; } } else if (screen instanceof CraftingScreen) { - if (((CraftingScreen) screen).getRecipeBookWidget().isOpen()) { + if (((CraftingScreen) screen).getRecipeBookComponent().isVisible()) { return 77; } } @@ -177,17 +174,17 @@ public int getBottomRowXOffset() { public int getBottomRowYOffset() { return screenNeedsOffset() ? -1 : 0; } - + private boolean screenDoesDumbBlock() { - HandledScreen screen = (HandledScreen) (Object) this; + AbstractContainerScreen screen = (AbstractContainerScreen) (Object) this; return screen instanceof CartographyTableScreen || screen instanceof LoomScreen || screen instanceof StonecutterScreen; } private boolean screenNeedsOffset() { - HandledScreen screen = (HandledScreen) (Object) this; + AbstractContainerScreen screen = (AbstractContainerScreen) (Object) this; - return screen instanceof ShulkerBoxScreen || screen instanceof GenericContainerScreen; + return screen instanceof ShulkerBoxScreen || screen instanceof ContainerScreen; } } diff --git a/src/main/java/com/kqp/inventorytabs/mixin/accessor/AbstractContainerScreenAccessor.java b/src/main/java/com/kqp/inventorytabs/mixin/accessor/AbstractContainerScreenAccessor.java new file mode 100644 index 00000000..d90cf848 --- /dev/null +++ b/src/main/java/com/kqp/inventorytabs/mixin/accessor/AbstractContainerScreenAccessor.java @@ -0,0 +1,15 @@ +package com.kqp.inventorytabs.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; + +@Mixin(AbstractContainerScreen.class) +public interface AbstractContainerScreenAccessor { + @Accessor + int getImageWidth(); + + @Accessor + int getImageHeight(); +} diff --git a/src/main/java/com/kqp/inventorytabs/mixin/accessor/HandledScreenAccessor.java b/src/main/java/com/kqp/inventorytabs/mixin/accessor/HandledScreenAccessor.java deleted file mode 100644 index 13f797be..00000000 --- a/src/main/java/com/kqp/inventorytabs/mixin/accessor/HandledScreenAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.kqp.inventorytabs.mixin.accessor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screen.ingame.HandledScreen; - -@Environment(EnvType.CLIENT) -@Mixin(HandledScreen.class) -public interface HandledScreenAccessor { - @Accessor - int getBackgroundWidth(); - - @Accessor - int getBackgroundHeight(); -} diff --git a/src/main/java/com/kqp/inventorytabs/mixin/accessor/ScreenAccessor.java b/src/main/java/com/kqp/inventorytabs/mixin/accessor/ScreenAccessor.java deleted file mode 100644 index a9785af0..00000000 --- a/src/main/java/com/kqp/inventorytabs/mixin/accessor/ScreenAccessor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kqp.inventorytabs.mixin.accessor; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.render.item.ItemRenderer; - -@Environment(EnvType.CLIENT) -@Mixin(Screen.class) -public interface ScreenAccessor { - @Accessor - ItemRenderer getItemRenderer(); - - @Accessor - TextRenderer getTextRenderer(); -} diff --git a/src/main/java/com/kqp/inventorytabs/tabs/TabManager.java b/src/main/java/com/kqp/inventorytabs/tabs/TabManager.java index a530450b..5200645d 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/TabManager.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/TabManager.java @@ -6,41 +6,39 @@ import java.util.List; import com.kqp.inventorytabs.api.TabProviderRegistry; -import com.kqp.inventorytabs.init.InventoryTabsClient; +import com.kqp.inventorytabs.init.InventoryTabs; import com.kqp.inventorytabs.interf.TabManagerContainer; -import com.kqp.inventorytabs.mixin.accessor.HandledScreenAccessor; +import com.kqp.inventorytabs.mixin.accessor.AbstractContainerScreenAccessor; import com.kqp.inventorytabs.tabs.render.TabRenderInfo; import com.kqp.inventorytabs.tabs.render.TabRenderer; import com.kqp.inventorytabs.tabs.render.TabRenderingHints; import com.kqp.inventorytabs.tabs.tab.Tab; import com.kqp.inventorytabs.util.MouseUtil; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerInteractionManager; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.slot.SlotActionType; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.sound.PositionedSoundInstance; -import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.sound.SoundEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.multiplayer.MultiPlayerGameMode; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.protocol.game.ServerboundContainerClosePacket; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; import static com.kqp.inventorytabs.init.InventoryTabs.*; /** * Manages everything related to tabs. */ -@Environment(EnvType.CLIENT) public class TabManager { public final List tabs; public Tab currentTab; - private HandledScreen currentScreen; + private AbstractContainerScreen currentScreen; public int currentPage = 0; public boolean tabOpenedRecently; public int prevCursorStackSlot = -1; @@ -77,7 +75,7 @@ private void refreshAvailableTabs() { } } - ClientPlayerEntity player = MinecraftClient.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; if (player != null && player.isAlive()) { // Add new tabs @@ -104,8 +102,8 @@ private void refreshAvailableTabs() { public boolean mouseClicked(double mouseX, double mouseY, int button) { if (button == 0) { - int guiWidth = ((HandledScreenAccessor) currentScreen).getBackgroundWidth(); - int guiHeight = ((HandledScreenAccessor) currentScreen).getBackgroundHeight(); + int guiWidth = ((AbstractContainerScreenAccessor) currentScreen).getImageWidth(); + int guiHeight = ((AbstractContainerScreenAccessor) currentScreen).getImageHeight(); int x = (currentScreen.width - guiWidth) / 2; int y = (currentScreen.height - guiHeight) / 2; @@ -159,7 +157,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (InventoryTabsClient.NEXT_TAB_KEY_BIND.matchesKey(keyCode, scanCode)) { + if (InventoryTabs.NEXT_TAB_KEY_BIND.matches(keyCode, scanCode)) { int currentTabIndex = tabs.indexOf(currentTab); if (Screen.hasShiftDown()) { if (currentTabIndex > 0) { @@ -182,25 +180,26 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return false; } - public void onScreenOpen(HandledScreen screen) { + public void onScreenOpen(AbstractContainerScreen screen) { refreshAvailableTabs(); setCurrentScreen(screen); MouseUtil.tryPop(); } - public void restoreCursorStack(ClientPlayerInteractionManager manager, ClientPlayerEntity player, ScreenHandler currentHandler) { + public void restoreCursorStack(MultiPlayerGameMode manager, LocalPlayer player, AbstractContainerMenu currentHandler) { // Try restore the cursor stack if it exists and wasn't dropped. - if (manager!= null && this.prevCursorStackSlot != -1) { - currentHandler.getSlotIndex(player.getInventory(), this.prevCursorStackSlot).ifPresent((screenSlot) ->{ - manager.clickSlot( - currentHandler.syncId, + if (manager != null && this.prevCursorStackSlot != -1) { + int screenSlot = getScreenSlotIndex(currentHandler, player.getInventory(), this.prevCursorStackSlot); + if (screenSlot != -1) { + manager.handleInventoryMouseClick( + currentHandler.containerId, screenSlot, 0, // Mouse Left Click - SlotActionType.PICKUP, + ClickType.PICKUP, player ); - }); + } this.prevCursorStackSlot = -1; } } @@ -213,34 +212,35 @@ public void onTabClick(Tab tab) { // Set tab open flag tabOpenedRecently = true; - MinecraftClient client = MinecraftClient.getInstance(); - ScreenHandler handler = client.player.currentScreenHandler; + Minecraft client = Minecraft.getInstance(); + AbstractContainerMenu handler = client.player.containerMenu; this.prevCursorStackSlot = -1; if (handler != null) { // Preserve the cursor stack - ItemStack prevCursorStack = client.player.currentScreenHandler.getCursorStack(); + ItemStack prevCursorStack = client.player.containerMenu.getCarried(); if (prevCursorStack != null && !prevCursorStack.isEmpty()) { - this.prevCursorStackSlot = client.player.getInventory().getEmptySlot(); + this.prevCursorStackSlot = client.player.getInventory().getFreeSlot(); - if (this.prevCursorStackSlot != -1 && client.interactionManager != null) { + if (this.prevCursorStackSlot != -1 && client.gameMode != null) { // Put the cursor stack there - handler.getSlotIndex(client.player.getInventory(), this.prevCursorStackSlot).ifPresent((screenSlot) -> { - client.interactionManager.clickSlot( - handler.syncId, + int screenSlot = getScreenSlotIndex(handler, client.player.getInventory(), this.prevCursorStackSlot); + if (screenSlot != -1) { + client.gameMode.handleInventoryMouseClick( + handler.containerId, screenSlot, 0, // Mouse Left Click - SlotActionType.PICKUP, + ClickType.PICKUP, client.player ); - }); + } } } // Close any handled screens // This fixes the inventory desync issue - client.getNetworkHandler().sendPacket(new CloseHandledScreenC2SPacket(handler.syncId)); + client.getConnection().send(new ServerboundContainerClosePacket(handler.containerId)); } // Open new tab @@ -248,6 +248,19 @@ public void onTabClick(Tab tab) { tab.open(); } + /** + * Maps an inventory slot index to the containing menu's slot index. + * Replaces yarn ScreenHandler.getSlotIndex(Inventory, int), which has no public mojmaps equivalent. + */ + private static int getScreenSlotIndex(AbstractContainerMenu menu, Container inventory, int slotIndex) { + for (Slot slot : menu.slots) { + if (slot.container == inventory && slot.getContainerSlot() == slotIndex) { + return slot.index; + } + } + return -1; + } + public void onOpenTab(Tab tab) { if (currentTab != null && currentTab != tab) { currentTab.onClose(); @@ -269,17 +282,17 @@ public int pageOf(Tab tab) { } public int getMaxRowLength() { - int guiWidth = ((HandledScreenAccessor) currentScreen).getBackgroundWidth(); + int guiWidth = ((AbstractContainerScreenAccessor) currentScreen).getImageWidth(); int maxRowLength = guiWidth / (TabRenderer.TAB_WIDTH + 1); return maxRowLength; } - public void setCurrentScreen(HandledScreen screen) { + public void setCurrentScreen(AbstractContainerScreen screen) { this.currentScreen = screen; } - public HandledScreen getCurrentScreen() { + public AbstractContainerScreen getCurrentScreen() { return currentScreen; } @@ -334,12 +347,11 @@ public boolean canGoForwardAPage() { } public static TabManager getInstance() { - return ((TabManagerContainer) MinecraftClient.getInstance()).getTabManager(); + return ((TabManagerContainer) Minecraft.getInstance()).getTabManager(); } public static void playClick() { - MinecraftClient.getInstance().getSoundManager() - .play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + Minecraft.getInstance().getSoundManager() + .play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); } } - diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/BlockTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/BlockTabProvider.java index 79c0ba56..13d471fa 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/BlockTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/BlockTabProvider.java @@ -6,11 +6,11 @@ import com.kqp.inventorytabs.tabs.tab.Tab; import com.kqp.inventorytabs.util.BlockUtil; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; /** * Tab provider that exposes tabs based on nearby blocks. @@ -19,16 +19,16 @@ public abstract class BlockTabProvider implements TabProvider { public static final int SEARCH_DISTANCE = 5; @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { - World world = player.world; + public void addAvailableTabs(LocalPlayer player, List tabs) { + Level level = player.level(); // TODO: make this better and check line of sight for (int x = -SEARCH_DISTANCE; x <= SEARCH_DISTANCE; x++) { for (int y = -SEARCH_DISTANCE; y <= SEARCH_DISTANCE; y++) { for (int z = -SEARCH_DISTANCE; z <= SEARCH_DISTANCE; z++) { - BlockPos blockPos = player.getBlockPos().add(x, y, z); + BlockPos blockPos = player.blockPosition().offset(x, y, z); - if (matches(world, blockPos)) { + if (matches(level, blockPos)) { boolean add = false; if (InventoryTabs.getConfig().doSightChecksFlag) { @@ -38,17 +38,17 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { add = true; } } else { - Vec3d playerHead = player.getPos().add(0D, player.getEyeHeight(player.getPose()), 0D); - Vec3d blockVec = new Vec3d(blockPos.getX() + 0.5D, blockPos.getY() + 0.5D, + Vec3 playerHead = player.position().add(0D, player.getEyeHeight(), 0D); + Vec3 blockVec = new Vec3(blockPos.getX() + 0.5D, blockPos.getY() + 0.5D, blockPos.getZ() + 0.5D); - if (blockVec.subtract(playerHead).lengthSquared() <= SEARCH_DISTANCE * SEARCH_DISTANCE) { + if (blockVec.subtract(playerHead).lengthSqr() <= SEARCH_DISTANCE * SEARCH_DISTANCE) { add = true; } } if (add) { - Tab tab = createTab(world, blockPos); + Tab tab = createTab(level, blockPos); if (!tabs.contains(tab)) { tabs.add(tab); @@ -63,18 +63,18 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { /** * Checks to see if block at passsed block position matches criteria. * - * @param world + * @param level * @param pos * @return */ - public abstract boolean matches(World world, BlockPos pos); + public abstract boolean matches(Level level, BlockPos pos); /** * Method to create tabs. * - * @param world + * @param level * @param pos * @return */ - public abstract Tab createTab(World world, BlockPos pos); + public abstract Tab createTab(Level level, BlockPos pos); } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/ChestTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/ChestTabProvider.java index d021dfc7..f4d08922 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/ChestTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/ChestTabProvider.java @@ -3,28 +3,28 @@ import com.kqp.inventorytabs.tabs.tab.ChestTab; import com.kqp.inventorytabs.tabs.tab.Tab; import com.kqp.inventorytabs.util.ChestUtil; -import net.minecraft.block.Block; -import net.minecraft.block.ChestBlock; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ChestBlock; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** * Provides tabs for chests. Limits double chests to having only one tab and * takes into account if it's blocked. */ public class ChestTabProvider extends BlockTabProvider { - private final Set chestBlocks = new HashSet<>(); + private final Set chestBlocks = new HashSet<>(); @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); Set tabsToRemove = new HashSet<>(); @@ -32,15 +32,15 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { List chestTabs = tabs.stream().filter(tab -> tab instanceof ChestTab).map(tab -> (ChestTab) tab) .filter(tab -> chestBlocks.contains(tab.blockId)).toList(); - World world = player.world; + Level level = player.level(); // Add any chests that are blocked - chestTabs.stream().filter(tab -> ChestBlock.isChestBlocked(world, tab.blockPos)).forEach(tabsToRemove::add); + chestTabs.stream().filter(tab -> ChestBlock.isChestBlockedAt(level, tab.blockPos)).forEach(tabsToRemove::add); for (ChestTab tab : chestTabs) { if (!tabsToRemove.contains(tab)) { - if (ChestUtil.isDouble(world, tab.blockPos)) { - tabsToRemove.add(new ChestTab(tab.blockId, ChestUtil.getOtherChestBlockPos(world, tab.blockPos))); + if (ChestUtil.isDouble(level, tab.blockPos)) { + tabsToRemove.add(new ChestTab(tab.blockId, ChestUtil.getOtherChestBlockPos(level, tab.blockPos))); } } } @@ -49,30 +49,30 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } public void addChestBlock(Block block) { - chestBlocks.add(Registries.BLOCK.getId(block)); + chestBlocks.add(BuiltInRegistries.BLOCK.getKey(block)); } - public void addChestBlock(Identifier blockId) { + public void addChestBlock(ResourceLocation blockId) { chestBlocks.add(blockId); } - public void removeChestBlockId(Identifier blockId) { + public void removeChestBlockId(ResourceLocation blockId) { chestBlocks.remove(blockId); } - public Set getChestBlockIds() { + public Set getChestBlockIds() { return this.chestBlocks; } @Override - public boolean matches(World world, BlockPos pos) { - Block block = world.getBlockState(pos).getBlock(); + public boolean matches(Level level, BlockPos pos) { + Block block = level.getBlockState(pos).getBlock(); - return chestBlocks.contains(Registries.BLOCK.getId(block)); + return chestBlocks.contains(BuiltInRegistries.BLOCK.getKey(block)); } @Override - public Tab createTab(World world, BlockPos pos) { - return new ChestTab(Registries.BLOCK.getId(world.getBlockState(pos).getBlock()), pos); + public Tab createTab(Level level, BlockPos pos) { + return new ChestTab(BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos).getBlock()), pos); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/EnderChestTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/EnderChestTabProvider.java index f9e8250b..22aa066c 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/EnderChestTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/EnderChestTabProvider.java @@ -3,17 +3,16 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import com.kqp.inventorytabs.tabs.tab.ChestTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.block.Blocks; -import net.minecraft.block.ChestBlock; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ChestBlock; /** * Provides tabs for ender chests. Limits amount of ender chest tabs to only one @@ -21,18 +20,18 @@ */ public class EnderChestTabProvider extends BlockTabProvider { @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); Set tabsToRemove = new HashSet<>(); List chestTabs = tabs.stream().filter(tab -> tab instanceof ChestTab).map(tab -> (ChestTab) tab) - .filter(tab -> tab.blockId == Registries.BLOCK.getId(Blocks.ENDER_CHEST)).toList(); + .filter(tab -> tab.blockId == BuiltInRegistries.BLOCK.getKey(Blocks.ENDER_CHEST)).toList(); - World world = player.world; + Level level = player.level(); // Add any chests that are blocked - chestTabs.stream().filter(tab -> ChestBlock.isChestBlocked(world, tab.blockPos)).forEach(tabsToRemove::add); + chestTabs.stream().filter(tab -> ChestBlock.isChestBlockedAt(level, tab.blockPos)).forEach(tabsToRemove::add); boolean found = false; @@ -50,12 +49,12 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } @Override - public boolean matches(World world, BlockPos pos) { - return world.getBlockState(pos).getBlock() == Blocks.ENDER_CHEST; + public boolean matches(Level level, BlockPos pos) { + return level.getBlockState(pos).getBlock() == Blocks.ENDER_CHEST; } @Override - public Tab createTab(World world, BlockPos pos) { - return new ChestTab(Registries.BLOCK.getId(Blocks.ENDER_CHEST), pos); + public Tab createTab(Level level, BlockPos pos) { + return new ChestTab(BuiltInRegistries.BLOCK.getKey(Blocks.ENDER_CHEST), pos); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/EntityTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/EntityTabProvider.java index e6d69508..ae3b30ae 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/EntityTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/EntityTabProvider.java @@ -1,35 +1,36 @@ package com.kqp.inventorytabs.tabs.provider; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.InventoryOwner; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.InventoryChangedListener; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerListener; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.npc.InventoryCarrier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; import java.util.List; public abstract class EntityTabProvider implements TabProvider { public static final int SEARCH_DISTANCE = 5; @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { - World world = player.world; - List entityList = world.getNonSpectatingEntities(Entity.class, new Box(player.getBlockPos().getX()-SEARCH_DISTANCE, player.getBlockPos().getY()-SEARCH_DISTANCE, player.getBlockPos().getZ()-SEARCH_DISTANCE, player.getBlockPos().getX()+SEARCH_DISTANCE, player.getBlockPos().getY()+SEARCH_DISTANCE, player.getBlockPos().getZ()+SEARCH_DISTANCE)); + public void addAvailableTabs(LocalPlayer player, List tabs) { + Level level = player.level(); + List entityList = level.getEntitiesOfClass(Entity.class, new AABB(player.blockPosition().getX()-SEARCH_DISTANCE, player.blockPosition().getY()-SEARCH_DISTANCE, player.blockPosition().getZ()-SEARCH_DISTANCE, player.blockPosition().getX()+SEARCH_DISTANCE, player.blockPosition().getY()+SEARCH_DISTANCE, player.blockPosition().getZ()+SEARCH_DISTANCE)); for (Entity entity : entityList) { - if (!(entity instanceof PlayerEntity) && ((entity instanceof Inventory) || (entity instanceof InventoryOwner) || (entity instanceof InventoryChangedListener))) { + if (!(entity instanceof Player) && ((entity instanceof Container) || (entity instanceof InventoryCarrier) || (entity instanceof ContainerListener))) { if (matches(entity)) { boolean add = false; - Vec3d playerHead = player.getPos().add(0D, player.getEyeHeight(player.getPose()), 0D); - Vec3d blockVec = new Vec3d(entity.getX() + 0.5D, entity.getY() + 0.5D, + Vec3 playerHead = player.position().add(0D, player.getEyeHeight(), 0D); + Vec3 blockVec = new Vec3(entity.getX() + 0.5D, entity.getY() + 0.5D, entity.getZ() + 0.5D); - if (blockVec.subtract(playerHead).lengthSquared() <= SEARCH_DISTANCE * SEARCH_DISTANCE) { + if (blockVec.subtract(playerHead).lengthSqr() <= SEARCH_DISTANCE * SEARCH_DISTANCE) { add = true; } @@ -60,4 +61,4 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { * @return */ public abstract Tab createTab(Entity entity); -} \ No newline at end of file +} diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/InventoryTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/InventoryTabProvider.java index ac3489eb..c7d03f50 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/InventoryTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/InventoryTabProvider.java @@ -2,11 +2,12 @@ import com.kqp.inventorytabs.tabs.tab.InventoryTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import java.util.HashSet; import java.util.List; @@ -14,11 +15,11 @@ import java.util.stream.Collectors; public class InventoryTabProvider implements TabProvider { - private static final Set inventoryItems = new HashSet<>(); + private static final Set inventoryItems = new HashSet<>(); @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { - Set itemSet = inventoryItems.stream().map(Registries.ITEM::get).collect(Collectors.toSet()); + public void addAvailableTabs(LocalPlayer player, List tabs) { + Set itemSet = inventoryItems.stream().map(BuiltInRegistries.ITEM::get).collect(Collectors.toSet()); for (Item item : itemSet) { if (player.getInventory().contains(new ItemStack(item))) { Tab tab = new InventoryTab(item); @@ -29,16 +30,16 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } } - public void addItem(Identifier blockId) { + public void addItem(ResourceLocation blockId) { inventoryItems.add(blockId); } - public Set getItemIds() { + public Set getItemIds() { return inventoryItems; } public static Set getItems() { - return inventoryItems.stream().map(Registries.ITEM::get).collect(Collectors.toSet()); + return inventoryItems.stream().map(BuiltInRegistries.ITEM::get).collect(Collectors.toSet()); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/LecternTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/LecternTabProvider.java index 643e01f0..4314bc59 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/LecternTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/LecternTabProvider.java @@ -2,37 +2,36 @@ import com.kqp.inventorytabs.tabs.tab.SimpleBlockTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.LecternBlockEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.LecternBlockEntity; +import net.minecraft.world.level.block.state.BlockState; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; -import static net.minecraft.block.LecternBlock.HAS_BOOK; -//import static net.minecraft.state.property.Properties.HAS_BOOK; +import static net.minecraft.world.level.block.LecternBlock.HAS_BOOK; public class LecternTabProvider extends BlockTabProvider { @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); Set tabsToRemove = new HashSet<>(); List lecternTabs = tabs.stream().filter(tab -> tab instanceof SimpleBlockTab).map(tab -> (SimpleBlockTab) tab) - .filter(tab -> tab.blockId == Registries.BLOCK.getId(Blocks.LECTERN)).toList(); + .filter(tab -> tab.blockId == BuiltInRegistries.BLOCK.getKey(Blocks.LECTERN)).toList(); lecternTabs.stream().filter(tab -> { - BlockEntity blockEntity = player.world.getBlockEntity(tab.blockPos); + BlockEntity blockEntity = player.level().getBlockEntity(tab.blockPos); if (blockEntity instanceof LecternBlockEntity) { - BlockState blockState = player.world.getBlockState(tab.blockPos); + BlockState blockState = player.level().getBlockState(tab.blockPos); - return !blockState.get(HAS_BOOK); + return !blockState.getValue(HAS_BOOK); } return false; @@ -42,12 +41,12 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } @Override - public boolean matches(World world, BlockPos pos) { + public boolean matches(Level level, BlockPos pos) { return false; } @Override - public Tab createTab(World world, BlockPos pos) { + public Tab createTab(Level level, BlockPos pos) { return null; } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/PlayerInventoryTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/PlayerInventoryTabProvider.java index 099c300f..20f1db88 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/PlayerInventoryTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/PlayerInventoryTabProvider.java @@ -5,11 +5,11 @@ import com.kqp.inventorytabs.tabs.tab.PlayerInventoryTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.player.LocalPlayer; public class PlayerInventoryTabProvider implements TabProvider { @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { for (Tab tab : tabs) { if (tab instanceof PlayerInventoryTab) { return; diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/ShulkerBoxTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/ShulkerBoxTabProvider.java index 5559a59d..13bf03d6 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/ShulkerBoxTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/ShulkerBoxTabProvider.java @@ -3,43 +3,42 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import com.kqp.inventorytabs.mixin.ShulkerBoxBlockInvoker; import com.kqp.inventorytabs.tabs.tab.SimpleBlockTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.block.BlockState; -import net.minecraft.block.ShulkerBoxBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.ShulkerBoxBlockEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ShulkerBoxBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.state.BlockState; /** * Provides tabs for shulker boxes. Takes into account if it's blocked. */ public class ShulkerBoxTabProvider extends BlockTabProvider { @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); Set tabsToRemove = new HashSet<>(); List shulkerTabs = tabs.stream().filter(tab -> tab instanceof SimpleBlockTab) .map(tab -> (SimpleBlockTab) tab) - .filter(tab -> Registries.BLOCK.get(tab.blockId) instanceof ShulkerBoxBlock).toList(); + .filter(tab -> BuiltInRegistries.BLOCK.get(tab.blockId) instanceof ShulkerBoxBlock).toList(); // Add any chests that are blocked shulkerTabs.stream().filter(tab -> { - BlockEntity blockEntity = player.world.getBlockEntity(tab.blockPos); + BlockEntity blockEntity = player.level().getBlockEntity(tab.blockPos); if (blockEntity instanceof ShulkerBoxBlockEntity) { - BlockState blockState = player.world.getBlockState(tab.blockPos); + BlockState blockState = player.level().getBlockState(tab.blockPos); - return !ShulkerBoxBlockInvoker.invokeCanOpen(blockState, player.world, tab.blockPos, + return !ShulkerBoxBlockInvoker.invokeCanOpen(blockState, player.level(), tab.blockPos, (ShulkerBoxBlockEntity) blockEntity); } @@ -50,12 +49,12 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } @Override - public boolean matches(World world, BlockPos pos) { - return world.getBlockState(pos).getBlock() instanceof ShulkerBoxBlock; + public boolean matches(Level level, BlockPos pos) { + return level.getBlockState(pos).getBlock() instanceof ShulkerBoxBlock; } @Override - public Tab createTab(World world, BlockPos pos) { - return new SimpleBlockTab(Registries.BLOCK.getId(world.getBlockState(pos).getBlock()), pos); + public Tab createTab(Level level, BlockPos pos) { + return new SimpleBlockTab(BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos).getBlock()), pos); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleBlockTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleBlockTabProvider.java index 6af97287..6374a787 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleBlockTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleBlockTabProvider.java @@ -7,55 +7,55 @@ import com.kqp.inventorytabs.tabs.tab.SimpleBlockTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; /** * Provides tabs for simple blocks. */ public class SimpleBlockTabProvider extends BlockTabProvider { - private final Set blockIds = new HashSet<>(); + private final Set blockIds = new HashSet<>(); public SimpleBlockTabProvider() { } public void addBlock(Block block) { - blockIds.add(Registries.BLOCK.getId(block)); + blockIds.add(BuiltInRegistries.BLOCK.getKey(block)); } - public void addBlock(Identifier identifier) { + public void addBlock(ResourceLocation identifier) { blockIds.add(identifier); } public void removeBlock(Block block) { - blockIds.remove(Registries.BLOCK.getId(block)); + blockIds.remove(BuiltInRegistries.BLOCK.getKey(block)); } - public void removeBlock(Identifier identifier) { + public void removeBlock(ResourceLocation identifier) { blockIds.remove(identifier); } - public Set getBlockIds() { + public Set getBlockIds() { return this.blockIds; } public Set getBlocks() { - return this.blockIds.stream().map(Registries.BLOCK::get).collect(Collectors.toSet()); + return this.blockIds.stream().map(BuiltInRegistries.BLOCK::get).collect(Collectors.toSet()); } @Override - public boolean matches(World world, BlockPos pos) { - BlockState blockState = world.getBlockState(pos); + public boolean matches(Level level, BlockPos pos) { + BlockState blockState = level.getBlockState(pos); - return blockIds.contains(Registries.BLOCK.getId(blockState.getBlock())); + return blockIds.contains(BuiltInRegistries.BLOCK.getKey(blockState.getBlock())); } @Override - public Tab createTab(World world, BlockPos pos) { - return new SimpleBlockTab(Registries.BLOCK.getId(world.getBlockState(pos).getBlock()), pos); + public Tab createTab(Level level, BlockPos pos) { + return new SimpleBlockTab(BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos).getBlock()), pos); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleEntityTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleEntityTabProvider.java index abe9eb57..47b2fe3a 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleEntityTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/SimpleEntityTabProvider.java @@ -2,36 +2,35 @@ import com.kqp.inventorytabs.tabs.tab.SimpleEntityTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; import java.util.HashSet; import java.util.List; import java.util.Set; public class SimpleEntityTabProvider extends EntityTabProvider { - private final Set entities = new HashSet<>(); + private final Set entities = new HashSet<>(); public SimpleEntityTabProvider() { } @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); Set tabsToRemove = new HashSet<>(); List entityTabs = tabs.stream().filter(tab -> tab instanceof SimpleEntityTab).map(tab -> (SimpleEntityTab) tab) .filter(tab -> entities.contains(tab.entityId)).toList(); - World world = player.world; } @Override public boolean matches(Entity entity) { - return entities.contains(new Identifier("minecraft:entity.minecraft.chest_minecart")); + return entities.contains(ResourceLocation.parse("minecraft:entity.minecraft.chest_minecart")); } - public void addEntity(Identifier entityId) { + public void addEntity(ResourceLocation entityId) { entities.add(entityId); } @@ -39,4 +38,4 @@ public void addEntity(Identifier entityId) { public Tab createTab(Entity entity) { return new SimpleEntityTab(entity); } -} \ No newline at end of file +} diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/TabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/TabProvider.java index 039ce5bf..1534cd67 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/TabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/TabProvider.java @@ -4,11 +4,11 @@ import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.player.LocalPlayer; /** * Base interface for exposing tabs to the player. */ public interface TabProvider { - void addAvailableTabs(ClientPlayerEntity player, List tabs); + void addAvailableTabs(LocalPlayer player, List tabs); } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/provider/UniqueTabProvider.java b/src/main/java/com/kqp/inventorytabs/tabs/provider/UniqueTabProvider.java index fe943237..3c1e5c56 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/provider/UniqueTabProvider.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/provider/UniqueTabProvider.java @@ -2,12 +2,13 @@ import com.kqp.inventorytabs.tabs.tab.SimpleBlockTab; import com.kqp.inventorytabs.tabs.tab.Tab; -import net.minecraft.block.Block; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; + +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import java.util.*; @@ -15,12 +16,12 @@ * Provides tabs for blocks that should only have one tab at a time (e.g. Crafting Tables). **/ public class UniqueTabProvider extends BlockTabProvider { - private final Set uniqueBlocks = new HashSet<>(); + private final Set uniqueBlocks = new HashSet<>(); @Override - public void addAvailableTabs(ClientPlayerEntity player, List tabs) { + public void addAvailableTabs(LocalPlayer player, List tabs) { super.addAvailableTabs(player, tabs); - Set tabsToRemove = new HashSet<>(); + Set tabsToRemove = new HashSet<>(); List craftingTableTabs = tabs.stream().filter(tab -> tab instanceof SimpleBlockTab).map(tab -> (SimpleBlockTab) tab) .filter(tab -> uniqueBlocks.contains(tab.blockId)).toList(); @@ -32,23 +33,23 @@ public void addAvailableTabs(ClientPlayerEntity player, List tabs) { } public void addUniqueBlock(Block block) { - uniqueBlocks.add(Registries.BLOCK.getId(block)); + uniqueBlocks.add(BuiltInRegistries.BLOCK.getKey(block)); } - public void addUniqueBlock(Identifier blockId) { + public void addUniqueBlock(ResourceLocation blockId) { uniqueBlocks.add(blockId); } - public void removeUniqueBlockId(Identifier blockId) { + public void removeUniqueBlockId(ResourceLocation blockId) { uniqueBlocks.remove(blockId); } @Override - public boolean matches(World world, BlockPos pos) { - return uniqueBlocks.contains(Registries.BLOCK.getId(world.getBlockState(pos).getBlock())); + public boolean matches(Level level, BlockPos pos) { + return uniqueBlocks.contains(BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos).getBlock())); } @Override - public Tab createTab(World world, BlockPos pos) { - return new SimpleBlockTab(Registries.BLOCK.getId(world.getBlockState(pos).getBlock()), pos); + public Tab createTab(Level level, BlockPos pos) { + return new SimpleBlockTab(BuiltInRegistries.BLOCK.getKey(level.getBlockState(pos).getBlock()), pos); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderInfo.java b/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderInfo.java index 710345dd..8427fc6c 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderInfo.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderInfo.java @@ -2,13 +2,9 @@ import com.kqp.inventorytabs.tabs.tab.Tab; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - /** * Data class that describes how a tab should be rendered. */ -@Environment(EnvType.CLIENT) public class TabRenderInfo { public Tab tabReference; public int index; diff --git a/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderer.java b/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderer.java index cebf2487..2056dcf9 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderer.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/render/TabRenderer.java @@ -3,28 +3,27 @@ import java.awt.Rectangle; import com.kqp.inventorytabs.init.InventoryTabs; -import com.kqp.inventorytabs.mixin.accessor.HandledScreenAccessor; +import com.kqp.inventorytabs.mixin.accessor.AbstractContainerScreenAccessor; import com.kqp.inventorytabs.tabs.TabManager; import com.kqp.inventorytabs.tabs.tab.Tab; import com.mojang.blaze3d.systems.RenderSystem; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.resources.ResourceLocation; import static com.kqp.inventorytabs.init.InventoryTabs.*; /** * Handles the rendering of tabs. */ -@Environment(EnvType.CLIENT) public class TabRenderer { - private static final Identifier TABS_TEXTURE = new Identifier("textures/gui/container/creative_inventory/tabs.png"); - private static final Identifier BUTTONS_TEXTURE = InventoryTabs.id("textures/gui/buttons.png"); + // The vanilla creative_inventory/tabs.png atlas was removed in 1.21.1 and split into per-position + // sprites under textures/gui/sprites/container/creative_inventory/. We reference those vanilla + // sprites via blitSprite (see tabSprite / renderTab) instead of a single U/V atlas. + private static final ResourceLocation BUTTONS_TEXTURE = InventoryTabs.id("textures/gui/buttons.png"); public static final int TAB_WIDTH = 26; public static final int TAB_HEIGHT = 32; @@ -41,8 +40,8 @@ public TabRenderer(TabManager tabManager) { this.tabManager = tabManager; } - public void renderBackground(MatrixStack matrices) { - matrices.push(); + public void renderBackground(GuiGraphics guiGraphics) { + guiGraphics.pose().pushPose(); tabRenderInfos = getTabRenderInfos(); @@ -51,38 +50,34 @@ public void renderBackground(MatrixStack matrices) { if (tabRenderInfo != null) { if (tabRenderInfo.tabReference != tabManager.currentTab) { - renderTab(matrices, tabRenderInfo); + renderTab(guiGraphics, tabRenderInfo); } } } - matrices.pop(); + guiGraphics.pose().popPose(); } - public void renderForeground(MatrixStack matrices, double mouseX, double mouseY) { - RenderSystem.setShaderTexture(0, TABS_TEXTURE); - + public void renderForeground(GuiGraphics guiGraphics, double mouseX, double mouseY) { for (int i = 0; i < tabRenderInfos.length; i++) { TabRenderInfo tabRenderInfo = tabRenderInfos[i]; if (tabRenderInfo != null) { if (tabRenderInfo.tabReference == tabManager.currentTab) { - renderTab(matrices, tabRenderInfo); + renderTab(guiGraphics, tabRenderInfo); } } } - drawButtons(matrices, mouseX, mouseY); + drawButtons(guiGraphics, mouseX, mouseY); - drawPageText(matrices); + drawPageText(guiGraphics); } - private void drawButtons(MatrixStack matrices, double mouseX, double mouseY) { - HandledScreen currentScreen = tabManager.getCurrentScreen(); - - RenderSystem.setShaderTexture(0, BUTTONS_TEXTURE); + private void drawButtons(GuiGraphics guiGraphics, double mouseX, double mouseY) { + AbstractContainerScreen currentScreen = tabManager.getCurrentScreen(); - int width = ((HandledScreenAccessor) currentScreen).getBackgroundWidth(); - int height = ((HandledScreenAccessor) currentScreen).getBackgroundHeight(); + int width = ((AbstractContainerScreenAccessor) currentScreen).getImageWidth(); + int height = ((AbstractContainerScreenAccessor) currentScreen).getImageHeight(); int oX = (currentScreen.width - width) / 2; int oY = (currentScreen.height - height) / 2; @@ -95,7 +90,7 @@ private void drawButtons(MatrixStack matrices, double mouseX, double mouseY) { int u = 0; u += tabManager.canGoBackAPage() && hovered ? BUTTON_WIDTH * 2 : 0; int v = tabManager.canGoBackAPage() ? 0 : 13; - currentScreen.drawTexture(matrices, x, y, u, v, BUTTON_WIDTH, BUTTON_HEIGHT); + guiGraphics.blit(BUTTONS_TEXTURE, x, y, u, v, BUTTON_WIDTH, BUTTON_HEIGHT); // Drawing forward button x = oX + width + 4; @@ -106,19 +101,15 @@ private void drawButtons(MatrixStack matrices, double mouseX, double mouseY) { u = 15; u += tabManager.canGoForwardAPage() && hovered ? BUTTON_WIDTH * 2 : 0; v = tabManager.canGoForwardAPage() ? 0 : 13; - currentScreen.drawTexture(matrices, x, y, u, v, BUTTON_WIDTH, BUTTON_HEIGHT); + guiGraphics.blit(BUTTONS_TEXTURE, x, y, u, v, BUTTON_WIDTH, BUTTON_HEIGHT); } - private void drawPageText(MatrixStack matrices) { + private void drawPageText(GuiGraphics guiGraphics) { if (tabManager.getMaxPages() > 1 && pageTextRefreshTime > 0) { - // RenderSystem.pushMatrix(); - // TODO: Figure out rendering - int color = 0xFFFFFFFF; if (pageTextRefreshTime <= 20) { RenderSystem.enableBlend(); - // RenderSystem.disableAlphaTest(); RenderSystem.defaultBlendFunc(); RenderSystem.colorMask(true, true, true, true); float transparency = pageTextRefreshTime / 20F; @@ -127,34 +118,47 @@ private void drawPageText(MatrixStack matrices) { color = ((int) (0xFF * transparency) << 24) | color; } - HandledScreen currentScreen = tabManager.getCurrentScreen(); - TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + AbstractContainerScreen currentScreen = tabManager.getCurrentScreen(); + Font font = Minecraft.getInstance().font; - int height = ((HandledScreenAccessor) currentScreen).getBackgroundHeight(); + int height = ((AbstractContainerScreenAccessor) currentScreen).getImageHeight(); int oX = currentScreen.width; int oY = (currentScreen.height - height) / 2; String text = (tabManager.currentPage + 1) + " / " + (tabManager.getMaxPages() + 1); - int x = (oX - textRenderer.getWidth(text)) / 2; + int x = (oX - font.width(text)) / 2; int y = oY - 34; - MinecraftClient.getInstance().textRenderer.draw(matrices, text, x, y, color); - - // RenderSystem.popMatrix(); + guiGraphics.drawString(font, text, x, y, color); } } - private void renderTab(MatrixStack matrices, TabRenderInfo tabRenderInfo) { - HandledScreen currentScreen = tabManager.getCurrentScreen(); + private void renderTab(GuiGraphics guiGraphics, TabRenderInfo tabRenderInfo) { + AbstractContainerScreen currentScreen = tabManager.getCurrentScreen(); - RenderSystem.setShaderTexture(0, TABS_TEXTURE); - currentScreen.drawTexture(matrices, tabRenderInfo.x, tabRenderInfo.y, tabRenderInfo.texU, tabRenderInfo.texV, + guiGraphics.blitSprite(tabSprite(tabRenderInfo), tabRenderInfo.x, tabRenderInfo.y, tabRenderInfo.texW, tabRenderInfo.texH); - tabRenderInfo.tabReference.renderTabIcon(matrices, tabRenderInfo, currentScreen); + tabRenderInfo.tabReference.renderTabIcon(guiGraphics, tabRenderInfo, currentScreen); + } + + /** + * Picks the vanilla creative-tab sprite for a tab. The texU/texV values computed in + * {@link #getTabRenderInfos()} still encode the same four states the old atlas did + * (top/bottom row, selected, and first-in-row vs middle), so we derive the sprite from them. + * Vanilla numbers sprites 1..7 per column; the mod only needs a rounded left cap (1) vs a + * middle piece (2). + */ + private static ResourceLocation tabSprite(TabRenderInfo info) { + boolean top = info.texV == 0 || info.texV == 32; + boolean selected = info.texV == 32 || info.texV == 96; + boolean first = info.texU == 0; + return ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_" + + (top ? "top" : "bottom") + "_" + (selected ? "selected" : "unselected") + + "_" + (first ? "1" : "2")); } - public void renderHoverTooltips(MatrixStack matrices, double mouseX, double mouseY) { + public void renderHoverTooltips(GuiGraphics guiGraphics, double mouseX, double mouseY) { for (int i = 0; i < tabRenderInfos.length; i++) { TabRenderInfo tabRenderInfo = tabRenderInfos[i]; @@ -162,15 +166,15 @@ public void renderHoverTooltips(MatrixStack matrices, double mouseX, double mous Rectangle itemRec = new Rectangle(tabRenderInfo.itemX, tabRenderInfo.itemY, 16, 16); if (itemRec.contains(mouseX, mouseY)) { - tabManager.getCurrentScreen().renderTooltip(matrices, tabRenderInfo.tabReference.getHoverText(), - (int) mouseX, (int) mouseY); + guiGraphics.renderTooltip(Minecraft.getInstance().font, + tabRenderInfo.tabReference.getHoverText(), (int) mouseX, (int) mouseY); } } } } public TabRenderInfo[] getTabRenderInfos() { - HandledScreen currentScreen = tabManager.getCurrentScreen(); + AbstractContainerScreen currentScreen = tabManager.getCurrentScreen(); int maxRowLength = tabManager.getMaxRowLength(); int numVisibleTabs; @@ -187,8 +191,8 @@ public TabRenderInfo[] getTabRenderInfos() { TabRenderInfo[] tabRenderInfo = new TabRenderInfo[numVisibleTabs]; - int x = (currentScreen.width - ((HandledScreenAccessor) currentScreen).getBackgroundWidth()) / 2; - int y = (currentScreen.height - ((HandledScreenAccessor) currentScreen).getBackgroundHeight()) / 2; + int x = (currentScreen.width - ((AbstractContainerScreenAccessor) currentScreen).getImageWidth()) / 2; + int y = (currentScreen.height - ((AbstractContainerScreenAccessor) currentScreen).getImageHeight()) / 2; for (int i = 0; i < numVisibleTabs; i++) { if (startingIndex + i < tabManager.tabs.size()) { @@ -218,9 +222,9 @@ public TabRenderInfo[] getTabRenderInfos() { tabInfo.y = y - 28; } else { if(isBigInvLoaded) { - tabInfo.y = y + ((HandledScreenAccessor) currentScreen).getBackgroundHeight() + 32; + tabInfo.y = y + ((AbstractContainerScreenAccessor) currentScreen).getImageHeight() + 32; } else { - tabInfo.y = y + ((HandledScreenAccessor) currentScreen).getBackgroundHeight() - 4; + tabInfo.y = y + ((AbstractContainerScreenAccessor) currentScreen).getImageHeight() - 4; } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/ChestTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/ChestTab.java index 5cd32be0..ed14c674 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/ChestTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/ChestTab.java @@ -1,23 +1,21 @@ package com.kqp.inventorytabs.tabs.tab; -import com.kqp.inventorytabs.mixin.accessor.ScreenAccessor; import com.kqp.inventorytabs.tabs.render.TabRenderInfo; import com.kqp.inventorytabs.util.ChestUtil; -import net.minecraft.block.ChestBlock; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.phys.AABB; import java.util.ArrayList; import java.util.List; @@ -30,16 +28,14 @@ */ public class ChestTab extends SimpleBlockTab { ItemStack itemStack; - public ChestTab(Identifier blockId, BlockPos blockPos) { + public ChestTab(ResourceLocation blockId, BlockPos blockPos) { super(blockId, blockPos); - this.itemStack = new ItemStack(Registries.BLOCK.get(blockId)); + this.itemStack = new ItemStack(BuiltInRegistries.BLOCK.get(blockId)); } @Override public boolean shouldBeRemoved() { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - - if (ChestBlock.isChestBlocked(player.world, blockPos)) { + if (ChestBlock.isChestBlockedAt(Minecraft.getInstance().player.level(), blockPos)) { return true; } @@ -47,39 +43,37 @@ public boolean shouldBeRemoved() { } @Override - public Text getHoverText() { - if (itemStack.hasCustomName()) { - return itemStack.getName(); + public Component getHoverText() { + if (itemStack.has(DataComponents.CUSTOM_NAME)) { + return itemStack.getHoverName(); } return super.getHoverText(); } @Override - public void renderTabIcon(MatrixStack matrices, TabRenderInfo tabRenderInfo, HandledScreen currentScreen) { + public void renderTabIcon(GuiGraphics guiGraphics, TabRenderInfo tabRenderInfo, AbstractContainerScreen currentScreen) { ItemStack itemStack = getItemFrame(); - ItemRenderer itemRenderer = ((ScreenAccessor) currentScreen).getItemRenderer(); - TextRenderer textRenderer = ((ScreenAccessor) currentScreen).getTextRenderer(); - matrices.push(); - matrices.translate(0, 0, 100.0F); - itemRenderer.renderInGuiWithOverrides(matrices, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - matrices.pop(); + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(0, 0, 100.0F); + guiGraphics.renderItem(itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.renderItemDecorations(Minecraft.getInstance().font, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.pose().popPose(); } public ItemStack getItemFrame() { - World world = MinecraftClient.getInstance().player.world; - itemStack = new ItemStack(world.getBlockState(blockPos).getBlock()); - BlockPos doubleChestPos = ChestUtil.isDouble(world, blockPos) ? getOtherChestBlockPos(world, blockPos) : blockPos; - Box box = new Box(blockPos, doubleChestPos); + Level level = Minecraft.getInstance().player.level(); + itemStack = new ItemStack(level.getBlockState(blockPos).getBlock()); + BlockPos doubleChestPos = ChestUtil.isDouble(level, blockPos) ? getOtherChestBlockPos(level, blockPos) : blockPos; + AABB box = AABB.encapsulatingFullBlocks(blockPos, doubleChestPos); double x = box.minX; double y = box.minY; double z = box.minZ; double x1 = box.maxX; double y1 = box.maxY; double z1 = box.maxZ; - List list1 = world.getNonSpectatingEntities(ItemFrameEntity.class, new Box(x-0.8, y, z, x1+1.8, y1+0.8, z1+0.8)); - List list2 = world.getNonSpectatingEntities(ItemFrameEntity.class, new Box(x, y, z-0.8, x1+0.8, y1+0.8, z1+1.8)); - List list3 = world.getNonSpectatingEntities(ItemFrameEntity.class, new Box(x, y-0.8, z, x1+0.8, y1+1.8, z1+0.8)); - List list = new ArrayList<>(); + List list1 = level.getEntitiesOfClass(ItemFrame.class, new AABB(x-0.8, y, z, x1+1.8, y1+0.8, z1+0.8)); + List list2 = level.getEntitiesOfClass(ItemFrame.class, new AABB(x, y, z-0.8, x1+0.8, y1+0.8, z1+1.8)); + List list3 = level.getEntitiesOfClass(ItemFrame.class, new AABB(x, y-0.8, z, x1+0.8, y1+1.8, z1+0.8)); + List list = new ArrayList<>(); Stream.of(list1, list2, list3).forEach(list::addAll); if (!list.isEmpty()) { - itemStack = list.get(0).getHeldItemStack(); + itemStack = list.get(0).getItem(); } return itemStack; } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/InventoryTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/InventoryTab.java index b23c6b9a..2f8cef8d 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/InventoryTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/InventoryTab.java @@ -1,11 +1,12 @@ package com.kqp.inventorytabs.tabs.tab; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; public class InventoryTab extends Tab { public final Item itemId; @@ -16,27 +17,21 @@ public InventoryTab(Item itemId) { @Override public void open() { - System.out.println("TESTING: Opening inventory tab"); - ClientPlayerEntity player = MinecraftClient.getInstance().player; - World world = MinecraftClient.getInstance().world; - System.out.println("Player: "+player); - System.out.println("World: "+world); - System.out.println("Item: "+itemId); - System.out.println("ItemStack: "+new ItemStack(itemId)); - System.out.println("Active hand: "+player.getActiveHand()); + // ponytail: dropped System.out debug spam that fired on every tab open. + LocalPlayer player = Minecraft.getInstance().player; + Level level = Minecraft.getInstance().level; Item item = new ItemStack(itemId).getItem(); - item.use(world, player, player.getActiveHand()); - //itemId.use(world, player, player.getActiveHand()); + item.use(level, player, InteractionHand.MAIN_HAND); } @Override public boolean shouldBeRemoved() { - ClientPlayerEntity player = MinecraftClient.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; return (player == null || !player.getInventory().contains(new ItemStack(itemId))); } @Override - public Text getHoverText() { - return Text.literal(itemId.getName().getString()); + public Component getHoverText() { + return Component.literal(itemId.getDescription().getString()); } } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/PlayerInventoryTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/PlayerInventoryTab.java index 827079f7..9f26c975 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/PlayerInventoryTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/PlayerInventoryTab.java @@ -1,10 +1,12 @@ package com.kqp.inventorytabs.tabs.tab; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.InventoryScreen; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.ResolvableProfile; +import net.minecraft.world.level.block.Blocks; /** * Tab for the player's inventory. @@ -16,7 +18,7 @@ public PlayerInventoryTab() { @Override public void open() { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); client.setScreen(new InventoryScreen(client.player)); } @@ -26,8 +28,8 @@ public boolean shouldBeRemoved() { } @Override - public Text getHoverText() { - return Text.literal("Inventory"); + public Component getHoverText() { + return Component.literal("Inventory"); } @Override @@ -42,8 +44,8 @@ public int getPriority() { private static ItemStack getRenderItemStack() { ItemStack itemStack = new ItemStack(Blocks.PLAYER_HEAD); - itemStack.getOrCreateNbt().putString("SkullOwner", - MinecraftClient.getInstance().player.getGameProfile().getName()); + itemStack.set(DataComponents.PROFILE, + new ResolvableProfile(Minecraft.getInstance().player.getGameProfile())); return itemStack; } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/ShulkerBoxTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/ShulkerBoxTab.java index f79f139f..16e4803e 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/ShulkerBoxTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/ShulkerBoxTab.java @@ -2,32 +2,32 @@ import com.kqp.inventorytabs.mixin.ShulkerBoxBlockInvoker; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.ShulkerBoxBlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.state.BlockState; /** * Tab for shulker boxes. */ public class ShulkerBoxTab extends SimpleBlockTab { - public ShulkerBoxTab(Identifier blockId, BlockPos blockPos) { + public ShulkerBoxTab(ResourceLocation blockId, BlockPos blockPos) { super(blockId, blockPos); } @Override public boolean shouldBeRemoved() { - ClientPlayerEntity player = MinecraftClient.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; - BlockEntity blockEntity = player.world.getBlockEntity(blockPos); + BlockEntity blockEntity = player.level().getBlockEntity(blockPos); if (blockEntity instanceof ShulkerBoxBlockEntity) { - BlockState blockState = player.world.getBlockState(blockPos); + BlockState blockState = player.level().getBlockState(blockPos); - return !ShulkerBoxBlockInvoker.invokeCanOpen(blockState, player.world, blockPos, + return !ShulkerBoxBlockInvoker.invokeCanOpen(blockState, player.level(), blockPos, (ShulkerBoxBlockEntity) blockEntity); } diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleBlockTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleBlockTab.java index a34fd029..4a07a986 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleBlockTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleBlockTab.java @@ -6,62 +6,60 @@ import com.kqp.inventorytabs.tabs.provider.BlockTabProvider; import com.kqp.inventorytabs.util.BlockUtil; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.command.argument.EntityAnchorArgumentType; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.commands.arguments.EntityAnchorArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.Nameable; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; /** * Generic tab for blocks. */ public class SimpleBlockTab extends Tab { - public final Identifier blockId; + public final ResourceLocation blockId; public final BlockPos blockPos; - public SimpleBlockTab(Identifier blockId, BlockPos blockPos) { - super(new ItemStack(MinecraftClient.getInstance().player.world.getBlockState(blockPos).getBlock())); + public SimpleBlockTab(ResourceLocation blockId, BlockPos blockPos) { + super(new ItemStack(Minecraft.getInstance().player.level().getBlockState(blockPos).getBlock())); this.blockId = blockId; this.blockPos = blockPos; } @Override public void open() { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); BlockHitResult hitResult; if (InventoryTabs.getConfig().doSightChecksFlag) { hitResult = BlockUtil.getLineOfSight(blockPos, client.player, 5D); } else { - hitResult = new BlockHitResult(Vec3d.ofCenter(blockPos), Direction.EAST, blockPos, false); + hitResult = new BlockHitResult(Vec3.atCenterOf(blockPos), Direction.EAST, blockPos, false); } if (hitResult != null) { if (InventoryTabs.getConfig().rotatePlayer) { - MinecraftClient.getInstance().player.lookAt(EntityAnchorArgumentType.EntityAnchor.EYES, - Vec3d.ofCenter(blockPos)); + client.player.lookAt(EntityAnchorArgument.Anchor.EYES, Vec3.atCenterOf(blockPos)); } - MinecraftClient.getInstance().interactionManager.interactBlock(client.player, - Hand.MAIN_HAND, hitResult); + client.gameMode.useItemOn(client.player, InteractionHand.MAIN_HAND, hitResult); } } @Override public boolean shouldBeRemoved() { - ClientPlayerEntity player = MinecraftClient.getInstance().player; + LocalPlayer player = Minecraft.getInstance().player; - if (!Registries.BLOCK.getId(player.world.getBlockState(blockPos).getBlock()).equals(blockId)) { + if (!BuiltInRegistries.BLOCK.getKey(player.level().getBlockState(blockPos).getBlock()).equals(blockId)) { return true; } @@ -72,30 +70,24 @@ public boolean shouldBeRemoved() { return !BlockUtil.inRange(blockPos, player, 5D); } } - Vec3d playerHead = player.getPos().add(0D, player.getEyeHeight(player.getPose()), 0D); + Vec3 playerHead = player.position().add(0D, player.getEyeHeight(), 0D); - return Vec3d.ofCenter(blockPos).subtract(playerHead).lengthSquared() > BlockTabProvider.SEARCH_DISTANCE + return Vec3.atCenterOf(blockPos).subtract(playerHead).lengthSqr() > BlockTabProvider.SEARCH_DISTANCE * BlockTabProvider.SEARCH_DISTANCE; } @Override - public Text getHoverText() { - World world = MinecraftClient.getInstance().player.world; + public Component getHoverText() { + Level level = Minecraft.getInstance().player.level(); - BlockEntity blockEntity = world.getBlockEntity(blockPos); + BlockEntity blockEntity = level.getBlockEntity(blockPos); - if (blockEntity != null) { - NbtCompound tag = new NbtCompound(); - blockEntity.writeNbt(tag); // had to use an accesswidener for this in 1.18 - - if (tag.contains("CustomName", 8)) { - return Text.Serializer.fromJson(tag.getString("CustomName")); - } + if (blockEntity instanceof Nameable nameable && nameable.hasCustomName()) { + return nameable.getCustomName(); } - return Text.translatable(world.getBlockState(blockPos).getBlock().getTranslationKey()); - + return Component.translatable(level.getBlockState(blockPos).getBlock().getDescriptionId()); } @Override diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleEntityTab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleEntityTab.java index 5c83f941..5917d9bf 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleEntityTab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/SimpleEntityTab.java @@ -1,38 +1,38 @@ package com.kqp.inventorytabs.tabs.tab; -import com.kqp.inventorytabs.mixin.accessor.ScreenAccessor; import com.kqp.inventorytabs.tabs.render.TabRenderInfo; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.phys.Vec3; + import java.util.Objects; public class SimpleEntityTab extends Tab { - public final Vec3d entityPos; - public final Identifier entityId; + public final Vec3 entityPos; + public final ResourceLocation entityId; public final Entity entity; public SimpleEntityTab(Entity entity) { - super(new ItemStack(Registries.ITEM.get(new Identifier("minecraft", "barrier")))); + super(new ItemStack(Items.BARRIER)); this.entity = entity; - this.entityPos = entity.getPos(); - this.entityId = EntityType.getId(entity.getType()); + this.entityPos = entity.position(); + this.entityId = BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()); } @Override public void open() { - ClientPlayerEntity player = MinecraftClient.getInstance().player; - MinecraftClient.getInstance().interactionManager.interactEntity(player, entity, player.getActiveHand()); + LocalPlayer player = Minecraft.getInstance().player; + Minecraft.getInstance().gameMode.interact(player, entity, InteractionHand.MAIN_HAND); } @Override @@ -40,24 +40,22 @@ public boolean shouldBeRemoved() { if (entity.isRemoved()) { return true; } - return entityPos.distanceTo(MinecraftClient.getInstance().player.getPos()) > 5; + return entityPos.distanceTo(Minecraft.getInstance().player.position()) > 5; } @Override - public Text getHoverText() { + public Component getHoverText() { return entity.getName(); } @Override - public void renderTabIcon(MatrixStack matrices, TabRenderInfo tabRenderInfo, HandledScreen currentScreen) { + public void renderTabIcon(GuiGraphics guiGraphics, TabRenderInfo tabRenderInfo, AbstractContainerScreen currentScreen) { ItemStack itemStack = getItemStack(); - ItemRenderer itemRenderer = ((ScreenAccessor) currentScreen).getItemRenderer(); - TextRenderer textRenderer = ((ScreenAccessor) currentScreen).getTextRenderer(); - matrices.push(); - matrices.translate(0, 0, 100.0F); - itemRenderer.renderInGuiWithOverrides(matrices, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - matrices.pop(); + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(0, 0, 100.0F); + guiGraphics.renderItem(itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.renderItemDecorations(Minecraft.getInstance().font, itemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.pose().popPose(); } @Override @@ -78,6 +76,7 @@ public int hashCode() { } public ItemStack getItemStack() { - return entity.getPickBlockStack() != null ? entity.getPickBlockStack() : new ItemStack(Registries.ITEM.get(new Identifier("minecraft", "barrier"))); + ItemStack pick = entity.getPickResult(); + return pick != null ? pick : new ItemStack(Items.BARRIER); } -} \ No newline at end of file +} diff --git a/src/main/java/com/kqp/inventorytabs/tabs/tab/Tab.java b/src/main/java/com/kqp/inventorytabs/tabs/tab/Tab.java index 259e187a..87a6a29e 100644 --- a/src/main/java/com/kqp/inventorytabs/tabs/tab/Tab.java +++ b/src/main/java/com/kqp/inventorytabs/tabs/tab/Tab.java @@ -1,21 +1,16 @@ package com.kqp.inventorytabs.tabs.tab; -import com.kqp.inventorytabs.mixin.accessor.ScreenAccessor; import com.kqp.inventorytabs.tabs.render.TabRenderInfo; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; /** * Base interface for tabs. */ -@Environment(EnvType.CLIENT) public abstract class Tab { private final ItemStack renderItemStack; @@ -41,7 +36,7 @@ protected Tab(ItemStack renderItemStack) { * * @return */ - public abstract Text getHoverText(); + public abstract Component getHoverText(); /** * Called when the screen associated with the tab is closed. @@ -62,19 +57,15 @@ public int getPriority() { /** * Renders the tab's icon * - * @param matrices MatrixStack + * @param guiGraphics GuiGraphics * @param tabRenderInfo TabRenderInfo - * @param currentScreen HandledScreen + * @param currentScreen AbstractContainerScreen */ - @Environment(EnvType.CLIENT) - public void renderTabIcon(MatrixStack matrices, TabRenderInfo tabRenderInfo, HandledScreen currentScreen) { - ItemRenderer itemRenderer = ((ScreenAccessor) currentScreen).getItemRenderer(); - TextRenderer textRenderer = ((ScreenAccessor) currentScreen).getTextRenderer(); - matrices.push(); - matrices.translate(0, 0, 100.0F); - // RenderSystem.enableRescaleNormal(); - itemRenderer.renderInGuiWithOverrides(matrices, renderItemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, renderItemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); - matrices.pop(); + public void renderTabIcon(GuiGraphics guiGraphics, TabRenderInfo tabRenderInfo, AbstractContainerScreen currentScreen) { + guiGraphics.pose().pushPose(); + guiGraphics.pose().translate(0, 0, 100.0F); + guiGraphics.renderItem(renderItemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.renderItemDecorations(Minecraft.getInstance().font, renderItemStack, tabRenderInfo.itemX, tabRenderInfo.itemY); + guiGraphics.pose().popPose(); } } diff --git a/src/main/java/com/kqp/inventorytabs/util/BlockUtil.java b/src/main/java/com/kqp/inventorytabs/util/BlockUtil.java index 01ef3401..3e8de12a 100644 --- a/src/main/java/com/kqp/inventorytabs/util/BlockUtil.java +++ b/src/main/java/com/kqp/inventorytabs/util/BlockUtil.java @@ -1,42 +1,42 @@ package com.kqp.inventorytabs.util; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; public class BlockUtil { - public static boolean inRange(BlockPos pos, PlayerEntity player, double distance) { + public static boolean inRange(BlockPos pos, Player player, double distance) { double distanceSquared = distance * distance; - Vec3d playerHead = player.getPos().add(0D, player.getEyeHeight(player.getPose()), 0D); - Vec3d blockVec = new Vec3d(pos.getX(), pos.getY(), pos.getZ()); + Vec3 playerHead = player.position().add(0D, player.getEyeHeight(), 0D); + Vec3 blockVec = new Vec3(pos.getX(), pos.getY(), pos.getZ()); - for (Vec3d sightOffset : SIGHT_OFFSETS) { - if (blockVec.add(sightOffset).squaredDistanceTo(playerHead) <= distanceSquared) { + for (Vec3 sightOffset : SIGHT_OFFSETS) { + if (blockVec.add(sightOffset).distanceToSqr(playerHead) <= distanceSquared) { return true; } } return false; } - public static BlockHitResult getLineOfSight(BlockPos pos, PlayerEntity player, double distance) { - World world = player.world; - BlockState blockState = world.getBlockState(pos); + public static BlockHitResult getLineOfSight(BlockPos pos, Player player, double distance) { + Level level = player.level(); + BlockState blockState = level.getBlockState(pos); double distanceSquared = distance * distance; - Vec3d playerHead = player.getPos().add(0D, player.getEyeHeight(player.getPose()), 0D); - Vec3d blockVec = new Vec3d(pos.getX(), pos.getY(), pos.getZ()); + Vec3 playerHead = player.position().add(0D, player.getEyeHeight(), 0D); + Vec3 blockVec = new Vec3(pos.getX(), pos.getY(), pos.getZ()); - for (Vec3d sightOffset : SIGHT_OFFSETS) { - Vec3d blockPosCheck = blockVec.add(sightOffset); + for (Vec3 sightOffset : SIGHT_OFFSETS) { + Vec3 blockPosCheck = blockVec.add(sightOffset); - BlockHitResult result = getBlockHitResult(playerHead, blockPosCheck, distanceSquared, world, pos, + BlockHitResult result = getBlockHitResult(playerHead, blockPosCheck, distanceSquared, level, pos, blockState); if (result != null) { @@ -49,14 +49,14 @@ public static BlockHitResult getLineOfSight(BlockPos pos, PlayerEntity player, d return null; } - private static BlockHitResult getBlockHitResult(Vec3d playerHead, Vec3d blockVec, double distanceSquared, - World world, BlockPos pos, BlockState blockState) { - if (blockVec.subtract(playerHead).lengthSquared() >= distanceSquared) { + private static BlockHitResult getBlockHitResult(Vec3 playerHead, Vec3 blockVec, double distanceSquared, + Level level, BlockPos pos, BlockState blockState) { + if (blockVec.subtract(playerHead).lengthSqr() >= distanceSquared) { return null; } - BlockHitResult result = world.raycast(new RaycastContext(playerHead, blockVec, RaycastContext.ShapeType.OUTLINE, - RaycastContext.FluidHandling.NONE, MinecraftClient.getInstance().player)); + BlockHitResult result = level.clip(new ClipContext(playerHead, blockVec, ClipContext.Block.OUTLINE, + ClipContext.Fluid.NONE, Minecraft.getInstance().player)); if (result != null && result.getType() == HitResult.Type.BLOCK && result.getBlockPos().equals(pos)) { return result; @@ -65,25 +65,25 @@ private static BlockHitResult getBlockHitResult(Vec3d playerHead, Vec3d blockVec return null; } - private static final Vec3d[] SIGHT_OFFSETS = { + private static final Vec3[] SIGHT_OFFSETS = { // Center - new Vec3d(0.5D, 0.5D, 0.5D), + new Vec3(0.5D, 0.5D, 0.5D), // Corners - new Vec3d(0.0D, 0.0D, 0.0D), new Vec3d(1.0D, 0.0D, 0.0D), new Vec3d(0.0D, 1.0D, 0.0D), - new Vec3d(0.0D, 0.0D, 1.0D), new Vec3d(1.0D, 1.0D, 0.0D), new Vec3d(0.0D, 1.0D, 1.0D), - new Vec3d(1.0D, 0.0D, 1.0D), new Vec3d(1.0D, 1.0D, 1.0D), + new Vec3(0.0D, 0.0D, 0.0D), new Vec3(1.0D, 0.0D, 0.0D), new Vec3(0.0D, 1.0D, 0.0D), + new Vec3(0.0D, 0.0D, 1.0D), new Vec3(1.0D, 1.0D, 0.0D), new Vec3(0.0D, 1.0D, 1.0D), + new Vec3(1.0D, 0.0D, 1.0D), new Vec3(1.0D, 1.0D, 1.0D), // Side centers - new Vec3d(0.5D, 0D, 0.5D), new Vec3d(0.5D, 1D, 0.5D), new Vec3d(0.0D, 0.5D, 0.5D), - new Vec3d(1.0D, 0.5D, 0.5D), new Vec3d(0.5D, 0.5D, 0.0D), new Vec3d(0.5D, 0.5D, 1.0D), + new Vec3(0.5D, 0D, 0.5D), new Vec3(0.5D, 1D, 0.5D), new Vec3(0.0D, 0.5D, 0.5D), + new Vec3(1.0D, 0.5D, 0.5D), new Vec3(0.5D, 0.5D, 0.0D), new Vec3(0.5D, 0.5D, 1.0D), // Corners, slightly in - new Vec3d(0.2D, 0.2D, 0.2D), new Vec3d(0.8D, 0.2D, 0.2D), new Vec3d(0.2D, 0.8D, 0.2D), - new Vec3d(0.2D, 0.2D, 0.8D), new Vec3d(0.8D, 0.8D, 0.2D), new Vec3d(0.2D, 0.8D, 0.8D), - new Vec3d(0.8D, 0.2D, 0.8D), new Vec3d(0.8D, 0.8D, 0.8D), + new Vec3(0.2D, 0.2D, 0.2D), new Vec3(0.8D, 0.2D, 0.2D), new Vec3(0.2D, 0.8D, 0.2D), + new Vec3(0.2D, 0.2D, 0.8D), new Vec3(0.8D, 0.8D, 0.2D), new Vec3(0.2D, 0.8D, 0.8D), + new Vec3(0.8D, 0.2D, 0.8D), new Vec3(0.8D, 0.8D, 0.8D), // Side centers, slightly in - new Vec3d(0.5D, 0.2D, 0.5D), new Vec3d(0.5D, 0.8D, 0.5D), new Vec3d(0.2D, 0.5D, 0.5D), - new Vec3d(0.8D, 0.5D, 0.5D), new Vec3d(0.5D, 0.5D, 0.2D), new Vec3d(0.5D, 0.5D, 0.8D), }; + new Vec3(0.5D, 0.2D, 0.5D), new Vec3(0.5D, 0.8D, 0.5D), new Vec3(0.2D, 0.5D, 0.5D), + new Vec3(0.8D, 0.5D, 0.5D), new Vec3(0.5D, 0.5D, 0.2D), new Vec3(0.5D, 0.5D, 0.8D), }; } diff --git a/src/main/java/com/kqp/inventorytabs/util/ChestUtil.java b/src/main/java/com/kqp/inventorytabs/util/ChestUtil.java index 9b3796ac..6e202683 100644 --- a/src/main/java/com/kqp/inventorytabs/util/ChestUtil.java +++ b/src/main/java/com/kqp/inventorytabs/util/ChestUtil.java @@ -1,37 +1,37 @@ package com.kqp.inventorytabs.util; -import net.minecraft.block.BlockState; -import net.minecraft.block.ChestBlock; -import net.minecraft.block.enums.ChestType; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.ChestBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.ChestType; public class ChestUtil { - public static boolean isDouble(World world, BlockPos blockPos) { - BlockState blockState = world.getBlockState(blockPos); - if (blockState.contains(Properties.CHEST_TYPE)) { - ChestType type = blockState.get(ChestBlock.CHEST_TYPE); + public static boolean isDouble(Level level, BlockPos blockPos) { + BlockState blockState = level.getBlockState(blockPos); + if (blockState.hasProperty(BlockStateProperties.CHEST_TYPE)) { + ChestType type = blockState.getValue(ChestBlock.TYPE); return type == ChestType.LEFT || type == ChestType.RIGHT; } return false; } - public static BlockPos getOtherChestBlockPos(World world, BlockPos blockPos) { - BlockState blockState = world.getBlockState(blockPos); + public static BlockPos getOtherChestBlockPos(Level level, BlockPos blockPos) { + BlockState blockState = level.getBlockState(blockPos); - Direction facing = blockState.get(ChestBlock.FACING); + Direction facing = blockState.getValue(ChestBlock.FACING); Direction otherBlockDir; - ChestType type = blockState.get(ChestBlock.CHEST_TYPE); + ChestType type = blockState.getValue(ChestBlock.TYPE); if (type == ChestType.LEFT) { - otherBlockDir = facing.rotateYClockwise(); + otherBlockDir = facing.getClockWise(); } else { - otherBlockDir = facing.rotateYCounterclockwise(); + otherBlockDir = facing.getCounterClockWise(); } - return blockPos.offset(otherBlockDir); + return blockPos.relative(otherBlockDir); } } diff --git a/src/main/java/com/kqp/inventorytabs/util/MouseUtil.java b/src/main/java/com/kqp/inventorytabs/util/MouseUtil.java index 15af1da0..26832986 100644 --- a/src/main/java/com/kqp/inventorytabs/util/MouseUtil.java +++ b/src/main/java/com/kqp/inventorytabs/util/MouseUtil.java @@ -5,15 +5,13 @@ import org.lwjgl.BufferUtils; import org.lwjgl.glfw.GLFW; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.util.InputUtil; +import com.mojang.blaze3d.platform.InputConstants; + +import net.minecraft.client.Minecraft; /** * Utility class for manipulating the client's mouse position. */ -@Environment(EnvType.CLIENT) public class MouseUtil { private static double mouseX = -1D, mouseY = -1D; @@ -24,7 +22,7 @@ public static void push() { public static void tryPop() { if (mouseX != -1D && mouseY != -1D) { - InputUtil.setCursorParameters(MinecraftClient.getInstance().getWindow().getHandle(), 212993, mouseX, + InputConstants.grabOrReleaseMouse(Minecraft.getInstance().getWindow().getWindow(), 212993, mouseX, mouseY); mouseX = -1D; @@ -34,14 +32,14 @@ public static void tryPop() { public static double getMouseX() { DoubleBuffer mouseBuf = BufferUtils.createDoubleBuffer(1); - GLFW.glfwGetCursorPos(MinecraftClient.getInstance().getWindow().getHandle(), mouseBuf, null); + GLFW.glfwGetCursorPos(Minecraft.getInstance().getWindow().getWindow(), mouseBuf, null); return mouseBuf.get(0); } public static double getMouseY() { DoubleBuffer mouseBuf = BufferUtils.createDoubleBuffer(1); - GLFW.glfwGetCursorPos(MinecraftClient.getInstance().getWindow().getHandle(), null, mouseBuf); + GLFW.glfwGetCursorPos(Minecraft.getInstance().getWindow().getWindow(), null, mouseBuf); return mouseBuf.get(0); } diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml new file mode 100644 index 00000000..c8f54af6 --- /dev/null +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,37 @@ +modLoader = "javafml" +loaderVersion = "[4,)" +license = "MIT" +issueTrackerURL = "https://github.com/Andrew6rant/inventorytabs/issues" + +[[mods]] +modId = "inventorytabs" +version = "${version}" +displayName = "Inventory Tabs" +description = '''Adds tabs to your inventory that lead to nearby blocks.''' +authors = "KQP, LiamMCW, Andrew6rant (Andrew Grant)" +logoFile = "assets/inventorytabs/icon.png" +displayURL = "https://github.com/Andrew6rant/inventorytabs" + +[[mixins]] +config = "inventorytabs.mixins.json" + +[[dependencies.inventorytabs]] +modId = "neoforge" +type = "required" +versionRange = "[21.1.0,21.2)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.inventorytabs]] +modId = "minecraft" +type = "required" +versionRange = "[1.21.1,1.21.2)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.inventorytabs]] +modId = "cloth_config" +type = "required" +versionRange = "[15.0,)" +ordering = "AFTER" +side = "CLIENT" diff --git a/src/main/resources/data/inventorytabs/tags/blocks/mod_compat_blacklist.json b/src/main/resources/data/inventorytabs/tags/block/mod_compat_blacklist.json similarity index 100% rename from src/main/resources/data/inventorytabs/tags/blocks/mod_compat_blacklist.json rename to src/main/resources/data/inventorytabs/tags/block/mod_compat_blacklist.json diff --git a/src/main/resources/data/techreborn/tags/blocks/block_entities_without_inventories.json b/src/main/resources/data/techreborn/tags/block/block_entities_without_inventories.json similarity index 100% rename from src/main/resources/data/techreborn/tags/blocks/block_entities_without_inventories.json rename to src/main/resources/data/techreborn/tags/block/block_entities_without_inventories.json diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json deleted file mode 100644 index 3b4709b4..00000000 --- a/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "schemaVersion": 1, - "id": "inventorytabs", - "version": "${version}", - "name": "Inventory Tabs", - "description": "Adds tabs to your inventory that lead to nearby blocks.", - "authors": [ - "KQP", - "LiamMCW", - "Andrew6rant (Andrew Grant)" - ], - "contact": { - "homepage": "https://github.com/Andrew6rant/inventorytabs", - "sources": "https://github.com/Andrew6rant/inventorytabs", - "issues": "https://github.com/Andrew6rant/inventorytabs/issues" - }, - "license": "MIT", - "icon": "assets/inventorytabs/icon.png", - "environment": "client", - "entrypoints": { - "main": [ - "com.kqp.inventorytabs.init.InventoryTabs" - ], - "client": [ - "com.kqp.inventorytabs.init.InventoryTabsClient" - ], - "modmenu": [ - "com.kqp.inventorytabs.init.InventoryTabsModMenu" - ] - }, - "mixins": [ - "inventorytabs.mixins.json" - ], - "accessWidener": "inventorytabs.accesswidener", - "depends": { - "fabricloader": ">=0.14.19", - "fabric-api": ">=0.77.0", - "minecraft": ">=1.19.4", - "cloth-config2": "*" - }, - "custom": { - "modmenu": [ - "com.kqp.inventorytabs.init.InventoryTabsConfig" - ] - }, - "suggests": { - "biginv": "*", - "playerex": "*", - "modmenu": "*" - } -} diff --git a/src/main/resources/inventorytabs.accesswidener b/src/main/resources/inventorytabs.accesswidener deleted file mode 100644 index e8c205f6..00000000 --- a/src/main/resources/inventorytabs.accesswidener +++ /dev/null @@ -1,2 +0,0 @@ -accessWidener v1 named -accessible method net/minecraft/block/entity/BlockEntity writeNbt (Lnet/minecraft/nbt/NbtCompound;)V \ No newline at end of file diff --git a/src/main/resources/inventorytabs.mixins.json b/src/main/resources/inventorytabs.mixins.json index e412c135..c7fb49e9 100644 --- a/src/main/resources/inventorytabs.mixins.json +++ b/src/main/resources/inventorytabs.mixins.json @@ -1,23 +1,19 @@ { "required": true, - "minVersion": "0.8", + "minVersion": "0.8.5", "package": "com.kqp.inventorytabs.mixin", - "compatibilityLevel": "JAVA_16", - "mixins": [ + "compatibilityLevel": "JAVA_21", + "client": [ "CartographyTableScreenTabAdder", + "KeyBindsListMixin_SoftConflict", "LoomScreenTabAdder", "ShulkerBoxBlockInvoker", "StonecutterScreenTabAdder", "TabManagerContainerImplementer", "VanillaScreenTabAdder", - "accessor.HandledScreenAccessor", - "accessor.ScreenAccessor" + "accessor.AbstractContainerScreenAccessor" ], "injectors": { "defaultRequire": 1 - }, - "client": [ - "ControlsListWidget$KeyBindingEntryMixin_SoftConflict", - "KeyBindingMixin_SoftConflict" - ] + } }