package com.teamwizardry.wizardry.client.render; import com.teamwizardry.librarianlib.features.kotlin.ClientUtilMethods; import com.teamwizardry.librarianlib.features.shader.ShaderHelper; import com.teamwizardry.wizardry.api.capability.player.mana.EnumBloodType; import com.teamwizardry.wizardry.api.capability.player.mana.IManaCapability; import com.teamwizardry.wizardry.api.capability.player.mana.ManaCapabilityProvider; import com.teamwizardry.wizardry.client.fx.Shaders; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.model.ModelBiped.ArmPose; import net.minecraft.client.model.ModelPlayer; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager.Profile; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.client.renderer.entity.layers.LayerRenderer; import net.minecraft.entity.player.EnumPlayerModelParts; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHandSide; import javax.annotation.Nonnull; public class BloodRenderLayer implements LayerRenderer<AbstractClientPlayer> { private final RenderPlayer render; public BloodRenderLayer(RenderPlayer renderIn) { render = renderIn; } @Override public void doRenderLayer(@Nonnull AbstractClientPlayer entity, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) { if (Minecraft.getMinecraft().player == null || Minecraft.getMinecraft().world == null) return; IManaCapability cap = ManaCapabilityProvider.getCap(entity); if (cap != null) { EnumBloodType type = cap.getBloodType(); if (type != null && type != EnumBloodType.NONE) { render.bindTexture(EnumBloodType.getResourceLocation(type)); ClientUtilMethods.glColor(type.color); setModelVisibilities(entity); GlStateManager.enableBlendProfile(Profile.PLAYER_SKIN); GlStateManager.disableLighting(); ShaderHelper.INSTANCE.useShader(Shaders.rawColor); render.getMainModel().render(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale); GlStateManager.enableLighting(); ShaderHelper.INSTANCE.releaseShader(); GlStateManager.disableBlendProfile(Profile.PLAYER_SKIN); GlStateManager.color(1.0F, 1.0F, 1.0F); } } } private void setModelVisibilities(AbstractClientPlayer clientPlayer) { ModelPlayer modelplayer = render.getMainModel(); if (clientPlayer.isSpectator()) { modelplayer.setVisible(true); modelplayer.bipedHead.showModel = true; modelplayer.bipedHeadwear.showModel = true; } else { ItemStack stackMain = clientPlayer.getHeldItemMainhand(); ItemStack stackOff = clientPlayer.getHeldItemOffhand(); modelplayer.setVisible(false); modelplayer.bipedHeadwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.HAT); modelplayer.bipedBodyWear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.JACKET); modelplayer.bipedLeftLegwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.LEFT_PANTS_LEG); modelplayer.bipedRightLegwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.RIGHT_PANTS_LEG); modelplayer.bipedLeftArmwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.LEFT_SLEEVE); modelplayer.bipedRightArmwear.showModel = clientPlayer.isWearing(EnumPlayerModelParts.RIGHT_SLEEVE); modelplayer.isSneak = clientPlayer.isSneaking(); ArmPose poseMain = ArmPose.EMPTY; if (!stackMain.isEmpty()) { poseMain = ArmPose.ITEM; if (clientPlayer.getItemInUseCount() > 0) { EnumAction enumaction = stackMain.getItemUseAction(); if (enumaction == EnumAction.BLOCK) { poseMain = ArmPose.BLOCK; } else if (enumaction == EnumAction.BOW) { poseMain = ArmPose.BOW_AND_ARROW; } } } ArmPose poseOff = ArmPose.EMPTY; if (!stackOff.isEmpty()) { poseOff = ArmPose.ITEM; if (clientPlayer.getItemInUseCount() > 0) { EnumAction enumaction1 = stackOff.getItemUseAction(); if (enumaction1 == EnumAction.BLOCK) { poseOff = ArmPose.BLOCK; } } } if (clientPlayer.getPrimaryHand() == EnumHandSide.RIGHT) { modelplayer.rightArmPose = poseMain; modelplayer.leftArmPose = poseOff; } else { modelplayer.rightArmPose = poseOff; modelplayer.leftArmPose = poseMain; } } } @Override public boolean shouldCombineTextures() { return false; } }