diff --git a/gradle.properties b/gradle.properties index f0d2cf030..db145f352 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,4 @@ isUnstable=true modVersion=1.116.0 # Minecraft properties: We want to configure this here so we can read it in settings.gradle -mcVersion=1.21.6 +mcVersion=1.21.7 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 565e0448a..ab43ed39e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,14 +7,14 @@ # Minecraft # MC version is specified in gradle.properties, as we need that in settings.gradle. # Remember to update corresponding versions in fabric.mod.json/neoforge.mods.toml -fabric-api = "0.127.0+1.21.6" +fabric-api = "0.128.0+1.21.7" fabric-loader = "0.16.14" -neoForge = "21.6.12-beta" +neoForge = "21.7.1-beta" neoMergeTool = "2.0.0" mixin = "0.8.5" -parchment = "2025.04.19" -parchmentMc = "1.21.5" -yarn = "1.21.5+build.1" +parchment = "2025.06.29" +parchmentMc = "1.21.6" +yarn = "1.21.7+build.1" # Core dependencies (these versions are tied to the version Minecraft uses) fastutil = "8.5.15" diff --git a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/ItemUpgradeModel.java b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/ItemUpgradeModel.java index fb6e12afb..541d0b0fc 100644 --- a/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/ItemUpgradeModel.java +++ b/projects/common-api/src/client/java/dan200/computercraft/api/client/turtle/ItemUpgradeModel.java @@ -18,6 +18,7 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransform; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.item.TrackingItemStackRenderState; import net.minecraft.client.renderer.special.SpecialModelRenderer; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.core.component.DataComponentPatch; @@ -64,7 +65,7 @@ public final class ItemUpgradeModel implements TurtleUpgradeModel { public void renderForItem(UpgradeData upgrade, TurtleSide side, ItemStackRenderState renderer, ItemModelResolver resolver, ItemTransform transform, int seed) { renderer.appendModelIdentityElement(this); - var childState = new ItemStackRenderState(); + var childState = new TrackingItemStackRenderState(); resolver.updateForTopItem(childState, upgrade.getUpgradeItem(), ItemDisplayContext.NONE, null, null, seed); if (!childState.isEmpty()) { renderer.appendModelIdentityElement(childState.getModelIdentity()); diff --git a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java index 299e8651c..e1a4b3de6 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java +++ b/projects/common/src/client/java/dan200/computercraft/client/ClientRegistry.java @@ -24,6 +24,7 @@ import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.computer.inventory.AbstractComputerMenu; import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; +import net.minecraft.client.gui.render.state.pip.PictureInPictureRenderState; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.MenuAccess; @@ -49,7 +50,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.function.BiConsumer; import java.util.function.BiFunction; -import java.util.function.Consumer; import java.util.function.Function; /** @@ -193,7 +193,11 @@ public final class ClientRegistry { register.accept(TurtleShowElfOverlay.ID, TurtleShowElfOverlay.CODEC); } - public static void registerPictureInPictureRenderers(Consumer>> register) { - register.accept(PrintoutScreen.PrintoutPictureRenderer::new); + public interface RegisterPictureInPictureRenderer { + void register(Class state, Function> factory); + } + + public static void registerPictureInPictureRenderers(RegisterPictureInPictureRenderer register) { + register.register(PrintoutScreen.PrintoutRenderState.class, PrintoutScreen.PrintoutPictureRenderer::new); } } diff --git a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java index ca7d44306..49bf4aa1f 100644 --- a/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java +++ b/projects/common/src/client/java/dan200/computercraft/client/platform/ClientNetworkContextImpl.java @@ -4,7 +4,6 @@ package dan200.computercraft.client.platform; -import com.google.auto.service.AutoService; import dan200.computercraft.client.ClientTableFormatter; import dan200.computercraft.client.gui.AbstractComputerScreen; import dan200.computercraft.client.gui.OptionScreen; @@ -36,7 +35,6 @@ import java.util.UUID; /** * The client-side implementation of {@link ClientNetworkContext}. */ -@AutoService(ClientNetworkContext.class) public final class ClientNetworkContextImpl implements ClientNetworkContext { @Override public void handleChatTable(TableBuilder table) { diff --git a/projects/fabric/src/client/java/dan200/computercraft/client/ComputerCraftClient.java b/projects/fabric/src/client/java/dan200/computercraft/client/ComputerCraftClient.java index e8ca4909e..be4ab9ac9 100644 --- a/projects/fabric/src/client/java/dan200/computercraft/client/ComputerCraftClient.java +++ b/projects/fabric/src/client/java/dan200/computercraft/client/ComputerCraftClient.java @@ -9,15 +9,14 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.client.FabricComputerCraftAPIClient; +import dan200.computercraft.client.platform.ClientNetworkContextImpl; import dan200.computercraft.client.platform.FabricModelKey; import dan200.computercraft.client.platform.ModelKey; import dan200.computercraft.core.util.Nullability; -import dan200.computercraft.impl.Services; import dan200.computercraft.shared.ComputerCraft; import dan200.computercraft.shared.ModRegistry; import dan200.computercraft.shared.config.ConfigSpec; import dan200.computercraft.shared.network.NetworkMessages; -import dan200.computercraft.shared.network.client.ClientNetworkContext; import dan200.computercraft.shared.platform.FabricConfigFile; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; @@ -32,7 +31,10 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.color.item.ItemTintSources; +import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; +import net.minecraft.client.gui.render.state.pip.PictureInPictureRenderState; import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.item.ItemModels; import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperties; @@ -45,12 +47,13 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import java.util.function.Function; import static dan200.computercraft.core.util.Nullability.assertNonNull; public class ComputerCraftClient { public static void init() { - var clientNetwork = Services.load(ClientNetworkContext.class); + var clientNetwork = new ClientNetworkContextImpl(); for (var type : NetworkMessages.getClientbound()) { ClientPlayNetworking.registerGlobalReceiver( type.type(), (packet, responseSender) -> packet.handle(clientNetwork) @@ -81,7 +84,12 @@ public class ComputerCraftClient { BlockRenderLayerMap.putBlock(ModRegistry.Blocks.MONITOR_NORMAL.get(), ChunkSectionLayer.CUTOUT); BlockRenderLayerMap.putBlock(ModRegistry.Blocks.MONITOR_ADVANCED.get(), ChunkSectionLayer.CUTOUT); - ClientRegistry.registerPictureInPictureRenderers(f -> SpecialGuiElementRegistry.register(c -> f.apply(c.vertexConsumers()))); + ClientRegistry.registerPictureInPictureRenderers(new ClientRegistry.RegisterPictureInPictureRenderer() { + @Override + public void register(Class ty, Function> f) { + SpecialGuiElementRegistry.register(c -> f.apply(c.vertexConsumers())); + } + }); ClientTickEvents.START_CLIENT_TICK.register(client -> ClientHooks.onTick()); // This isn't 100% consistent with Forge, but not worth a mixin. diff --git a/projects/fabric/src/main/resources/fabric.mod.json b/projects/fabric/src/main/resources/fabric.mod.json index 757c95745..5bfef90ff 100644 --- a/projects/fabric/src/main/resources/fabric.mod.json +++ b/projects/fabric/src/main/resources/fabric.mod.json @@ -50,8 +50,8 @@ ], "depends": { "fabricloader": ">=0.16.14", - "fabric-api": ">=0.127.0", - "minecraft": "=1.21.6" + "fabric-api": ">=0.128.0", + "minecraft": "=1.21.7" }, "accessWidener": "computercraft.accesswidener" } diff --git a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java index 95f85b140..234d0e99f 100644 --- a/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java +++ b/projects/forge/src/client/java/dan200/computercraft/client/ForgeClientRegistry.java @@ -7,9 +7,11 @@ package dan200.computercraft.client; import com.google.common.reflect.TypeToken; import dan200.computercraft.api.ComputerCraftAPI; import dan200.computercraft.api.client.turtle.RegisterTurtleModelEvent; +import dan200.computercraft.client.platform.ClientNetworkContextImpl; import dan200.computercraft.client.platform.ForgeModelKey; import dan200.computercraft.client.platform.ModelKey; import dan200.computercraft.client.render.ExtendedItemFrameRenderState; +import dan200.computercraft.shared.network.NetworkMessages; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.ItemFrameRenderer; import net.minecraft.client.resources.model.ModelBaker; @@ -22,6 +24,7 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; import net.neoforged.neoforge.client.event.*; import net.neoforged.neoforge.client.model.standalone.UnbakedStandaloneModel; +import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; import net.neoforged.neoforge.client.renderstate.RegisterRenderStateModifiersEvent; import java.util.ArrayDeque; @@ -40,6 +43,14 @@ public final class ForgeClientRegistry { private ForgeClientRegistry() { } + @SubscribeEvent + public static void registerNetwork(RegisterClientPayloadHandlersEvent event) { + var context = new ClientNetworkContextImpl(); + for (var type : NetworkMessages.getClientbound()) { + event.register(type.type(), (packet, ctx) -> ctx.enqueueWork(() -> packet.handle(context))); + } + } + @SubscribeEvent public static void registerModels(ModelEvent.RegisterStandalone event) { // Load resources diff --git a/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java b/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java index 5913a335c..92e213947 100644 --- a/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java +++ b/projects/forge/src/main/java/dan200/computercraft/ComputerCraft.java @@ -13,7 +13,6 @@ import dan200.computercraft.api.peripheral.PeripheralCapability; import dan200.computercraft.api.pocket.IPocketUpgrade; import dan200.computercraft.api.turtle.ITurtleUpgrade; import dan200.computercraft.impl.PocketUpgrades; -import dan200.computercraft.impl.Services; import dan200.computercraft.impl.TurtleUpgrades; import dan200.computercraft.shared.CommonHooks; import dan200.computercraft.shared.ModRegistry; @@ -135,7 +134,7 @@ public final class ComputerCraft { } private static > void registerClientbound(PayloadRegistrar registrar, CustomPacketPayload.TypeAndCodec type) { - registrar.playToClient(type.type(), type.codec(), (t, context) -> context.enqueueWork(() -> t.handle(ClientHolderHolder.get()))); + registrar.playToClient(type.type(), type.codec()); } /** @@ -220,24 +219,4 @@ public final class ComputerCraft { public static void onCreativeTab(BuildCreativeModeTabContentsEvent event) { CommonHooks.onBuildCreativeTab(event.getTabKey(), event.getParameters(), event); } - - /** - * This holds an instance of {@link ClientNetworkContext}. This is a separate class to ensure that the instance is - * lazily created when needed on the client. - */ - private static final class ClientHolderHolder { - private static final @Nullable ClientNetworkContext INSTANCE; - private static final @Nullable Throwable ERROR; - - static { - var helper = Services.tryLoad(ClientNetworkContext.class); - INSTANCE = helper.instance(); - ERROR = helper.error(); - } - - static ClientNetworkContext get() { - var instance = INSTANCE; - return instance == null ? Services.raise(ClientNetworkContext.class, ERROR) : instance; - } - } } diff --git a/projects/forge/src/main/resources/META-INF/neoforge.mods.toml b/projects/forge/src/main/resources/META-INF/neoforge.mods.toml index 178e5328c..00350f6b4 100644 --- a/projects/forge/src/main/resources/META-INF/neoforge.mods.toml +++ b/projects/forge/src/main/resources/META-INF/neoforge.mods.toml @@ -26,7 +26,7 @@ CC: Tweaked is a fork of ComputerCraft, adding programmable computers, turtles a [[dependencies.computercraft]] modId="neoforge" type="required" - versionRange="[${neoVersion},21.7)" + versionRange="[${neoVersion},21.8)" ordering="NONE" side="BOTH"