aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/shcm/shsupercm/fabric/citresewn
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/shcm/shsupercm/fabric/citresewn')
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/ActiveCITs.java12
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/CITResewn.java15
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ArmorFeatureRendererMixin.java54
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ElytraFeatureRendererMixin.java2
-rw-r--r--src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java25
5 files changed, 91 insertions, 17 deletions
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/ActiveCITs.java b/src/main/java/shcm/shsupercm/fabric/citresewn/ActiveCITs.java
index 9a58a9d..b0d97ab 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/ActiveCITs.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/ActiveCITs.java
@@ -75,4 +75,16 @@ public class ActiveCITs {
return null;
}
+
+ public Map<String, Identifier> getArmorTextures(ItemStack itemStack, World world, LivingEntity livingEntity) {
+ Item item = itemStack.getItem();
+ if (item instanceof ArmorItem) {
+ List<CITArmor> citArmor = this.citArmor.get(item);
+ if (citArmor != null)
+ for (CITArmor armor : citArmor)
+ if (armor.test(itemStack, null, world, livingEntity))
+ return armor.textures;
+ }
+ return null;
+ }
}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/CITResewn.java b/src/main/java/shcm/shsupercm/fabric/citresewn/CITResewn.java
index cbc7342..cf85a2c 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/CITResewn.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/CITResewn.java
@@ -21,20 +21,5 @@ public class CITResewn implements ClientModInitializer {
INSTANCE = this;
config = CITResewnConfig.read();
-
- /*net.minecraft.client.render.entity.feature.ArmorFeatureRenderer#renderArmor
- take entity.getEquippedStack(armorSlot)
- eval override
- save shadow String cachedOverride /null
-
- /*net.minecraft.client.render.entity.feature.ArmorFeatureRenderer#getArmorTexture
- if(shadow cachedOverride != null)
- mxreturn shadow cachedOverride
-
- */
-
- /*
-
- */
}
}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ArmorFeatureRendererMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ArmorFeatureRendererMixin.java
new file mode 100644
index 0000000..02f4689
--- /dev/null
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ArmorFeatureRendererMixin.java
@@ -0,0 +1,54 @@
+package shcm.shsupercm.fabric.citresewn.mixin;
+
+import net.minecraft.client.render.VertexConsumerProvider;
+import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer;
+import net.minecraft.client.render.entity.model.BipedEntityModel;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.entity.EquipmentSlot;
+import net.minecraft.entity.LivingEntity;
+import net.minecraft.item.ArmorItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.Identifier;
+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.CallbackInfo;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+import shcm.shsupercm.fabric.citresewn.CITResewn;
+import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
+
+import java.lang.ref.WeakReference;
+import java.util.Map;
+
+@Mixin(ArmorFeatureRenderer.class)
+public class ArmorFeatureRendererMixin<T extends LivingEntity, M extends BipedEntityModel<T>, A extends BipedEntityModel<T>> {
+ private WeakReference<Map<String, Identifier>> armorTexturesCached = null;
+
+ @Inject(method = "renderArmor", cancellable = true, at = @At("HEAD"))
+ public void renderArmor(MatrixStack matrices, VertexConsumerProvider vertexConsumers, T entity, EquipmentSlot armorSlot, int light, A model, CallbackInfo ci) {
+ if (!CITResewnConfig.INSTANCE().enabled || CITResewn.INSTANCE.activeCITs == null)
+ return;
+
+ ItemStack itemStack = entity.getEquippedStack(armorSlot);
+ Map<String, Identifier> armorTextures = CITResewn.INSTANCE.activeCITs.getArmorTextures(itemStack, entity.world, entity);
+ if (armorTextures != null) {
+ armorTexturesCached = new WeakReference<>(armorTextures);
+ return;
+ }
+
+ armorTexturesCached = null;
+ }
+
+ @Inject(method = "getArmorTexture", cancellable = true, at = @At("HEAD"))
+ public void getArmorTexture(ArmorItem item, boolean legs, String overlay, CallbackInfoReturnable<Identifier> cir) {
+ if (armorTexturesCached == null)
+ return;
+ Map<String, Identifier> armorTextures = armorTexturesCached.get();
+ if (armorTextures == null)
+ return;
+
+ Identifier identifier = armorTextures.get(item.getMaterial().getName() + "_layer_" + (legs ? "2" : "1") + (overlay == null ? "" : "_" + overlay));
+ if (identifier != null)
+ cir.setReturnValue(identifier);
+ }
+}
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ElytraFeatureRendererMixin.java b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ElytraFeatureRendererMixin.java
index 37f0dd9..a774de4 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ElytraFeatureRendererMixin.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/mixin/ElytraFeatureRendererMixin.java
@@ -24,7 +24,7 @@ public class ElytraFeatureRendererMixin {
private WeakReference<LivingEntity> livingEntityCached = new WeakReference<>(null);
@Inject(method = "render", cancellable = true, at = @At("HEAD"))
- public void injectCIT(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) {
+ public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, LivingEntity livingEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) {
if (!CITResewnConfig.INSTANCE().enabled || CITResewn.INSTANCE.activeCITs == null)
return;
diff --git a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java
index bc6f6e8..794167c 100644
--- a/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java
+++ b/src/main/java/shcm/shsupercm/fabric/citresewn/pack/cits/CITArmor.java
@@ -1,13 +1,36 @@
package shcm.shsupercm.fabric.citresewn.pack.cits;
+import net.minecraft.item.ArmorItem;
+import net.minecraft.item.Item;
import net.minecraft.util.Identifier;
+import net.minecraft.util.registry.Registry;
import shcm.shsupercm.fabric.citresewn.ex.CITParseException;
import shcm.shsupercm.fabric.citresewn.pack.CITPack;
-import java.util.Properties;
+import java.util.*;
public class CITArmor extends CIT {
+ public final Map<String, Identifier> textures = new HashMap<>();
+
public CITArmor(CITPack pack, Identifier identifier, Properties properties) throws CITParseException {
super(pack, identifier, properties);
+ try {
+ if (this.items.size() == 0)
+ throw new Exception("CIT must target at least one item type");
+ for (Item item : this.items)
+ if (!(item instanceof ArmorItem))
+ throw new Exception("Armor CIT must target armor items only(" + Registry.ITEM.getId(item) + " is not armor)");
+
+ for (Object o : properties.keySet())
+ if (o instanceof String property && property.startsWith("texture.")) {
+ Identifier textureIdentifier = resolvePath(identifier, properties.getProperty(property), ".png", pack.resourcePack);
+ if (textureIdentifier == null)
+ throw new Exception("Cannot resolve path for " + property);
+
+ this.textures.put(property.substring(8), textureIdentifier);
+ }
+ } catch (Exception e) {
+ throw new CITParseException(pack.resourcePack, identifier, (e.getClass() == Exception.class ? "" : e.getClass().getSimpleName() + ": ") + e.getMessage());
+ }
}
}