diff --git a/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java b/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java index 1a1c392..77a7b87 100644 --- a/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java +++ b/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java @@ -1,41 +1,60 @@ package org.geysermc.rainbow.client; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.item.ClientItem; +import net.minecraft.client.resources.model.EquipmentAssetManager; import net.minecraft.client.resources.model.EquipmentClientInfo; +import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.core.HolderLookup; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.item.equipment.EquipmentAsset; +import org.geysermc.rainbow.client.accessor.ResolvedModelAccessor; +import org.geysermc.rainbow.client.mixin.EntityRenderDispatcherAccessor; import org.geysermc.rainbow.mapping.AssetResolver; +import java.io.IOException; import java.io.InputStream; +import java.util.Objects; import java.util.Optional; public class MinecraftAssetResolver implements AssetResolver { + private final ModelManager modelManager; + private final EquipmentAssetManager equipmentAssetManager; + private final ResourceManager resourceManager; + private final HolderLookup.Provider registries; + + public MinecraftAssetResolver(Minecraft minecraft) { + modelManager = minecraft.getModelManager(); + equipmentAssetManager = ((EntityRenderDispatcherAccessor) minecraft.getEntityRenderDispatcher()).getEquipmentAssets(); + resourceManager = minecraft.getResourceManager(); + registries = Objects.requireNonNull(minecraft.level).registryAccess(); + } @Override public Optional getResolvedModel(ResourceLocation location) { - return Optional.empty(); + return ((ResolvedModelAccessor) modelManager).rainbow$getResolvedModel(location); } @Override public Optional getClientItem(ResourceLocation location) { - return Optional.empty(); + return ((ResolvedModelAccessor) modelManager).rainbow$getClientItem(location); } @Override - public EquipmentClientInfo getEquipmentInfo(ResourceKey key) { - return null; + public Optional getEquipmentInfo(ResourceKey key) { + return Optional.of(equipmentAssetManager.get(key)); } @Override - public InputStream getTexture(ResourceLocation location) { - return null; + public InputStream getTexture(ResourceLocation location) throws IOException { + return resourceManager.open(location); } @Override public HolderLookup.Provider registries() { - return null; + return registries; } } diff --git a/client/src/main/java/org/geysermc/rainbow/client/PackManager.java b/client/src/main/java/org/geysermc/rainbow/client/PackManager.java index 458609d..1b526b4 100644 --- a/client/src/main/java/org/geysermc/rainbow/client/PackManager.java +++ b/client/src/main/java/org/geysermc/rainbow/client/PackManager.java @@ -1,5 +1,6 @@ package org.geysermc.rainbow.client; +import net.minecraft.client.Minecraft; import org.geysermc.rainbow.pack.BedrockPack; import java.io.IOException; @@ -16,7 +17,7 @@ public final class PackManager { throw new IllegalStateException("Already started a pack (" + currentPack.get().name() + ")"); } - currentPack = Optional.of(new BedrockPack(name, new MinecraftAssetResolver())); + currentPack = Optional.of(new BedrockPack(name, new MinecraftAssetResolver(Minecraft.getInstance()))); } public void run(Consumer consumer) { diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java index 1ea9e60..b949268 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java @@ -8,6 +8,7 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.equipment.EquipmentAsset; +import java.io.IOException; import java.io.InputStream; import java.util.Optional; @@ -17,9 +18,9 @@ public interface AssetResolver { Optional getClientItem(ResourceLocation location); - EquipmentClientInfo getEquipmentInfo(ResourceKey key); + Optional getEquipmentInfo(ResourceKey key); - InputStream getTexture(ResourceLocation location); + InputStream getTexture(ResourceLocation location) throws IOException; HolderLookup.Provider registries(); } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java index 8801f98..85a1487 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java @@ -27,7 +27,7 @@ public class AttachableMapper { .map(geometry -> BedrockAttachable.geometry(bedrockIdentifier, geometry.geometry().definitions().getFirst(), geometry.texture().getPath())) .or(() -> Optional.ofNullable(components.get(DataComponents.EQUIPPABLE)) .flatMap(optional -> (Optional) optional) - .flatMap(equippable -> equippable.assetId().map(asset -> Pair.of(equippable.slot(), assetResolver.getEquipmentInfo(asset)))) + .flatMap(equippable -> equippable.assetId().flatMap(assetResolver::getEquipmentInfo).map(info -> Pair.of(equippable.slot(), info))) .filter(assetInfo -> assetInfo.getSecond() != EquipmentAssetManager.MISSING) .map(assetInfo -> assetInfo .mapSecond(info -> info.getLayers(getLayer(assetInfo.getFirst())))) diff --git a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java index 11716dc..225ee78 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java @@ -167,7 +167,7 @@ public class BedrockPack { } for (ResourceLocation texture : texturesToExport) { - texture = texture.withPath(path -> "textures/" + path + ".png"); // FIXME + texture = texture.withPath(path -> "textures/" + path + ".png"); try (InputStream inputTexture = context.assetResolver().getTexture(texture)) { Path texturePath = packPath.resolve(texture.getPath()); CodecUtil.ensureDirectoryExists(texturePath.getParent());