mirror of
https://github.com/GeyserMC/Rainbow.git
synced 2025-12-19 14:59:16 +00:00
Implement MinecraftAssetResolver
This commit is contained in:
@@ -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<ResolvedModel> getResolvedModel(ResourceLocation location) {
|
||||
return Optional.empty();
|
||||
return ((ResolvedModelAccessor) modelManager).rainbow$getResolvedModel(location);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<ClientItem> getClientItem(ResourceLocation location) {
|
||||
return Optional.empty();
|
||||
return ((ResolvedModelAccessor) modelManager).rainbow$getClientItem(location);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EquipmentClientInfo getEquipmentInfo(ResourceKey<EquipmentAsset> key) {
|
||||
return null;
|
||||
public Optional<EquipmentClientInfo> getEquipmentInfo(ResourceKey<EquipmentAsset> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<BedrockPack> consumer) {
|
||||
|
||||
@@ -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<ClientItem> getClientItem(ResourceLocation location);
|
||||
|
||||
EquipmentClientInfo getEquipmentInfo(ResourceKey<EquipmentAsset> key);
|
||||
Optional<EquipmentClientInfo> getEquipmentInfo(ResourceKey<EquipmentAsset> key);
|
||||
|
||||
InputStream getTexture(ResourceLocation location);
|
||||
InputStream getTexture(ResourceLocation location) throws IOException;
|
||||
|
||||
HolderLookup.Provider registries();
|
||||
}
|
||||
|
||||
@@ -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<Equippable>) 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()))))
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user