--- a/net/minecraft/client/renderer/entity/layers/BipedArmorLayer.java
+++ b/net/minecraft/client/renderer/entity/layers/BipedArmorLayer.java
@@ -44,19 +44,20 @@
       if (itemstack.func_77973_b() instanceof ArmorItem) {
          ArmorItem armoritem = (ArmorItem)itemstack.func_77973_b();
          if (armoritem.func_185083_B_() == p_241739_4_) {
+            p_241739_6_ = getArmorModelHook(p_241739_3_, itemstack, p_241739_4_, p_241739_6_);
             this.func_215332_c().func_217148_a(p_241739_6_);
             this.func_188359_a(p_241739_6_, p_241739_4_);
             boolean flag = this.func_188363_b(p_241739_4_);
             boolean flag1 = itemstack.func_77962_s();
-            if (armoritem instanceof DyeableArmorItem) {
-               int i = ((DyeableArmorItem)armoritem).func_200886_f(itemstack);
+            if (armoritem instanceof net.minecraft.item.IDyeableArmorItem) {
+               int i = ((net.minecraft.item.IDyeableArmorItem)armoritem).func_200886_f(itemstack);
                float f = (float)(i >> 16 & 255) / 255.0F;
                float f1 = (float)(i >> 8 & 255) / 255.0F;
                float f2 = (float)(i & 255) / 255.0F;
-               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, armoritem, flag1, p_241739_6_, flag, f, f1, f2, (String)null);
-               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, armoritem, flag1, p_241739_6_, flag, 1.0F, 1.0F, 1.0F, "overlay");
+               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, flag1, p_241739_6_, f, f1, f2, this.getArmorResource(p_241739_3_, itemstack, p_241739_4_, null));
+               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, flag1, p_241739_6_, 1.0F, 1.0F, 1.0F, this.getArmorResource(p_241739_3_, itemstack, p_241739_4_, "overlay"));
             } else {
-               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, armoritem, flag1, p_241739_6_, flag, 1.0F, 1.0F, 1.0F, (String)null);
+               this.func_241738_a_(p_241739_1_, p_241739_2_, p_241739_5_, flag1, p_241739_6_, 1.0F, 1.0F, 1.0F, this.getArmorResource(p_241739_3_, itemstack, p_241739_4_, null));
             }
 
          }
@@ -88,7 +89,10 @@
    }
 
    private void func_241738_a_(MatrixStack p_241738_1_, IRenderTypeBuffer p_241738_2_, int p_241738_3_, ArmorItem p_241738_4_, boolean p_241738_5_, A p_241738_6_, boolean p_241738_7_, float p_241738_8_, float p_241738_9_, float p_241738_10_, @Nullable String p_241738_11_) {
-      IVertexBuilder ivertexbuilder = ItemRenderer.func_239386_a_(p_241738_2_, RenderType.func_239263_a_(this.func_241737_a_(p_241738_4_, p_241738_7_, p_241738_11_)), false, p_241738_5_);
+       func_241738_a_(p_241738_1_, p_241738_2_, p_241738_3_, p_241738_5_, p_241738_6_, p_241738_8_, p_241738_9_, p_241738_10_, this.func_241737_a_(p_241738_4_, p_241738_7_, p_241738_11_));
+   }
+   private void func_241738_a_(MatrixStack p_241738_1_, IRenderTypeBuffer p_241738_2_, int p_241738_3_, boolean p_241738_5_, A p_241738_6_, float p_241738_8_, float p_241738_9_, float p_241738_10_, ResourceLocation armorResource) {
+      IVertexBuilder ivertexbuilder = ItemRenderer.func_239386_a_(p_241738_2_, RenderType.func_239263_a_(armorResource), false, p_241738_5_);
       p_241738_6_.func_225598_a_(p_241738_1_, ivertexbuilder, p_241738_3_, OverlayTexture.field_229196_a_, p_241738_8_, p_241738_9_, p_241738_10_, 1.0F);
    }
 
@@ -100,8 +104,50 @@
       return p_188363_1_ == EquipmentSlotType.LEGS;
    }
 
+   @Deprecated //Use the more sensitive version getArmorResource below
    private ResourceLocation func_241737_a_(ArmorItem p_241737_1_, boolean p_241737_2_, @Nullable String p_241737_3_) {
       String s = "textures/models/armor/" + p_241737_1_.func_200880_d().func_200897_d() + "_layer_" + (p_241737_2_ ? 2 : 1) + (p_241737_3_ == null ? "" : "_" + p_241737_3_) + ".png";
       return field_177191_j.computeIfAbsent(s, ResourceLocation::new);
    }
+
+   /*=================================== FORGE START =========================================*/
+
+   /**
+    * Hook to allow item-sensitive armor model. for LayerBipedArmor.
+    */
+   protected A getArmorModelHook(T entity, ItemStack itemStack, EquipmentSlotType slot, A model) {
+      return net.minecraftforge.client.ForgeHooksClient.getArmorModel(entity, itemStack, slot, model);
+   }
+
+   /**
+    * More generic ForgeHook version of the above function, it allows for Items to have more control over what texture they provide.
+    *
+    * @param entity Entity wearing the armor
+    * @param stack ItemStack for the armor
+    * @param slot Slot ID that the item is in
+    * @param type Subtype, can be null or "overlay"
+    * @return ResourceLocation pointing at the armor's texture
+    */
+   public ResourceLocation getArmorResource(net.minecraft.entity.Entity entity, ItemStack stack, EquipmentSlotType slot, @Nullable String type) {
+      ArmorItem item = (ArmorItem)stack.func_77973_b();
+      String texture = item.func_200880_d().func_200897_d();
+      String domain = "minecraft";
+      int idx = texture.indexOf(':');
+      if (idx != -1) {
+         domain = texture.substring(0, idx);
+         texture = texture.substring(idx + 1);
+      }
+      String s1 = String.format("%s:textures/models/armor/%s_layer_%d%s.png", domain, texture, (func_188363_b(slot) ? 2 : 1), type == null ? "" : String.format("_%s", type));
+
+      s1 = net.minecraftforge.client.ForgeHooksClient.getArmorTexture(entity, stack, s1, slot, type);
+      ResourceLocation resourcelocation = field_177191_j.get(s1);
+
+      if (resourcelocation == null) {
+         resourcelocation = new ResourceLocation(s1);
+         field_177191_j.put(s1, resourcelocation);
+      }
+
+      return resourcelocation;
+   }
+   /*=================================== FORGE END ===========================================*/
 }
