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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user