Получить текстуру блока (предмета) в стаке

Версия Minecraft
1.7.10
1,976
68
220
Здравствуйте,
Я делаю что-то вроде полочки, на которую можно положить предмет(ы).
Нужно получить текстуру блока или предмета из ItemStack'а на этой полочке. Хотел обычным геттером protected String getIconString() (из предмета) - не даёт - пишет "The method getIconString() from the type Item is not visible ". Тоже самое с геттером блока. Сделал рефлексией. Теперь консоль кричит про "java.lang.NoSuchFieldException" (iconString для предметов или textureName для блоков). Помогите, что делать?
Код:
Field icon = Block.getBlockFromItem(tileentity.getItem().getItem()).getClass().getDeclaredField("textureName");
				icon.setAccessible(true);
				GL11.glBindTexture(GL11.GL_TEXTURE_2D, (minecraft.renderEngine.getTexture(new ResourceLocation((String)icon.get(Block.getBlockFromItem(tileentity.getItem().getItem()))))).getGlTextureId());

Field icon = tileentity.getItem().getItem().getClass().getDeclaredField("iconString");
				icon.setAccessible(true);
				GL11.glBindTexture(GL11.GL_TEXTURE_2D, minecraft.renderEngine.getTexture(new ResourceLocation((String)icon.get(tileentity.getItem().getItem()))).getGlTextureId());
// Да, знаю, код упоротый. Может и где-то в нём проблема...
 
Решение
Либо убрать:
Код:
GL11.glTranslated(tile.xCoord - mc.thePlayer.posX + 0.5, tile.yCoord - mc.thePlayer.posY + 0.5, tile.zCoord - mc.thePlayer.posZ + 0.5);
с
Код:
    private void renderShelfAt(ShelfTileEntity tile, double x, double y, double z, float f) {
        if(tile.item == null) return;
        renderDisplayedName(tile, x, y, z);
        renderItem(tile);
    }
на
Код:
	private void renderShelfAt(ShelfTileEntity tile, double x, double y, double z, float f) {
		if(tile.getItemStack() == null) return;
		renderDisplayedName(tile, x, y, z);
		GL11.glPushMatrix();
		GL11.glTranslated(x, y, z);
		GL11.glTranslatef(0.5F, 0.5F, 0.5F);
		renderItem(tile);
		GL11.glPopMatrix();
	}


Если хочешь нормально все предметы были видны...
1,976
68
220
Не работает...
Код:
// ...
EntityItem entityitem = new EntityItem(tile.getWorldObj(), 0.0D, 0.0D, 0.0D, itemstack);
Item item = entityitem.getEntityItem().getItem();
entityitem.getEntityItem().stackSize = tile.getItem().stackSize;
entityitem.hoverStart = 0.0F;
GL11.glPushMatrix();
RenderWorldLastEvent event = new RenderWorldLastEvent(new RenderGlobal(mc), 0);
double xFix = -(mc.thePlayer.lastTickPosX + (mc.thePlayer.posX - mc.thePlayer.lastTickPosX) * event.partialTicks);
double yFix = -(mc.thePlayer.lastTickPosY + (mc.thePlayer.posY - mc.thePlayer.lastTickPosY) * event.partialTicks);
double zFix = -(mc.thePlayer.lastTickPosZ + (mc.thePlayer.posZ - mc.thePlayer.lastTickPosZ) * event.partialTicks);
GL11.glTranslated(xFix + 0.5, yFix + 0.5, zFix + 0.5);
// ...
 
1,976
68
220
Я же кидал?
Код:
package alexsocol.scprein.blocks.render;
 
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureCompass;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MathHelper;

import org.lwjgl.opengl.GL11;

import alexsocol.scprein.blocks.tileentity.ShelfTileEntity;
import cpw.mods.fml.common.registry.GameRegistry;

public class ShelfRender extends TileEntitySpecialRenderer {

	public RenderBlocks renderBlocksInstance = new RenderBlocks();
	private Minecraft mc = Minecraft.getMinecraft();
	
	public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float f) {
		renderShelfAt((ShelfTileEntity)tile, x, y, z, f);		
	}
	
	private void renderShelfAt(ShelfTileEntity tile, double x, double y, double z, float f) {
		if(tile.item == null) return;
		renderDisplayedName(tile, x, y, z);
		renderItem(tile);
	}
	
	public void renderItem(ShelfTileEntity tile) {
		ItemStack itemstack = tile.getItem();
		if (itemstack != null) {
			EntityItem entityitem = new EntityItem(tile.getWorldObj(), 0.0D, 0.0D, 0.0D, itemstack);
			Item item = entityitem.getEntityItem().getItem();
			entityitem.getEntityItem().stackSize = tile.getItem().stackSize;
			entityitem.hoverStart = 0.0F;
			GL11.glPushMatrix();
			GL11.glTranslated(tile.xCoord - mc.thePlayer.posX + 0.5, tile.yCoord - mc.thePlayer.posY + 0.5, tile.zCoord - mc.thePlayer.posZ + 0.5);
			int rotation = tile.blockMetadata == 0 ? 2 : tile.blockMetadata == 1 ? 1 : tile.blockMetadata == 2 ? 0 : tile.blockMetadata == 3 ? -1 : 0;
			GL11.glRotatef(180.0F + 90 * rotation, 0.0F, 1.0F, 0.0F);
			if (item == Items.compass) {
				TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
				texturemanager.bindTexture(TextureMap.locationItemsTexture);
				TextureAtlasSprite textureatlassprite1 = ((TextureMap) texturemanager.getTexture(TextureMap.locationItemsTexture)).getAtlasSprite(Items.compass.getIconIndex(entityitem.getEntityItem()).getIconName());

				if (textureatlassprite1 instanceof TextureCompass) {
					TextureCompass texturecompass = (TextureCompass) textureatlassprite1;
					double d0 = texturecompass.currentAngle;
					double d1 = texturecompass.angleDelta;
					texturecompass.currentAngle = 0.0D;
					texturecompass.angleDelta = 0.0D;
					texturecompass.updateCompass(tile.getWorldObj(), tile.xCoord, tile.zCoord, (double) MathHelper.wrapAngleTo180_float((float) (180 + tile.blockMetadata * 90)), false, true);
					texturecompass.currentAngle = d0;
					texturecompass.angleDelta = d1;
				}

				RenderItem.renderInFrame = true;
				RenderManager.instance.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
				RenderItem.renderInFrame = false;

				if (item == Items.compass) {
					TextureAtlasSprite textureatlassprite = ((TextureMap) Minecraft.getMinecraft().getTextureManager().getTexture(TextureMap.locationItemsTexture)).getAtlasSprite(Items.compass.getIconIndex(entityitem.getEntityItem()).getIconName());

					if (textureatlassprite.getFrameCount() > 0) {
						textureatlassprite.updateAnimation();
					}
				}
			}

			GL11.glPopMatrix();
        }
    }
	
	public void renderDisplayedName(ShelfTileEntity tile, double x, double y, double z) {
		GL11.glPushMatrix();
		int facing1 = (tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord) & 3);
		float pos = 0F;
		if(facing1 == 0 )pos = 180F;
		else if (facing1 == 1) pos = 90F;
		else if (facing1 == 2) pos = 0F;
		else if (facing1 == 3) pos = 270F;
		if(tile.item.getMaxDamage() > 1){
			renderLivingLabel(tile.item.getMaxDamage() - tile.item.getItemDamage() + "/" + tile.item.getMaxDamage(), x + 0.5D, y + 0.85D, z + 0.5D, pos);
		} else if (tile.item.isStackable()) {
			renderLivingLabel(tile.item.getDisplayName() + " (" + tile.item.stackSize + ")", x + 0.5D, y + 0.85D, z + 0.5D, pos);
		} else {
			renderLivingLabel(tile.item.getDisplayName(), x + 0.5D, y + 0.85D, z + 0.5D, pos);	
		}
        GL11.glPopMatrix();
	}
	
	public void renderLivingLabel(String name, double x, double y, double z, float position) {
		FontRenderer var12 = this.mc.fontRenderer;
		float var13 = 0.75F;
		float var14 = 0.012666668F * var13;
		float var17 = 0F;
		if (var12.getStringWidth(name) > 70) {
			var17 = 0.9F / var12.getStringWidth(name);
		} else {
			var17 = var14;
		}
		GL11.glPushMatrix();
		GL11.glTranslatef((float) x, (float) y, (float) z);
		GL11.glNormal3f(0.0F, 0.0F, 0.0F);
		GL11.glRotatef(position, 0.0F, 1.0F, 0.0F);
		GL11.glScalef(-var17, -var14, var17);
		GL11.glDisable(GL11.GL_LIGHTING);
		GL11.glDepthMask(false);
		byte var16 = 0;
		var12.drawString(name, -var12.getStringWidth(name) / 2, var16, 553648127);
		GL11.glDepthMask(true);
		GL11.glEnable(GL11.GL_LIGHTING);
		GL11.glPopMatrix();
	}
}
 

timaxa007

Модератор
5,831
409
672
Вроде кидал.
Вопрос: зачем тебе это?
Код:
GL11.glTranslated(tile.xCoord - mc.thePlayer.posX + 0.5, tile.yCoord - mc.thePlayer.posY + 0.5, tile.zCoord - mc.thePlayer.posZ + 0.5);


Код:
GL11.glTranslated(tile.xCoord - mc.thePlayer.posX + 0.5, tile.yCoord - mc.thePlayer.posY + 0.5, tile.zCoord - mc.thePlayer.posZ + 0.5);
на
Код:
GL11.glTranslatef(
	(float)((double)tile.xCoord - TileEntityRendererDispatcher.staticPlayerX) + 0.5F, 
	(float)((double)tile.yCoord - TileEntityRendererDispatcher.staticPlayerY) + 0.5F, 
	(float)((double)tile.zCoord - TileEntityRendererDispatcher.staticPlayerZ) + 0.5F);
Можно было и по другому.
 
1,976
68
220
Чтобы привязать рендер предмета к центру полочки.
Это должна быть полочка, ниже скрин того, как на ней выглядит предмет. Но он дёргается, если игрок ходит. А как иначе привязать я не знаю. А без этого он на голове рисуется и следует за игроком
V2rjk2qX-vI.jpg
 

timaxa007

Модератор
5,831
409
672
Либо убрать:
Код:
GL11.glTranslated(tile.xCoord - mc.thePlayer.posX + 0.5, tile.yCoord - mc.thePlayer.posY + 0.5, tile.zCoord - mc.thePlayer.posZ + 0.5);
с
Код:
    private void renderShelfAt(ShelfTileEntity tile, double x, double y, double z, float f) {
        if(tile.item == null) return;
        renderDisplayedName(tile, x, y, z);
        renderItem(tile);
    }
на
Код:
	private void renderShelfAt(ShelfTileEntity tile, double x, double y, double z, float f) {
		if(tile.getItemStack() == null) return;
		renderDisplayedName(tile, x, y, z);
		GL11.glPushMatrix();
		GL11.glTranslated(x, y, z);
		GL11.glTranslatef(0.5F, 0.5F, 0.5F);
		renderItem(tile);
		GL11.glPopMatrix();
	}


Если хочешь нормально все предметы были видны, тогда перемести
Код:
RenderItem.renderInFrame = true;
RenderManager.instance.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
RenderItem.renderInFrame = false;
за условия
Код:
if (item == Items.compass) {
Или иначе, у тебя только компас будет отображаться.


Код:
	private void render(TileEntityStand tile, double x, double y, double z, float parTick) {
		GL11.glPushMatrix();
		GL11.glDisable(GL11.GL_LIGHTING);
		GL11.glTranslated(x, y, z);

		if (tile != null) {
			ItemStack itemstack = tile.getItemStack();
			if (itemstack != null) {

				GL11.glPushMatrix();
				GL11.glTranslatef(0.5F, 0.5F, 0.5F);
				EntityItem entityitem = new EntityItem(tile.getWorldObj(), 0.0D, 0.0D, 0.0D, itemstack);
				entityitem.hoverStart = 0.0F;
				renderManager.renderEntityWithPosYaw(entityitem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
				GL11.glDisable(GL11.GL_LIGHTING);
				GL11.glColor3f(1F, 1F, 1F);
				GL11.glPopMatrix();
			}
		}

		GL11.glEnable(GL11.GL_LIGHTING);
		GL11.glPopMatrix();
	}
 
Сверху