1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-11-04 23:53:01 +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:
Jonathan Coates
2024-01-16 23:00:05 +00:00
parent 36599b321e
commit a617d0d566
10 changed files with 175 additions and 30 deletions

View File

@@ -5,6 +5,7 @@
package dan200.computercraft.client;
import dan200.computercraft.api.ComputerCraftAPI;
import dan200.computercraft.api.client.turtle.RegisterTurtleModellersEvent;
import dan200.computercraft.client.model.turtle.TurtleModelLoader;
import net.minecraft.client.Minecraft;
import net.minecraftforge.api.distmarker.Dist;
@@ -13,6 +14,7 @@ import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
import net.minecraftforge.client.event.RegisterColorHandlersEvent;
import net.minecraftforge.client.event.RegisterShadersEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@@ -23,6 +25,9 @@ import java.io.IOException;
*/
@Mod.EventBusSubscriber(modid = ComputerCraftAPI.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public final class ForgeClientRegistry {
private static final Object lock = new Object();
private static boolean gatheredModellers = false;
private ForgeClientRegistry() {
}
@@ -31,8 +36,26 @@ public final class ForgeClientRegistry {
event.register("turtle", TurtleModelLoader.INSTANCE);
}
/**
* Turtle upgrade modellers must be loaded before we gather additional models.
* <p>
* Unfortunately, due to the nature of parallel mod loading (resource loading and mod setup events are fired in
* parallel), there's no way to guarantee this using existing events. Instead, we piggyback off
* {@link ModelEvent.RegisterAdditional}, registering models the first time the event is fired.
*/
private static void gatherModellers() {
if (gatheredModellers) return;
synchronized (lock) {
if (gatheredModellers) return;
gatheredModellers = true;
ModLoader.get().postEvent(new RegisterTurtleModellersEvent());
}
}
@SubscribeEvent
public static void registerModels(ModelEvent.RegisterAdditional event) {
gatherModellers();
ClientRegistry.registerExtraModels(event::register);
}
@@ -41,6 +64,11 @@ public final class ForgeClientRegistry {
ClientRegistry.registerShaders(event.getResourceProvider(), event::registerShader);
}
@SubscribeEvent
public static void onTurtleModellers(RegisterTurtleModellersEvent event) {
ClientRegistry.registerTurtleModellers(event);
}
@SubscribeEvent
public static void onItemColours(RegisterColorHandlersEvent.Item event) {
ClientRegistry.registerItemColours(event::register);