Hi!
I've been tinkering with making custom chests by looking at and copying vanilla code. So far I have managed to make it work and look like a vanilla chest while placed in the world, however in the inventory and hand it has the black and pink error-texture. I have tried copying the vanilla item model, but that alone doesn't do anything. I suspect I have to use some kind of special renderer but I can't figure out how.
This is my current code, if you need any other classes just ask.
TileEntitySpruceChest.java
package nu.aksberg.mb.tileentity;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import nu.aksberg.mb.block.SpruceChestBlock;
public class TileEntitySpruceChest extends TileEntityChest{
private SpruceChestBlock.Type cachedChestType;
public TileEntitySpruceChest() {
}
public TileEntitySpruceChest(SpruceChestBlock.Type p_i46677_1_)
{
this.cachedChestType = p_i46677_1_;
}
@SuppressWarnings("incomplete-switch")
private void func_174910_a(TileEntitySpruceChest chestTe, EnumFacing side)
{
if (chestTe.isInvalid())
{
this.adjacentChestChecked = false;
}
else if (this.adjacentChestChecked)
{
switch (side)
{
case NORTH:
if (this.adjacentChestZNeg != chestTe)
{
this.adjacentChestChecked = false;
}
break;
case SOUTH:
if (this.adjacentChestZPos != chestTe)
{
this.adjacentChestChecked = false;
}
break;
case EAST:
if (this.adjacentChestXPos != chestTe)
{
this.adjacentChestChecked = false;
}
break;
case WEST:
if (this.adjacentChestXNeg != chestTe)
{
this.adjacentChestChecked = false;
}
}
}
}
protected TileEntitySpruceChest getAdjacentChest(EnumFacing side)
{
BlockPos blockpos = this.pos.offset(side);
if (this.isChestAt(blockpos))
{
TileEntity tileentity = this.worldObj.getTileEntity(blockpos);
if (tileentity instanceof TileEntitySpruceChest)
{
TileEntitySpruceChest tileentitychest = (TileEntitySpruceChest)tileentity;
tileentitychest.func_174910_a(this, side.getOpposite());
return tileentitychest;
}
}
return null;
}
private boolean isChestAt(BlockPos posIn)
{
if (this.worldObj == null)
{
return false;
}
else
{
Block block = this.worldObj.getBlockState(posIn).getBlock();
return block instanceof SpruceChestBlock && ((SpruceChestBlock)block).chestType == this.getChestType();
}
}
@Override
public void closeInventory(EntityPlayer player)
{
if (!player.isSpectator() && this.getBlockType() instanceof SpruceChestBlock)
{
--this.numPlayersUsing;
this.worldObj.addBlockEvent(this.pos, this.getBlockType(), 1, this.numPlayersUsing);
this.worldObj.notifyNeighborsOfStateChange(this.pos, this.getBlockType());
this.worldObj.notifyNeighborsOfStateChange(this.pos.down(), this.getBlockType());
}
}
@Override
public SpruceChestBlock.Type getChestType()
{
if (this.cachedChestType == null)
{
if (this.worldObj == null || !(this.getBlockType() instanceof SpruceChestBlock))
{
return SpruceChestBlock.Type.BASIC;
}
this.cachedChestType = ((SpruceChestBlock)this.getBlockType()).chestType;
}
return this.cachedChestType;
}
}
TileEntitySpruceChestRenderer.java
package nu.aksberg.mb.client.renderer.tilentity;
import java.util.Calendar;
import net.minecraft.block.Block;
import net.minecraft.block.BlockChest;
import net.minecraft.client.model.ModelChest;
import net.minecraft.client.model.ModelLargeChest;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.tileentity.TileEntityChestRenderer;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.ResourceLocation;
public class TileEntitySpruceChestRenderer extends TileEntitySpecialRenderer<TileEntityChest> {
private static final ResourceLocation textureTrappedDouble = new ResourceLocation("textures/entity/chest/trapped_double.png");
private static final ResourceLocation textureChristmasDouble = new ResourceLocation("textures/entity/chest/christmas_double.png");
private static final ResourceLocation textureNormalDouble = new ResourceLocation("mb:textures/entity/chest/spruce_double.png");
private static final ResourceLocation textureTrapped = new ResourceLocation("textures/entity/chest/trapped.png");
private static final ResourceLocation textureChristmas = new ResourceLocation("textures/entity/chest/christmas.png");
private static final ResourceLocation textureNormal = new ResourceLocation("mb:textures/entity/chest/spruce.png");
private ModelChest simpleChest = new ModelChest();
private ModelChest largeChest = new ModelLargeChest();
private boolean isChristmas;
public TileEntitySpruceChestRenderer()
{
Calendar calendar = Calendar.getInstance();
if (calendar.get(2) + 1 == 12 && calendar.get(5) >= 24 && calendar.get(5) <= 26)
{
this.isChristmas = true;
}
}
public void renderTileEntityAt(TileEntityChest te, double x, double y, double z, float partialTicks, int destroyStage)
{
GlStateManager.enableDepth();
GlStateManager.depthFunc(515);
GlStateManager.depthMask(true);
int i;
if (!te.hasWorldObj())
{
i = 0;
}
else
{
Block block = te.getBlockType();
i = te.getBlockMetadata();
if (block instanceof BlockChest && i == 0)
{
((BlockChest)block).checkForSurroundingChests(te.getWorld(), te.getPos(), te.getWorld().getBlockState(te.getPos()));
i = te.getBlockMetadata();
}
te.checkForAdjacentChests();
}
if (te.adjacentChestZNeg == null && te.adjacentChestXNeg == null)
{
ModelChest modelchest;
if (te.adjacentChestXPos == null && te.adjacentChestZPos == null)
{
modelchest = this.simpleChest;
if (destroyStage >= 0)
{
this.bindTexture(DESTROY_STAGES[destroyStage]);
GlStateManager.matrixMode(5890);
GlStateManager.pushMatrix();
GlStateManager.scale(4.0F, 4.0F, 1.0F);
GlStateManager.translate(0.0625F, 0.0625F, 0.0625F);
GlStateManager.matrixMode(5888);
}
else if (this.isChristmas)
{
this.bindTexture(textureChristmas);
}
else if (te.getChestType() == BlockChest.Type.TRAP)
{
this.bindTexture(textureTrapped);
}
else
{
this.bindTexture(textureNormal);
}
}
else
{
modelchest = this.largeChest;
if (destroyStage >= 0)
{
this.bindTexture(DESTROY_STAGES[destroyStage]);
GlStateManager.matrixMode(5890);
GlStateManager.pushMatrix();
GlStateManager.scale(8.0F, 4.0F, 1.0F);
GlStateManager.translate(0.0625F, 0.0625F, 0.0625F);
GlStateManager.matrixMode(5888);
}
else if (this.isChristmas)
{
this.bindTexture(textureChristmasDouble);
}
else if (te.getChestType() == BlockChest.Type.TRAP)
{
this.bindTexture(textureTrappedDouble);
}
else
{
this.bindTexture(textureNormalDouble);
}
}
GlStateManager.pushMatrix();
GlStateManager.enableRescaleNormal();
if (destroyStage < 0)
{
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
}
GlStateManager.translate((float)x, (float)y + 1.0F, (float)z + 1.0F);
GlStateManager.scale(1.0F, -1.0F, -1.0F);
GlStateManager.translate(0.5F, 0.5F, 0.5F);
int j = 0;
if (i == 2)
{
j = 180;
}
if (i == 3)
{
j = 0;
}
if (i == 4)
{
j = 90;
}
if (i == 5)
{
j = -90;
}
if (i == 2 && te.adjacentChestXPos != null)
{
GlStateManager.translate(1.0F, 0.0F, 0.0F);
}
if (i == 5 && te.adjacentChestZPos != null)
{
GlStateManager.translate(0.0F, 0.0F, -1.0F);
}
GlStateManager.rotate((float)j, 0.0F, 1.0F, 0.0F);
GlStateManager.translate(-0.5F, -0.5F, -0.5F);
float f = te.prevLidAngle + (te.lidAngle - te.prevLidAngle) * partialTicks;
if (te.adjacentChestZNeg != null)
{
float f1 = te.adjacentChestZNeg.prevLidAngle + (te.adjacentChestZNeg.lidAngle - te.adjacentChestZNeg.prevLidAngle) * partialTicks;
if (f1 > f)
{
f = f1;
}
}
if (te.adjacentChestXNeg != null)
{
float f2 = te.adjacentChestXNeg.prevLidAngle + (te.adjacentChestXNeg.lidAngle - te.adjacentChestXNeg.prevLidAngle) * partialTicks;
if (f2 > f)
{
f = f2;
}
}
f = 1.0F - f;
f = 1.0F - f * f * f;
modelchest.chestLid.rotateAngleX = -(f * ((float)Math.PI / 2F));
modelchest.renderAll();
GlStateManager.disableRescaleNormal();
GlStateManager.popMatrix();
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
if (destroyStage >= 0)
{
GlStateManager.matrixMode(5890);
GlStateManager.popMatrix();
GlStateManager.matrixMode(5888);
}
}
}
}