I'm trying to create a television that changes its texture when you right-click on the block, changing the channel data held in the tile entity. So far I can only get the TESR to update and read the correct data if I reload my world, but I can't figure out a way to force a recheck of the tile entity data by the renderer.
Tile Entity:
public class LargeTelevisionTileEntity extends TileEntity {
private int channel = 0;
public int getChannel() {
return channel;
}
public void nextChannel() {
if(channel == 3) {
channel = 0;
}
else {
++channel;
}
}
@Override
public void writeToNBT(NBTTagCompound var1)
{
super.writeToNBT(var1);
var1.setInteger("channel", channel);
}
@Override
public void readFromNBT(NBTTagCompound var1)
{
super.readFromNBT(var1);
channel = MathHelper.clamp_int(var1.getInteger("channel"), 0, 3);
}
@Override
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
readFromNBT(packet.func_148857_g());
}
@Override
public Packet getDescriptionPacket() {
NBTTagCompound tag = new NBTTagCompound();
this.writeToNBT(tag);
return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.blockMetadata, tag);
}
}
TESR:
public class LargeTelevisionTESR extends TileEntitySpecialRenderer{
private IModelCustom largeTV;
private ResourceLocation largeTVLocation;
private ResourceLocation largeTVTexture;
public LargeTelevisionTESR(){
largeTVLocation = new ResourceLocation("pokedecor", "/models/largeTV.obj");
largeTVTexture = new ResourceLocation("pokedecor", "textures/blocks/largeTVTexture.png");
largeTV = AdvancedModelLoader.loadModel(largeTVLocation);
}
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) {
System.out.printf("Channel: " + ((LargeTelevisionTileEntity)tileEntity).getChannel() + "\n"); //To tell me the data loaded in the tesr
ForgeDirection direction = null;
if (tileEntity.getWorldObj() != null) {
direction = ForgeDirection.getOrientation(tileEntity.getBlockMetadata());
}
GL11.glPushMatrix();
// Scale, Translate, Rotate
GL11.glTranslated((float)x, (float)y, (float)z);
GL11.glScalef(1.0F, 1.0F, 1.0F);
short angle = 0;
if (direction != null)
{
if (direction == ForgeDirection.NORTH)
{
angle = 180;
}
else if (direction == ForgeDirection.SOUTH)
{
angle = 0;
}
else if (direction == ForgeDirection.WEST)
{
angle = -90;
}
else if (direction == ForgeDirection.EAST)
{
angle = 90;
}
}
GL11.glRotatef((float)angle, 0.0F, 1.0F, 0.0F);
FMLClientHandler.instance().getClient().renderEngine.bindTexture(largeTVTexture);
largeTV.renderAll();
GL11.glPopMatrix();
}
}