mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-09-01 18:17:55 +00:00
Load turtle overlays during model loading
Back in f10e401aea
, we changed turtle
overlays to be loaded as a dynamic registry. This solved some of the
problems we had with upgrades (elf-compatibility), and seemed like a
good idea at the time.
However, because overlays are part of datapacks (not resource packs), we
also needed support for loading overlay models, which we did via an
"extra_models.json" file.
With the ItemModel changes, we can go for a different approach:
- Turtle overlays are now stored on the item/BE as a simple
ResourceLocation again.
- The TurtleOverlay class is moved to the client, and loaded from
resource packs, during model loading. They're now split into a baked
form (holding a StandaloneModel) and an unbaked one (holding the
ResourceLocation).
- extra_model.json is no longer supported.
This commit is contained in:
@@ -9,11 +9,8 @@ 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.api.client.StandaloneModel;
|
||||
import dan200.computercraft.api.client.turtle.TurtleUpgradeModel;
|
||||
import dan200.computercraft.api.turtle.ITurtleUpgrade;
|
||||
import dan200.computercraft.client.model.ExtraModels;
|
||||
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;
|
||||
@@ -27,7 +24,6 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallba
|
||||
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
|
||||
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
|
||||
import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin;
|
||||
import net.fabricmc.fabric.api.client.model.loading.v1.SimpleUnbakedExtraModel;
|
||||
import net.fabricmc.fabric.api.client.model.loading.v1.UnbakedExtraModel;
|
||||
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
|
||||
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
|
||||
@@ -41,11 +37,13 @@ import net.minecraft.client.renderer.item.ItemModels;
|
||||
import net.minecraft.client.renderer.item.properties.conditional.ConditionalItemModelProperties;
|
||||
import net.minecraft.client.renderer.item.properties.select.SelectItemModelProperties;
|
||||
import net.minecraft.client.resources.model.ModelBaker;
|
||||
import net.minecraft.client.resources.model.ResolvableModel;
|
||||
import net.minecraft.world.phys.BlockHitResult;
|
||||
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import static dan200.computercraft.core.util.Nullability.assertNonNull;
|
||||
|
||||
@@ -67,12 +65,13 @@ public class ComputerCraftClient {
|
||||
ClientRegistry.registerConditionalItemProperties(ConditionalItemModelProperties.ID_MAPPER::put);
|
||||
|
||||
PreparableModelLoadingPlugin.register(
|
||||
(resources, executor) -> CompletableFuture.supplyAsync(() -> ExtraModels.loadAll(resources), executor),
|
||||
(state, context) -> ClientRegistry.registerExtraModels(
|
||||
(key, model) -> context.addModel(FabricModelKey.key(key), new SimpleUnbakedExtraModel<>(model, StandaloneModel::of)),
|
||||
(key, model) -> context.addModel(FabricModelKey.erased(key), new TurtleModelWrapper<>(model)),
|
||||
state
|
||||
)
|
||||
ClientRegistry::gatherExtraModels,
|
||||
(state, context) -> ClientRegistry.registerExtraModels(new ClientRegistry.RegisterExtraModels() {
|
||||
@Override
|
||||
public <U, T> void register(ModelKey<T> key, U unbaked, BiConsumer<U, ResolvableModel.Resolver> resolve, BiFunction<U, ModelBaker, T> bake) {
|
||||
context.addModel(FabricModelKey.key(key), new ModelWrapper<>(unbaked, resolve, bake));
|
||||
}
|
||||
}, state)
|
||||
);
|
||||
|
||||
BlockRenderLayerMap.INSTANCE.putBlock(ModRegistry.Blocks.COMPUTER_NORMAL.get(), RenderType.cutout());
|
||||
@@ -108,17 +107,17 @@ public class ComputerCraftClient {
|
||||
((FabricConfigFile) ConfigSpec.clientSpec).load(FabricLoader.getInstance().getConfigDir().resolve(ComputerCraftAPI.MOD_ID + "-client.toml"));
|
||||
}
|
||||
|
||||
private record TurtleModelWrapper<T extends ITurtleUpgrade>(
|
||||
TurtleUpgradeModel.Unbaked<T> model
|
||||
) implements UnbakedExtraModel<TurtleUpgradeModel<T>> {
|
||||
private record ModelWrapper<U, T>(
|
||||
U model, BiConsumer<U, Resolver> resolve, BiFunction<U, ModelBaker, T> bake
|
||||
) implements UnbakedExtraModel<T> {
|
||||
@Override
|
||||
public TurtleUpgradeModel<T> bake(ModelBaker baker) {
|
||||
return model().bake(baker);
|
||||
public T bake(ModelBaker baker) {
|
||||
return bake().apply(model(), baker);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resolveDependencies(Resolver resolver) {
|
||||
model().resolveDependencies(resolver);
|
||||
resolve().accept(model(), resolver);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -24,11 +24,6 @@ public final class FabricModelKey<T> implements ModelKey<T> {
|
||||
return ((FabricModelKey<T>) key).key;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> ExtraModelKey<T> erased(ModelKey<?> key) {
|
||||
return ((FabricModelKey<T>) key).key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable T get(ModelManager manager) {
|
||||
return manager.getModel(key);
|
||||
|
@@ -23,7 +23,6 @@ import dan200.computercraft.shared.peripheral.generic.methods.InventoryMethods;
|
||||
import dan200.computercraft.shared.peripheral.modem.wired.CableBlock;
|
||||
import dan200.computercraft.shared.platform.FabricConfigFile;
|
||||
import dan200.computercraft.shared.recipe.function.RecipeFunction;
|
||||
import dan200.computercraft.shared.turtle.TurtleOverlay;
|
||||
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
|
||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
|
||||
@@ -85,7 +84,6 @@ public class ComputerCraft {
|
||||
|
||||
DynamicRegistries.registerSynced(ITurtleUpgrade.REGISTRY, TurtleUpgrades.instance().upgradeCodec());
|
||||
DynamicRegistries.registerSynced(IPocketUpgrade.REGISTRY, PocketUpgrades.instance().upgradeCodec());
|
||||
DynamicRegistries.registerSynced(TurtleOverlay.REGISTRY, TurtleOverlay.DIRECT_CODEC);
|
||||
|
||||
ModRegistry.register();
|
||||
ModRegistry.registerMainThread();
|
||||
|
Reference in New Issue
Block a user