Change loading models (WIP)

This commit is contained in:
Aleksey 2021-05-14 16:46:26 +03:00
parent 1e6451e375
commit 6447ec6026
56 changed files with 196 additions and 176 deletions

View file

@ -2,6 +2,7 @@ package ru.betterend.mixin.client;
import net.minecraft.client.renderer.block.BlockModelShaper;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.MultiVariant;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel;
@ -9,9 +10,9 @@ import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import org.apache.commons.lang3.tuple.Triple;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -21,8 +22,8 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import ru.betterend.BetterEnd;
import ru.betterend.patterns.BlockPatterned;
import ru.betterend.patterns.Patterned;
import ru.betterend.patterns.BlockModelProvider;
import ru.betterend.patterns.ModelProvider;
import ru.betterend.world.generator.GeneratorOptions;
import java.io.InputStreamReader;
@ -59,8 +60,8 @@ public abstract class ModelLoaderMixin {
ResourceLocation itemModelLoc = new ResourceLocation(modId, "models/" + itemLoc.getPath() + ".json");
if (!resourceManager.hasResource(itemModelLoc)) {
Item item = Registry.ITEM.get(clearLoc);
if (item instanceof Patterned) {
BlockModel model = ((Patterned) item).getItemModel();
if (item instanceof ModelProvider) {
BlockModel model = ((ModelProvider) item).getModel();
if (model != null) {
model.name = itemLoc.toString();
} else {
@ -75,12 +76,13 @@ public abstract class ModelLoaderMixin {
ResourceLocation blockstateId = new ResourceLocation(modId, "blockstates/" + path + ".json");
if (!resourceManager.hasResource(blockstateId)) {
Block block = Registry.BLOCK.get(clearLoc);
if (block instanceof BlockPatterned) {
if (block instanceof BlockModelProvider) {
block.getStateDefinition().getPossibleStates().forEach(blockState -> {
UnbakedModel model = ((BlockPatterned) block).getBlockModel(blockState);
if (model != null) {
Triple<ResourceLocation, MultiVariant, BlockModel> models = ((BlockModelProvider) block).getBlockModels(blockState);
if (models != null) {
ModelResourceLocation stateLoc = BlockModelShaper.stateToModelLocation(clearLoc, blockState);
cacheAndQueueDependencies(stateLoc, model);
cacheAndQueueDependencies(stateLoc, models.getMiddle());
unbakedCache.put(models.getLeft(), models.getRight());
}
});
info.cancel();
@ -106,16 +108,16 @@ public abstract class ModelLoaderMixin {
ResourceLocation itemId = new ResourceLocation(id.getNamespace(), data[1]);
Optional<Block> block = Registry.BLOCK.getOptional(itemId);
if (block.isPresent()) {
if (block.get() instanceof Patterned) {
Patterned patterned = (Patterned) block.get();
model = be_getModel(data, id, patterned);
if (block.get() instanceof ModelProvider) {
ModelProvider modelProvider = (ModelProvider) block.get();
model = be_getModel(data, id, modelProvider);
info.setReturnValue(model);
}
} else {
Optional<Item> item = Registry.ITEM.getOptional(itemId);
if (item.isPresent() && item.get() instanceof Patterned) {
Patterned patterned = (Patterned) item.get();
model = be_getModel(data, id, patterned);
if (item.isPresent() && item.get() instanceof ModelProvider) {
ModelProvider modelProvider = (ModelProvider) item.get();
model = be_getModel(data, id, modelProvider);
info.setReturnValue(model);
}
}
@ -124,15 +126,15 @@ public abstract class ModelLoaderMixin {
}
}
private BlockModel be_getModel(String[] data, ResourceLocation id, Patterned patterned) {
private BlockModel be_getModel(String[] data, ResourceLocation id, ModelProvider modelProvider) {
String pattern;
if (id.getPath().contains("item")) {
pattern = patterned.getModelString(id.getPath());
pattern = modelProvider.getModelString(id.getPath());
} else {
if (data.length > 2) {
pattern = patterned.getModelString(data[2]);
pattern = modelProvider.getModelString(data[2]);
} else {
pattern = patterned.getModelString(data[1]);
pattern = modelProvider.getModelString(data[1]);
}
}
BlockModel model = BlockModel.fromString(pattern);

View file

@ -13,7 +13,7 @@ import com.google.gson.Gson;
import net.minecraft.client.renderer.block.model.BlockModelDefinition;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.level.block.Block;
import ru.betterend.patterns.BlockPatterned;
import ru.betterend.patterns.BlockModelProvider;
@Mixin(BlockModelDefinition.class)
public abstract class ModelVariantMapMixin {
@ -21,8 +21,8 @@ public abstract class ModelVariantMapMixin {
@Inject(method = "fromStream", at = @At("HEAD"), cancellable = true)
private static void be_deserializeBlockState(BlockModelDefinition.Context context, Reader reader, CallbackInfoReturnable<BlockModelDefinition> info) {
Block block = context.getDefinition().any().getBlock();
if (block instanceof BlockPatterned) {
String pattern = ((BlockPatterned) block).getStatesPattern(reader);
if (block instanceof BlockModelProvider) {
String pattern = ((BlockModelProvider) block).getStatesPattern(reader);
Gson gson = ContextGsonAccessor.class.cast(context).getGson();
BlockModelDefinition map = GsonHelper.fromJson(gson, new StringReader(pattern), BlockModelDefinition.class);
info.setReturnValue(map);

View file

@ -17,7 +17,7 @@ import net.minecraft.server.packs.resources.FallbackResourceManager;
import net.minecraft.server.packs.resources.Resource;
import net.minecraft.world.level.block.Block;
import ru.betterend.BetterEnd;
import ru.betterend.patterns.BlockPatterned;
import ru.betterend.patterns.BlockModelProvider;
@Mixin(FallbackResourceManager.class)
public abstract class NamespaceResourceManagerMixin {
@ -35,8 +35,8 @@ public abstract class NamespaceResourceManagerMixin {
if (data.length > 1) {
ResourceLocation blockId = BetterEnd.makeID(data[1].replace(".json", ""));
Block block = Registry.BLOCK.get(blockId);
if (block instanceof BlockPatterned) {
ResourceLocation stateId = ((BlockPatterned) block).statePatternId();
if (block instanceof BlockModelProvider) {
ResourceLocation stateId = ((BlockModelProvider) block).statePatternId();
try {
List<Resource> resources = Lists.newArrayList();
Resource stateRes = this.getResource(stateId);