Доброго времени суток. Решил сделать рендер предмета в двух руках, а-ля парное оружие. Сделал.
Регистрирую рендерер в клиентский init(), как положено:
И всё вроде как даже работает, и даже хорошо, только вот когда в список модов добавляется оптифайн (OptiFine_1.7.10_HD_U_D7), рендер перестаёт работать: оружие в правой руке остаётся, но в левой его как и не было.
Если кто знает, в чём дело, или я не вижу условного слона в комнате - покажите на него пальцем: подскажите, пожалуйста.
рендерер оружия в левой руке:
package lotr.client.render.entity;
import lotr.common.item.WeaponDualWieldable;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.entity.RenderPlayer;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.util.ResourceLocation;
@SideOnly(Side.CLIENT)
public class RenderPlayerOffhand extends RenderPlayer {
public ModelBiped ModelArm;
public RenderPlayerOffhand() {
super();
this.mainModel = new ModelBiped(0.0F);
this.modelBipedMain = (ModelBiped) this.mainModel;
this.modelArmorChestplate = new ModelBiped(1.0F);
this.modelArmor = new ModelBiped(0.5F);
this.ModelArm = new ModelBiped(0.5f);
}
@Override
public void renderModel(EntityLivingBase entity, float par2, float par3, float par4, float par5, float par6, float par7){
render(entity, par2, par3, par4, par5, par6, par7);
}
protected void render(EntityLivingBase p_77036_1_, float p_77036_2_, float p_77036_3_, float p_77036_4_, float p_77036_5_, float p_77036_6_, float p_77036_7_)
{
this.bindEntityTexture(p_77036_1_);
if (!p_77036_1_.isInvisible())
{
this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_);
}
else if (!p_77036_1_.isInvisibleToPlayer(Minecraft.getMinecraft().thePlayer))
{
GL11.glPushMatrix();
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.15F);
GL11.glDepthMask(false);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F);
this.mainModel.render(p_77036_1_, p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_);
GL11.glDisable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glPopMatrix();
GL11.glDepthMask(true);
}
else
{
this.mainModel.setRotationAngles(p_77036_2_, p_77036_3_, p_77036_4_, p_77036_5_, p_77036_6_, p_77036_7_, p_77036_1_);
}
if(p_77036_1_.isSwingInProgress) {
if(p_77036_1_.getHeldItem() != null && p_77036_1_.getHeldItem().getItem() instanceof LOTRWeaponDualWieldable) {
ModelArm = new ModelBiped(0.0F);
ModelArm.bipedLeftArm.rotateAngleZ = -modelBipedMain.bipedRightArm.rotateAngleZ * 0.6f;
ModelArm.bipedLeftArm.rotateAngleY = -modelBipedMain.bipedRightArm.rotateAngleY;
ModelArm.bipedLeftArm.rotateAngleX = modelBipedMain.bipedRightArm.rotateAngleX * 0.3f;
ModelArm.bipedLeftArm.render(0.0625F);
modelBipedMain.bipedLeftArm.showModel = false;
}
}else {
modelBipedMain.bipedLeftArm.showModel = true;
}
}
@Override
public void renderFirstPersonArm(EntityPlayer p_82441_1_)
{
float f = 1.0F;
GL11.glColor3f(f, f, f);
this.modelBipedMain.onGround = 0.0F;
this.modelBipedMain.setRotationAngles(0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0625F, p_82441_1_);
this.modelBipedMain.bipedRightArm.render(0.0625F);
GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F);
}
@Override
protected void renderEquippedItems(AbstractClientPlayer p_77029_1_, float p_77029_2_)
{
ItemStack itemstack1 = p_77029_1_.inventory.getCurrentItem();
float f4 = p_77029_1_.prevRenderYawOffset + (p_77029_1_.renderYawOffset - p_77029_1_.prevRenderYawOffset) * p_77029_2_;
float f2;
if (itemstack1 != null && itemstack1.getItem() instanceof WeaponDualWieldable)
{
GL11.glPushMatrix();
if(p_77029_1_.isSwingInProgress) {
this.ModelArm.bipedLeftArm.postRender(0.0625F);
}else {
}
this.modelBipedMain.bipedLeftArm.postRender(0.0625F);
GL11.glTranslatef(0.0625F, 0.4375F, 0.0625F);
if (p_77029_1_.fishEntity != null)
{
itemstack1 = new ItemStack(Items.stick);
}
EnumAction enumaction = null;
if (p_77029_1_.getItemInUseCount() > 0)
{
enumaction = itemstack1.getItemUseAction();
}
net.minecraftforge.client.IItemRenderer customRenderer = net.minecraftforge.client.MinecraftForgeClient.getItemRenderer(itemstack1, net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED);
boolean is3D = (customRenderer != null && customRenderer.shouldUseRenderHelper(net.minecraftforge.client.IItemRenderer.ItemRenderType.EQUIPPED, itemstack1, net.minecraftforge.client.IItemRenderer.ItemRendererHelper.BLOCK_3D));
if (is3D || itemstack1.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(itemstack1.getItem()).getRenderType()))
{
f2 = 0.5F;
GL11.glTranslatef(0.0F, 0.1875F, -0.3125F);
f2 *= 0.75F;
GL11.glRotatef(20.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
GL11.glScalef(-f2, -f2, f2);
}
else if (itemstack1.getItem() == Items.bow)
{
f2 = 0.625F;
GL11.glTranslatef(0.0F, 0.125F, 0.3125F);
GL11.glRotatef(-20.0F, 0.0F, 1.0F, 0.0F);
GL11.glScalef(f2, -f2, f2);
GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(45.0F, 0.0F, 1.0F, 0.0F);
}
else if (itemstack1.getItem().isFull3D())
{
f2 = 0.625F;
if (itemstack1.getItem().shouldRotateAroundWhenRendering())
{
GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
GL11.glTranslatef(0.0F, -0.125F, 0.0F);
}
if (p_77029_1_.getItemInUseCount() > 0 && enumaction == EnumAction.block)
{
GL11.glTranslatef(0.05F, 0.0F, -0.1F);
GL11.glRotatef(50.0F, 0.0F, 1.0F, 0.0F);
GL11.glRotatef(-10.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(40.0F, 0.0F, 0.0F, 1.0F);
}
GL11.glTranslatef(0.0675F, 0.1875F, 0.0F);
GL11.glScalef(f2, -f2, f2);
GL11.glRotatef(-100.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(35.0F, 0.0F, 1.0F, 0.0F);
}
else
{
f2 = 0.375F;
GL11.glTranslatef(0.25F, 0.1875F, -0.1875F);
GL11.glScalef(f2, f2, f2);
GL11.glRotatef(60.0F, 0.0F, 0.0F, 1.0F);
GL11.glRotatef(-90.0F, 1.0F, 0.0F, 0.0F);
GL11.glRotatef(20.0F, 0.0F, 0.0F, 1.0F);
}
float f3;
int k;
float f12;
if (itemstack1.getItem().requiresMultipleRenderPasses())
{
for (k = 0; k < itemstack1.getItem().getRenderPasses(itemstack1.getItemDamage()); ++k)
{
int i = itemstack1.getItem().getColorFromItemStack(itemstack1, k);
f12 = (float)(i >> 16 & 255) / 255.0F;
f3 = (float)(i >> 8 & 255) / 255.0F;
f4 = (float)(i & 255) / 255.0F;
GL11.glColor4f(f12, f3, f4, 1.0F);
this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, k);
}
}
else
{
k = itemstack1.getItem().getColorFromItemStack(itemstack1, 0);
float f11 = (float)(k >> 16 & 255) / 255.0F;
f12 = (float)(k >> 8 & 255) / 255.0F;
f3 = (float)(k & 255) / 255.0F;
GL11.glColor4f(f11, f12, f3, 1.0F);
this.renderManager.itemRenderer.renderItem(p_77029_1_, itemstack1, 0);
}
GL11.glPopMatrix();
}
super.renderEquippedItems(p_77029_1_, p_77029_2_);
}
private static void setColorFromInt(int color) {
float r = (color >> 16 & 0xFF) / 255.0F;
float g = (color >> 8 & 0xFF) / 255.0F;
float b = (color & 0xFF) / 255.0F;
GL11.glColor4f(r, g, b, 1.0F);
}
}
Регистрирую рендерер в клиентский init(), как положено:
Java:
RenderingRegistry.registerEntityRenderingHandler(EntityPlayer.class, new RenderPlayerOffhand());
Если кто знает, в чём дело, или я не вижу условного слона в комнате - покажите на него пальцем: подскажите, пожалуйста.