mirror of
https://github.com/MineLittlePony/MineLittlePony.git
synced 2025-02-21 11:54:22 +01:00
Backport: Rewrite armour texture resolution to prioritize our own naming scheme over whatever mods return
This commit is contained in:
parent
acc6bd3c4a
commit
8d4ace9535
1 changed files with 40 additions and 18 deletions
|
@ -1,13 +1,13 @@
|
||||||
package com.minelittlepony.model.armour;
|
package com.minelittlepony.model.armour;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.resources.ResourcePackRepository;
|
|
||||||
import net.minecraft.entity.EntityLivingBase;
|
import net.minecraft.entity.EntityLivingBase;
|
||||||
import net.minecraft.inventory.EntityEquipmentSlot;
|
import net.minecraft.inventory.EntityEquipmentSlot;
|
||||||
import net.minecraft.item.ItemArmor;
|
import net.minecraft.item.ItemArmor;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
|
||||||
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.minelittlepony.ForgeProxy;
|
import com.minelittlepony.ForgeProxy;
|
||||||
import com.minelittlepony.model.armour.IEquestrianArmor.ArmorLayer;
|
import com.minelittlepony.model.armour.IEquestrianArmor.ArmorLayer;
|
||||||
|
@ -15,6 +15,8 @@ import com.minelittlepony.model.armour.IEquestrianArmor.ArmorLayer;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class DefaultPonyArmorTextureResolver<T extends EntityLivingBase> implements IArmorTextureResolver<T> {
|
public class DefaultPonyArmorTextureResolver<T extends EntityLivingBase> implements IArmorTextureResolver<T> {
|
||||||
|
@ -50,40 +52,60 @@ public class DefaultPonyArmorTextureResolver<T extends EntityLivingBase> impleme
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResourceLocation resolve(ResourceLocation... resources) {
|
private ResourceLocation resolve(ResourceLocation... resources) {
|
||||||
// check resource packs for either texture.
|
|
||||||
for (ResourcePackRepository.Entry entry : Minecraft.getMinecraft().getResourcePackRepository().getRepositoryEntries()) {
|
|
||||||
for (ResourceLocation candidate : resources) {
|
|
||||||
if (entry.getResourcePack().resourceExists(candidate)) {
|
|
||||||
// ponies are more important
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the default pack
|
|
||||||
for (ResourceLocation candidate : resources) {
|
for (ResourceLocation candidate : resources) {
|
||||||
try {
|
if (resourceExists(candidate)) {
|
||||||
Minecraft.getMinecraft().getResourceManager().getResource(candidate);
|
|
||||||
return candidate;
|
return candidate;
|
||||||
} catch (IOException e) { }
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resources[resources.length - 1];
|
return resources[resources.length - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean resourceExists(ResourceLocation resource) {
|
||||||
|
try {
|
||||||
|
return Minecraft.getMinecraft().getResourceManager().getResource(resource) != null;
|
||||||
|
} catch (IOException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ResourceLocation ponifyResource(ResourceLocation human) {
|
private ResourceLocation ponifyResource(ResourceLocation human) {
|
||||||
return PONY_ARMOUR.computeIfAbsent(human, key -> {
|
return PONY_ARMOUR.computeIfAbsent(human, key -> {
|
||||||
String domain = human.getNamespace();
|
String domain = key.getNamespace();
|
||||||
if ("minecraft".equals(domain)) {
|
if ("minecraft".equals(domain)) {
|
||||||
domain = "minelittlepony"; // it's a vanilla armor. I provide these.
|
domain = "minelittlepony"; // it's a vanilla armor. I provide these.
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResourceLocation(domain, human.getPath().replace(".png", "_pony.png"));
|
return new ResourceLocation(domain, key.getPath().replace(".png", "_pony.png"));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResourceLocation getArmorTexture(T entity, ItemStack item, String def, EntityEquipmentSlot slot, @Nullable String type) {
|
private ResourceLocation getArmorTexture(T entity, ItemStack item, String def, EntityEquipmentSlot slot, @Nullable String type) {
|
||||||
return HUMAN_ARMOUR.computeIfAbsent(ForgeProxy.getArmorTexture(entity, item, def, slot, type), ResourceLocation::new);
|
|
||||||
|
String modTexture = Strings.nullToEmpty(ForgeProxy.getArmorTexture(entity, item, def, slot, type));
|
||||||
|
|
||||||
|
if (modTexture.isEmpty() || modTexture.equals(def)) {
|
||||||
|
return HUMAN_ARMOUR.computeIfAbsent(def, ResourceLocation::new);
|
||||||
|
}
|
||||||
|
|
||||||
|
return HUMAN_ARMOUR.computeIfAbsent(modTexture, s -> {
|
||||||
|
ResourceLocation modId = new ResourceLocation(s);
|
||||||
|
ResourceLocation defId = new ResourceLocation(def);
|
||||||
|
|
||||||
|
Path defPath = Paths.get(defId.getPath());
|
||||||
|
|
||||||
|
String domain = modId.getNamespace();
|
||||||
|
|
||||||
|
String path = Paths.get(modId.getPath()).getParent().resolve(defPath.getFileName()).toString().replace('\\', '/');;
|
||||||
|
|
||||||
|
ResourceLocation interemId = new ResourceLocation(domain, path);
|
||||||
|
|
||||||
|
if (resourceExists(interemId)) {
|
||||||
|
return interemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return modId;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue