diff --git a/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java new file mode 100644 index 00000000..54dffb91 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/LayerBloodElytra.java @@ -0,0 +1,53 @@ +package WayofTime.bloodmagic.client.render; + +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.item.armour.ItemLivingArmour; +import WayofTime.bloodmagic.livingArmour.LivingArmour; +import net.minecraft.client.entity.AbstractClientPlayer; +import net.minecraft.client.model.ModelElytra; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.RenderPlayer; +import net.minecraft.client.renderer.entity.layers.LayerArmorBase; +import net.minecraft.client.renderer.entity.layers.LayerRenderer; +import net.minecraft.inventory.EntityEquipmentSlot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +public class LayerBloodElytra implements LayerRenderer { + + private static final ResourceLocation TEXTURE_BLOOD_ELYTRA = new ResourceLocation("bloodmagic", "textures/entities/bloodElytra.png"); + private final RenderPlayer renderPlayer; + private final ModelElytra modelElytra = new ModelElytra(); + + public LayerBloodElytra(RenderPlayer renderPlayer) { + this.renderPlayer = renderPlayer; + } + + @Override + public void doRenderLayer(AbstractClientPlayer clientPlayer, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { + if (LivingArmour.hasFullSet(clientPlayer)) { + ItemStack chestStack = clientPlayer.getItemStackFromSlot(EntityEquipmentSlot.CHEST); + if (ItemLivingArmour.hasUpgrade(Constants.Mod.MODID + ".upgrade.elytra", chestStack)) { + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.enableBlend(); + + renderPlayer.bindTexture(TEXTURE_BLOOD_ELYTRA); + + GlStateManager.pushMatrix(); + GlStateManager.translate(0.0F, 0.0F, 0.125F); + modelElytra.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, clientPlayer); + modelElytra.render(clientPlayer, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); + + if (chestStack.isItemEnchanted()) + LayerArmorBase.renderEnchantedGlint(this.renderPlayer, clientPlayer, this.modelElytra, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw, headPitch, scale); + + GlStateManager.popMatrix(); + } + } + } + + @Override + public boolean shouldCombineTextures() { + return false; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java index 1ffaffed..d61b9b4d 100644 --- a/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java +++ b/src/main/java/WayofTime/bloodmagic/item/armour/ItemLivingArmour.java @@ -477,6 +477,15 @@ public class ItemLivingArmour extends ItemArmor implements ISpecialArmor, IMeshP return null; } + public static boolean hasUpgrade(String id, ItemStack stack) { + if (!armourMap.containsKey(stack)) + armourMap.put(stack, getLivingArmour(stack)); + + LivingArmour armour = armourMap.get(stack); + + return armour.upgradeMap.containsKey(id); + } + public void setIsEnabled(ItemStack stack, boolean bool) { NBTHelper.checkNBT(stack); diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index c0d0028f..fddf6c46 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,13 +1,11 @@ package WayofTime.bloodmagic.proxy; +import WayofTime.bloodmagic.BloodMagic; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.IMeshProvider; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.helper.ShaderHelper; -import WayofTime.bloodmagic.client.render.RenderAlchemyArray; -import WayofTime.bloodmagic.client.render.RenderAltar; -import WayofTime.bloodmagic.client.render.RenderDemonCrucible; -import WayofTime.bloodmagic.client.render.RenderItemRoutingNode; +import WayofTime.bloodmagic.client.render.*; import WayofTime.bloodmagic.client.render.entity.BloodLightRenderFactory; import WayofTime.bloodmagic.client.render.entity.SentientArrowRenderFactory; import WayofTime.bloodmagic.client.render.entity.SoulSnareRenderFactory; @@ -27,6 +25,8 @@ import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraft.client.renderer.color.IItemColor; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -36,9 +36,11 @@ import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.registry.ClientRegistry; import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; import org.apache.commons.lang3.tuple.Pair; import java.awt.*; +import java.lang.reflect.Field; public class ClientProxy extends CommonProxy { @@ -98,6 +100,8 @@ public class ClientProxy extends CommonProxy return stack.hasTagCompound() && stack.getTagCompound().hasKey("bloody") ? new Color(0x8B191B).getRGB() : 16777215; } }, Items.BREAD); + + addElytraLayer(); } @Override @@ -136,4 +140,20 @@ public class ClientProxy extends CommonProxy ModelLoader.setCustomModelResourceLocation(item, variant.getLeft(), new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + name), variant.getRight())); } } + + private void addElytraLayer() { + RenderManager renderManager = Minecraft.getMinecraft().getRenderManager(); + try { + Field renderPlayerField = RenderManager.class.getDeclaredField("playerRenderer"); + renderPlayerField.setAccessible(true); + Object renderPlayerObj = renderPlayerField.get(renderManager); + if (renderPlayerObj instanceof RenderPlayer) { + RenderPlayer renderPlayer = (RenderPlayer) renderPlayerObj; + renderPlayer.addLayer(new LayerBloodElytra(renderPlayer)); + } + } catch (Exception e) { + BloodMagic.instance.getLogger().error("Failed to set custom Elytra Layer for Elytra Living Armour Upgrade."); + BloodMagic.instance.getLogger().error(e.getLocalizedMessage()); + } + } } diff --git a/src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png b/src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png new file mode 100644 index 00000000..511c54f8 Binary files /dev/null and b/src/main/resources/assets/bloodmagic/textures/entities/bloodElytra.png differ