Custom model bakery fix (#31)
This commit is contained in:
parent
83d5a4d2bf
commit
7845f5beb3
18 changed files with 68 additions and 182 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
19
src/main/java/ru/bclib/mixin/client/ModelManagerMixin.java
Normal file
19
src/main/java/ru/bclib/mixin/client/ModelManagerMixin.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue