mirror of
				https://github.com/SquidDev-CC/CC-Tweaked
				synced 2025-10-31 05:33:00 +00:00 
			
		
		
		
	Rewrite turtle upgrade modeller registration API
Originally we exposed a single registerTurtleUpgradeModellermethod which could be called from both Fabric (during a mod's client init) and Forge (during FMLClientSetupEvent). This was fine until we allowed upgrades to specify model dependencies, which would then automatically loaded, as this means model loading now depends on upgrade modellers being loaded. Unknown to me, this is not guaranteed to be the case on Forge - mod setup happens at the same time as resource reloading! Unfortunately there's not really a salvageable way of fixing this with the current API. Forge now uses a registration event-based system, meaning we can guarantee all modellers are loaded before models are baked.
This commit is contained in:
		| @@ -5,8 +5,8 @@ | ||||
| package dan200.computercraft.client; | ||||
| 
 | ||||
| import dan200.computercraft.api.ComputerCraftAPI; | ||||
| import dan200.computercraft.api.client.ComputerCraftAPIClient; | ||||
| import dan200.computercraft.api.client.turtle.TurtleUpgradeModeller; | ||||
| import dan200.computercraft.api.client.turtle.RegisterTurtleUpgradeModeller; | ||||
| import dan200.computercraft.client.gui.*; | ||||
| import dan200.computercraft.client.pocket.ClientPocketComputers; | ||||
| import dan200.computercraft.client.render.RenderTypes; | ||||
| @@ -60,18 +60,6 @@ public final class ClientRegistry { | ||||
|      * Register any client-side objects which don't have to be done on the main thread. | ||||
|      */ | ||||
|     public static void register() { | ||||
|         ComputerCraftAPIClient.registerTurtleUpgradeModeller(ModRegistry.TurtleSerialisers.SPEAKER.get(), TurtleUpgradeModeller.sided( | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_left"), | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_right") | ||||
|         )); | ||||
|         ComputerCraftAPIClient.registerTurtleUpgradeModeller(ModRegistry.TurtleSerialisers.WORKBENCH.get(), TurtleUpgradeModeller.sided( | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_left"), | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_right") | ||||
|         )); | ||||
|         ComputerCraftAPIClient.registerTurtleUpgradeModeller(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_NORMAL.get(), new TurtleModemModeller(false)); | ||||
|         ComputerCraftAPIClient.registerTurtleUpgradeModeller(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_ADVANCED.get(), new TurtleModemModeller(true)); | ||||
|         ComputerCraftAPIClient.registerTurtleUpgradeModeller(ModRegistry.TurtleSerialisers.TOOL.get(), TurtleUpgradeModeller.flatItem()); | ||||
| 
 | ||||
|         BlockEntityRenderers.register(ModRegistry.BlockEntities.MONITOR_NORMAL.get(), MonitorBlockEntityRenderer::new); | ||||
|         BlockEntityRenderers.register(ModRegistry.BlockEntities.MONITOR_ADVANCED.get(), MonitorBlockEntityRenderer::new); | ||||
|         BlockEntityRenderers.register(ModRegistry.BlockEntities.TURTLE_NORMAL.get(), TurtleBlockEntityRenderer::new); | ||||
| @@ -103,6 +91,20 @@ public final class ClientRegistry { | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     public static void registerTurtleModellers(RegisterTurtleUpgradeModeller register) { | ||||
|         register.register(ModRegistry.TurtleSerialisers.SPEAKER.get(), TurtleUpgradeModeller.sided( | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_left"), | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_speaker_right") | ||||
|         )); | ||||
|         register.register(ModRegistry.TurtleSerialisers.WORKBENCH.get(), TurtleUpgradeModeller.sided( | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_left"), | ||||
|             new ResourceLocation(ComputerCraftAPI.MOD_ID, "block/turtle_crafting_table_right") | ||||
|         )); | ||||
|         register.register(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_NORMAL.get(), new TurtleModemModeller(false)); | ||||
|         register.register(ModRegistry.TurtleSerialisers.WIRELESS_MODEM_ADVANCED.get(), new TurtleModemModeller(true)); | ||||
|         register.register(ModRegistry.TurtleSerialisers.TOOL.get(), TurtleUpgradeModeller.flatItem()); | ||||
|     } | ||||
| 
 | ||||
|     @SafeVarargs | ||||
|     private static void registerItemProperty(String name, ClampedItemPropertyFunction getter, Supplier<? extends Item>... items) { | ||||
|         var id = new ResourceLocation(ComputerCraftAPI.MOD_ID, name); | ||||
|   | ||||
| @@ -11,11 +11,14 @@ import dan200.computercraft.api.turtle.ITurtleAccess; | ||||
| import dan200.computercraft.api.turtle.ITurtleUpgrade; | ||||
| import dan200.computercraft.api.turtle.TurtleSide; | ||||
| import dan200.computercraft.api.turtle.TurtleUpgradeSerialiser; | ||||
| import dan200.computercraft.impl.PlatformHelper; | ||||
| import dan200.computercraft.impl.TurtleUpgrades; | ||||
| import dan200.computercraft.impl.UpgradeManager; | ||||
| import net.minecraft.client.Minecraft; | ||||
| import net.minecraft.nbt.CompoundTag; | ||||
| import net.minecraft.resources.ResourceLocation; | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| 
 | ||||
| import java.util.Map; | ||||
| import java.util.WeakHashMap; | ||||
| @@ -24,14 +27,15 @@ import java.util.stream.Stream; | ||||
| 
 | ||||
| /** | ||||
|  * A registry of {@link TurtleUpgradeModeller}s. | ||||
|  * | ||||
|  * @see dan200.computercraft.api.client.ComputerCraftAPIClient#registerTurtleUpgradeModeller(TurtleUpgradeSerialiser, TurtleUpgradeModeller) | ||||
|  */ | ||||
| public final class TurtleUpgradeModellers { | ||||
|     private static final Logger LOG = LoggerFactory.getLogger(TurtleUpgradeModellers.class); | ||||
| 
 | ||||
|     private static final TurtleUpgradeModeller<ITurtleUpgrade> NULL_TURTLE_MODELLER = (upgrade, turtle, side) -> | ||||
|         new TransformedModel(Minecraft.getInstance().getModelManager().getMissingModel(), Transformation.identity()); | ||||
| 
 | ||||
|     private static final Map<TurtleUpgradeSerialiser<?>, TurtleUpgradeModeller<?>> turtleModels = new ConcurrentHashMap<>(); | ||||
|     private static volatile boolean fetchedModels; | ||||
| 
 | ||||
|     /** | ||||
|      * In order to avoid a double lookup of {@link ITurtleUpgrade} to {@link UpgradeManager.UpgradeWrapper} to | ||||
| @@ -45,12 +49,18 @@ public final class TurtleUpgradeModellers { | ||||
|     } | ||||
| 
 | ||||
|     public static <T extends ITurtleUpgrade> void register(TurtleUpgradeSerialiser<T> serialiser, TurtleUpgradeModeller<T> modeller) { | ||||
|         synchronized (turtleModels) { | ||||
|             if (turtleModels.containsKey(serialiser)) { | ||||
|                 throw new IllegalStateException("Modeller already registered for serialiser"); | ||||
|             } | ||||
|         if (fetchedModels) { | ||||
|             // TODO(1.20.4): Replace with an error. | ||||
|             LOG.warn( | ||||
|                 "Turtle upgrade serialiser {} was registered too late, its models may not be loaded correctly. If you are " + | ||||
|                     "the mod author, you may be using a deprecated API - see https://github.com/cc-tweaked/CC-Tweaked/pull/1684 " + | ||||
|                     "for further information.", | ||||
|                 PlatformHelper.get().getRegistryKey(TurtleUpgradeSerialiser.registryId(), serialiser) | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|             turtleModels.put(serialiser, modeller); | ||||
|         if (turtleModels.putIfAbsent(serialiser, modeller) != null) { | ||||
|             throw new IllegalStateException("Modeller already registered for serialiser"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @@ -75,6 +85,7 @@ public final class TurtleUpgradeModellers { | ||||
|     } | ||||
| 
 | ||||
|     public static Stream<ResourceLocation> getDependencies() { | ||||
|         fetchedModels = true; | ||||
|         return turtleModels.values().stream().flatMap(x -> x.getDependencies().stream()); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Jonathan Coates
					Jonathan Coates