Custom model bakery fix (#31)

This commit is contained in:
paulevsGitch 2021-08-13 02:50:23 +03:00
parent 83d5a4d2bf
commit 7845f5beb3
18 changed files with 68 additions and 182 deletions

View file

@ -7,7 +7,6 @@ import net.minecraft.resources.ResourceLocation;
import ru.bclib.api.TagAPI; import ru.bclib.api.TagAPI;
import ru.bclib.api.WorldDataAPI; import ru.bclib.api.WorldDataAPI;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.DataHandler;
import ru.bclib.api.dataexchange.handler.HelloClient; import ru.bclib.api.dataexchange.handler.HelloClient;
import ru.bclib.api.dataexchange.handler.HelloServer; import ru.bclib.api.dataexchange.handler.HelloServer;
import ru.bclib.api.dataexchange.handler.RequestFiles; import ru.bclib.api.dataexchange.handler.RequestFiles;
@ -19,7 +18,6 @@ import ru.bclib.registry.BaseRegistry;
import ru.bclib.util.Logger; import ru.bclib.util.Logger;
import ru.bclib.world.surface.BCLSurfaceBuilders; import ru.bclib.world.surface.BCLSurfaceBuilders;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class BCLib implements ModInitializer { public class BCLib implements ModInitializer {

View file

@ -3,24 +3,11 @@ package ru.bclib.api.dataexchange;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import ru.bclib.BCLib;
import ru.bclib.api.dataexchange.handler.DataExchange; import ru.bclib.api.dataexchange.handler.DataExchange;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
public class DataExchangeAPI extends DataExchange { public class DataExchangeAPI extends DataExchange {
private final static List<String> MODS = Lists.newArrayList(); private final static List<String> MODS = Lists.newArrayList();

View file

@ -1,10 +1,6 @@
package ru.bclib.api.dataexchange; package ru.bclib.api.dataexchange;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import ru.bclib.api.dataexchange.handler.HelloClient;
import ru.bclib.api.dataexchange.handler.HelloServer;
import ru.bclib.api.dataexchange.handler.RequestFiles;
import ru.bclib.api.dataexchange.handler.SendFiles;
import java.util.function.Supplier; import java.util.function.Supplier;

View file

@ -13,7 +13,6 @@ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.function.Predicate;
/** /**
* Calculates a hash based on the contents of a File. * Calculates a hash based on the contents of a File.

View file

@ -2,7 +2,6 @@ package ru.bclib.api.dataexchange.handler;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -12,7 +11,6 @@ import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.DataHandler; import ru.bclib.api.dataexchange.DataHandler;
import ru.bclib.api.dataexchange.DataHandlerDescriptor; import ru.bclib.api.dataexchange.DataHandlerDescriptor;
import ru.bclib.api.dataexchange.FileHash; import ru.bclib.api.dataexchange.FileHash;
import ru.bclib.util.Pair;
import ru.bclib.util.Triple; import ru.bclib.util.Triple;
import java.io.File; import java.io.File;

View file

@ -16,7 +16,6 @@ import ru.bclib.gui.screens.ConfirmRestartScreen;
import ru.bclib.util.Pair; import ru.bclib.util.Pair;
import ru.bclib.util.Triple; import ru.bclib.util.Triple;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;

View file

@ -3,7 +3,6 @@ package ru.bclib.api.datafixer;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;

View file

@ -1,17 +1,42 @@
package ru.bclib.client; package ru.bclib.client;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.model.ModelLoadingRegistry;
import net.fabricmc.fabric.api.client.model.ModelProviderContext;
import net.fabricmc.fabric.api.client.model.ModelProviderException;
import net.fabricmc.fabric.api.client.model.ModelResourceProvider;
import net.fabricmc.fabric.api.client.model.ModelVariantProvider;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable;
import ru.bclib.api.ModIntegrationAPI; import ru.bclib.api.ModIntegrationAPI;
import ru.bclib.api.PostInitAPI; import ru.bclib.api.PostInitAPI;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.client.models.CustomModelBakery;
import ru.bclib.registry.BaseBlockEntityRenders; import ru.bclib.registry.BaseBlockEntityRenders;
public class BCLibClient implements ClientModInitializer { public class BCLibClient implements ClientModInitializer, ModelResourceProvider, ModelVariantProvider {
public static CustomModelBakery modelBakery;
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
ModIntegrationAPI.registerAll(); ModIntegrationAPI.registerAll();
BaseBlockEntityRenders.register(); BaseBlockEntityRenders.register();
DataExchangeAPI.prepareClientside(); DataExchangeAPI.prepareClientside();
PostInitAPI.postInit(true); PostInitAPI.postInit(true);
modelBakery = new CustomModelBakery();
ModelLoadingRegistry.INSTANCE.registerResourceProvider(rm -> this);
ModelLoadingRegistry.INSTANCE.registerVariantProvider(rm -> this);
}
@Override
public @Nullable UnbakedModel loadModelResource(ResourceLocation resourceId, ModelProviderContext context) throws ModelProviderException {
return modelBakery.getBlockModel(resourceId);
}
@Override
public @Nullable UnbakedModel loadModelVariant(ModelResourceLocation modelId, ModelProviderContext context) throws ModelProviderException {
return modelId.getVariant().equals("inventory") ? modelBakery.getItemModel( modelId) : modelBakery.getBlockModel(modelId);
} }
} }

View file

@ -1,4 +1,4 @@
package ru.bclib.client.render; package ru.bclib.client.models;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@ -13,10 +13,10 @@ import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import ru.bclib.api.ModIntegrationAPI; import ru.bclib.api.ModIntegrationAPI;
import ru.bclib.client.render.EmissiveTextureInfo;
import ru.bclib.interfaces.BlockModelProvider; import ru.bclib.interfaces.BlockModelProvider;
import ru.bclib.interfaces.ItemModelProvider; import ru.bclib.interfaces.ItemModelProvider;
@ -26,31 +26,26 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
public class CustomModelBakery { public class CustomModelBakery {
private static final Map<ResourceLocation, UnbakedModel> UNBAKED_CACHE = Maps.newConcurrentMap(); private final Map<ResourceLocation, UnbakedModel> models = Maps.newConcurrentMap();
private static final Set<ResourceLocation> LOADING_STACK = Sets.newConcurrentHashSet();
private static boolean modelsLoaded;
@Deprecated // Not working with Fabric model API public UnbakedModel getBlockModel(ResourceLocation location) {
public static boolean modelsLoaded() { return models.get(location);
return modelsLoaded;
} }
@Deprecated // Not working with Fabric model API public UnbakedModel getItemModel(ResourceLocation location) {
public static void setModelsLoaded(boolean modelsLoaded) { ResourceLocation storageID = new ResourceLocation(location.getNamespace(), "models/item/" + location.getPath() + ".json");
CustomModelBakery.modelsLoaded = modelsLoaded; return models.get(location);
} }
@Deprecated // Not working with Fabric model API public void loadCustomModels(ResourceManager resourceManager) {
public static void loadCustomModels(ResourceManager resourceManager, Map<ResourceLocation, UnbakedModel> unbakedCache, Set<ResourceLocation> loadingStack) {
Registry.BLOCK.stream().parallel().filter(block -> block instanceof BlockModelProvider).forEach(block -> { Registry.BLOCK.stream().parallel().filter(block -> block instanceof BlockModelProvider).forEach(block -> {
ResourceLocation blockID = Registry.BLOCK.getKey(block); ResourceLocation blockID = Registry.BLOCK.getKey(block);
ResourceLocation storageID = new ResourceLocation(blockID.getNamespace(), "blockstates/" + blockID.getPath() + ".json"); ResourceLocation storageID = new ResourceLocation(blockID.getNamespace(), "blockstates/" + blockID.getPath() + ".json");
if (!resourceManager.hasResource(storageID)) { if (!resourceManager.hasResource(storageID)) {
addBlockModel(blockID, block); addBlockModel(blockID, block);
} }
storageID = new ResourceLocation(blockID.getNamespace(), "models/item/" + blockID.getPath() + ".json");
if (Registry.ITEM.get(blockID) != Items.AIR) { if (!resourceManager.hasResource(storageID)) {
addItemModel(blockID, (ItemModelProvider) block); addItemModel(blockID, (ItemModelProvider) block);
} }
}); });
@ -62,54 +57,38 @@ public class CustomModelBakery {
addItemModel(registryID, (ItemModelProvider) item); addItemModel(registryID, (ItemModelProvider) item);
} }
}); });
unbakedCache.putAll(UNBAKED_CACHE);
loadingStack.addAll(LOADING_STACK);
UNBAKED_CACHE.clear();
LOADING_STACK.clear();
modelsLoaded = true;
} }
@Deprecated // Not working with Fabric model API private void addBlockModel(ResourceLocation blockID, Block block) {
private static void addBlockModel(ResourceLocation blockID, Block block) {
BlockModelProvider provider = (BlockModelProvider) block; BlockModelProvider provider = (BlockModelProvider) block;
ImmutableList<BlockState> states = block.getStateDefinition().getPossibleStates(); ImmutableList<BlockState> states = block.getStateDefinition().getPossibleStates();
BlockState defaultState = block.defaultBlockState(); BlockState defaultState = block.defaultBlockState();
ResourceLocation defaultStateID = BlockModelShaper.stateToModelLocation(blockID, defaultState); ResourceLocation defaultStateID = BlockModelShaper.stateToModelLocation(blockID, defaultState);
UnbakedModel defaultModel = provider.getModelVariant(defaultStateID, defaultState, UNBAKED_CACHE); UnbakedModel defaultModel = provider.getModelVariant(defaultStateID, defaultState, models);
if (defaultModel instanceof MultiPart) { if (defaultModel instanceof MultiPart) {
states.forEach(blockState -> { states.forEach(blockState -> {
ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState); ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState);
cacheAndQueueDependencies(stateID, defaultModel); models.put(stateID, defaultModel);
}); });
} }
else { else {
states.forEach(blockState -> { states.forEach(blockState -> {
ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState); ResourceLocation stateID = BlockModelShaper.stateToModelLocation(blockID, blockState);
UnbakedModel model = stateID.equals(defaultStateID) ? defaultModel : provider.getModelVariant(stateID, blockState, UNBAKED_CACHE); UnbakedModel model = stateID.equals(defaultStateID) ? defaultModel : provider.getModelVariant(stateID, blockState, models);
cacheAndQueueDependencies(stateID, model); models.put(stateID, model);
}); });
} }
} }
@Deprecated // Not working with Fabric model API private void addItemModel(ResourceLocation itemID, ItemModelProvider provider) {
private static void addItemModel(ResourceLocation itemID, ItemModelProvider provider) {
ModelResourceLocation modelLocation = new ModelResourceLocation(itemID.getNamespace(), itemID.getPath(), "inventory"); ModelResourceLocation modelLocation = new ModelResourceLocation(itemID.getNamespace(), itemID.getPath(), "inventory");
if (UNBAKED_CACHE.containsKey(modelLocation)) { if (models.containsKey(modelLocation)) {
return; return;
} }
BlockModel model = provider.getItemModel(modelLocation); BlockModel model = provider.getItemModel(modelLocation);
cacheAndQueueDependencies(modelLocation, model); models.put(modelLocation, model);
UNBAKED_CACHE.put(modelLocation, model);
}
@Deprecated // Not working with Fabric model API
private static void cacheAndQueueDependencies(ResourceLocation resourceLocation, UnbakedModel unbakedModel) {
UNBAKED_CACHE.put(resourceLocation, unbakedModel);
LOADING_STACK.addAll(unbakedModel.getDependencies());
} }
public static void loadEmissiveModels(Map<ResourceLocation, UnbakedModel> unbakedCache) { public static void loadEmissiveModels(Map<ResourceLocation, UnbakedModel> unbakedCache) {

View file

@ -10,8 +10,6 @@ import ru.bclib.config.ConfigKeeper.IntegerEntry;
import ru.bclib.config.ConfigKeeper.RangeEntry; import ru.bclib.config.ConfigKeeper.RangeEntry;
import ru.bclib.config.ConfigKeeper.StringEntry; import ru.bclib.config.ConfigKeeper.StringEntry;
import java.io.File;
public abstract class Config { public abstract class Config {
protected final ConfigKeeper keeper; protected final ConfigKeeper keeper;
protected final boolean autoSync; protected final boolean autoSync;

View file

@ -5,8 +5,6 @@ import ru.bclib.config.ConfigKeeper.Entry;
import ru.bclib.config.ConfigKeeper.FloatRange; import ru.bclib.config.ConfigKeeper.FloatRange;
import ru.bclib.config.ConfigKeeper.IntegerRange; import ru.bclib.config.ConfigKeeper.IntegerRange;
import java.io.File;
public class PathConfig extends Config { public class PathConfig extends Config {
public PathConfig(String modID, String group, boolean autoSync) { public PathConfig(String modID, String group, boolean autoSync) {

View file

@ -1,11 +1,8 @@
package ru.bclib.gui.screens; package ru.bclib.gui.screens;
import com.mojang.blaze3d.vertex.PoseStack;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.gui.components.MultiLineLabel;
import net.minecraft.client.gui.screens.BackupConfirmScreen;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.CommonComponents;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -13,7 +10,6 @@ import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import ru.bclib.BCLib; import ru.bclib.BCLib;
import ru.bclib.gui.GridLayout;
import ru.bclib.gui.GridScreen; import ru.bclib.gui.GridScreen;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)

View file

@ -1,13 +1,11 @@
package ru.bclib.mixin.client; package ru.bclib.mixin.client;
import net.minecraft.client.Minecraft;
import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.network.protocol.game.ClientGamePacketListener;
import net.minecraft.network.protocol.game.ClientboundLoginPacket; import net.minecraft.network.protocol.game.ClientboundLoginPacket;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.bclib.api.dataexchange.DataExchangeAPI;
@Mixin(ClientboundLoginPacket.class) @Mixin(ClientboundLoginPacket.class)
public abstract class ClientboundLoginPacketMixin { public abstract class ClientboundLoginPacketMixin {

View file

@ -6,7 +6,6 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI;
import ru.bclib.api.dataexchange.handler.HelloServer;
@Mixin(Game.class) @Mixin(Game.class)
public class GameMixin { public class GameMixin {

View file

@ -3,9 +3,7 @@ package ru.bclib.mixin.client;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.block.BlockColors;
import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.color.item.ItemColors;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.main.GameConfig; import net.minecraft.client.main.GameConfig;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess.RegistryHolder; import net.minecraft.core.RegistryAccess.RegistryHolder;
import net.minecraft.world.level.LevelSettings; import net.minecraft.world.level.LevelSettings;

View file

@ -1,129 +1,28 @@
package ru.bclib.mixin.client; package ru.bclib.mixin.client;
import net.minecraft.client.Minecraft;
import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.color.block.BlockColors;
import net.minecraft.client.renderer.block.BlockModelShaper;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.multipart.MultiPart;
import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.util.profiling.ProfilerFiller;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.BCLib;
import ru.bclib.api.ModIntegrationAPI; import ru.bclib.api.ModIntegrationAPI;
import ru.bclib.client.render.CustomModelBakery; import ru.bclib.client.models.CustomModelBakery;
import ru.bclib.interfaces.BlockModelProvider;
import ru.bclib.interfaces.ItemModelProvider;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set;
@Mixin(ModelBakery.class) @Mixin(ModelBakery.class)
public abstract class ModelBakeryMixin { public abstract class ModelBakeryMixin {
@Final
@Shadow
private ResourceManager resourceManager;
@Final @Final
@Shadow @Shadow
private Map<ResourceLocation, UnbakedModel> unbakedCache; private Map<ResourceLocation, UnbakedModel> unbakedCache;
@Shadow
protected abstract void cacheAndQueueDependencies(ResourceLocation resourceLocation, UnbakedModel unbakedModel);
@Inject(method = "loadModel", at = @At("HEAD"), cancellable = true)
private void bclib_loadCustomModels(ResourceLocation resourceLocation, CallbackInfo info) {
if (resourceLocation instanceof ModelResourceLocation) {
String modId = resourceLocation.getNamespace();
String path = resourceLocation.getPath();
ResourceLocation clearLoc = new ResourceLocation(modId, path);
ModelResourceLocation modelId = (ModelResourceLocation) resourceLocation;
if ("inventory".equals(modelId.getVariant())) {
ResourceLocation itemLoc = new ResourceLocation(modId, "item/" + path);
ResourceLocation itemModelLoc = new ResourceLocation(modId, "models/" + itemLoc.getPath() + ".json");
if (!resourceManager.hasResource(itemModelLoc)) {
Item item = Registry.ITEM.get(clearLoc);
ItemModelProvider modelProvider = null;
if (item instanceof ItemModelProvider) {
modelProvider = (ItemModelProvider) item;
}
else if (item instanceof BlockItem) {
Block block = Registry.BLOCK.get(clearLoc);
if (block instanceof ItemModelProvider) {
modelProvider = (ItemModelProvider) block;
}
}
if (modelProvider != null) {
BlockModel model = modelProvider.getItemModel(clearLoc);
if (model != null) {
model.name = itemLoc.toString();
cacheAndQueueDependencies(modelId, model);
unbakedCache.put(itemLoc, model);
}
else {
BCLib.LOGGER.warning("Error loading model: {}", itemLoc);
}
info.cancel();
}
}
}
else {
ResourceLocation stateLoc = new ResourceLocation(modId, "blockstates/" + path + ".json");
if (!resourceManager.hasResource(stateLoc)) {
Block block = Registry.BLOCK.get(clearLoc);
if (block instanceof BlockModelProvider) {
List<BlockState> possibleStates = block.getStateDefinition().getPossibleStates();
Optional<BlockState> possibleState = possibleStates
.stream()
.filter(state -> modelId.equals(BlockModelShaper.stateToModelLocation(clearLoc, state)))
.findFirst();
if (possibleState.isPresent()) {
UnbakedModel modelVariant = ((BlockModelProvider) block).getModelVariant(
modelId,
possibleState.get(),
unbakedCache
);
if (modelVariant != null) {
if (modelVariant instanceof MultiPart) {
possibleStates.forEach(state -> {
ResourceLocation stateId = BlockModelShaper.stateToModelLocation(
clearLoc,
state
);
cacheAndQueueDependencies(stateId, modelVariant);
});
}
else {
cacheAndQueueDependencies(modelId, modelVariant);
}
}
else {
BCLib.LOGGER.warning("Error loading variant: {}", modelId);
}
info.cancel();
}
}
}
}
}
}
@Inject(method = "<init>*", at = @At("TAIL")) @Inject(method = "<init>*", at = @At("TAIL"))
private void bclib_findEmissiveModels(ResourceManager resourceManager, BlockColors blockColors, ProfilerFiller profiler, int mipmap, CallbackInfo info) { private void bclib_findEmissiveModels(ResourceManager resourceManager, BlockColors blockColors, ProfilerFiller profiler, int mipmap, CallbackInfo info) {
//CustomModelBakery.setModelsLoaded(false); //CustomModelBakery.setModelsLoaded(false);

View file

@ -0,0 +1,19 @@
package ru.bclib.mixin.client;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.util.profiling.ProfilerFiller;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.bclib.client.BCLibClient;
@Mixin(ModelManager.class)
public class ModelManagerMixin {
@Inject(method = "prepare", at = @At("HEAD"))
private void bclib_loadCustomModels(ResourceManager resourceManager, ProfilerFiller profilerFiller, CallbackInfoReturnable<ModelBakery> info) {
BCLibClient.modelBakery.loadCustomModels(resourceManager);
}
}

View file

@ -7,10 +7,11 @@
"SimpleReloadableResourceManagerMixin", "SimpleReloadableResourceManagerMixin",
"EnchantingTableBlockMixin", "EnchantingTableBlockMixin",
"BackgroundRendererMixin", "BackgroundRendererMixin",
"GameMixin", "ModelManagerMixin",
"TextureAtlasMixin", "TextureAtlasMixin",
"ModelBakeryMixin", "ModelBakeryMixin",
"MinecraftMixin" "MinecraftMixin",
"GameMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1