001package net.minecraft.client.renderer.tileentity; 002 003import cpw.mods.fml.common.FMLLog; 004import cpw.mods.fml.relauncher.Side; 005import cpw.mods.fml.relauncher.SideOnly; 006import java.util.Calendar; 007import net.minecraft.block.Block; 008import net.minecraft.block.BlockChest; 009import net.minecraft.client.model.ModelChest; 010import net.minecraft.client.model.ModelLargeChest; 011import net.minecraft.tileentity.TileEntity; 012import net.minecraft.tileentity.TileEntityChest; 013import org.lwjgl.opengl.GL11; 014import org.lwjgl.opengl.GL12; 015 016@SideOnly(Side.CLIENT) 017public class TileEntityChestRenderer extends TileEntitySpecialRenderer 018{ 019 /** The normal small chest model. */ 020 private ModelChest chestModel = new ModelChest(); 021 022 /** The large double chest model. */ 023 private ModelChest largeChestModel = new ModelLargeChest(); 024 025 /** If true, chests will be rendered with the Christmas present textures. */ 026 private boolean isChristmas; 027 028 public TileEntityChestRenderer() 029 { 030 Calendar calendar = Calendar.getInstance(); 031 032 if (calendar.get(2) + 1 == 12 && calendar.get(5) >= 24 && calendar.get(5) <= 26) 033 { 034 this.isChristmas = true; 035 } 036 } 037 038 /** 039 * Renders the TileEntity for the chest at a position. 040 */ 041 public void renderTileEntityChestAt(TileEntityChest par1TileEntityChest, double par2, double par4, double par6, float par8) 042 { 043 int i; 044 045 if (!par1TileEntityChest.func_70309_m()) 046 { 047 i = 0; 048 } 049 else 050 { 051 Block block = par1TileEntityChest.getBlockType(); 052 i = par1TileEntityChest.getBlockMetadata(); 053 054 if (block instanceof BlockChest && i == 0) 055 { 056 try 057 { 058 ((BlockChest)block).unifyAdjacentChests(par1TileEntityChest.getWorldObj(), par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord); 059 } 060 catch (ClassCastException e) 061 { 062 FMLLog.severe("Attempted to render a chest at %d, %d, %d that was not a chest", 063 par1TileEntityChest.xCoord, par1TileEntityChest.yCoord, par1TileEntityChest.zCoord); 064 } 065 i = par1TileEntityChest.getBlockMetadata(); 066 } 067 068 par1TileEntityChest.checkForAdjacentChests(); 069 } 070 071 if (par1TileEntityChest.adjacentChestZNeg == null && par1TileEntityChest.adjacentChestXNeg == null) 072 { 073 ModelChest modelchest; 074 075 if (par1TileEntityChest.adjacentChestXPos == null && par1TileEntityChest.adjacentChestZPosition == null) 076 { 077 modelchest = this.chestModel; 078 079 if (par1TileEntityChest.func_98041_l() == 1) 080 { 081 this.bindTextureByName("/item/chests/trap_small.png"); 082 } 083 else if (this.isChristmas) 084 { 085 this.bindTextureByName("/item/xmaschest.png"); 086 } 087 else 088 { 089 this.bindTextureByName("/item/chest.png"); 090 } 091 } 092 else 093 { 094 modelchest = this.largeChestModel; 095 096 if (par1TileEntityChest.func_98041_l() == 1) 097 { 098 this.bindTextureByName("/item/chests/trap_large.png"); 099 } 100 else if (this.isChristmas) 101 { 102 this.bindTextureByName("/item/largexmaschest.png"); 103 } 104 else 105 { 106 this.bindTextureByName("/item/largechest.png"); 107 } 108 } 109 110 GL11.glPushMatrix(); 111 GL11.glEnable(GL12.GL_RESCALE_NORMAL); 112 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 113 GL11.glTranslatef((float)par2, (float)par4 + 1.0F, (float)par6 + 1.0F); 114 GL11.glScalef(1.0F, -1.0F, -1.0F); 115 GL11.glTranslatef(0.5F, 0.5F, 0.5F); 116 short short1 = 0; 117 118 if (i == 2) 119 { 120 short1 = 180; 121 } 122 123 if (i == 3) 124 { 125 short1 = 0; 126 } 127 128 if (i == 4) 129 { 130 short1 = 90; 131 } 132 133 if (i == 5) 134 { 135 short1 = -90; 136 } 137 138 if (i == 2 && par1TileEntityChest.adjacentChestXPos != null) 139 { 140 GL11.glTranslatef(1.0F, 0.0F, 0.0F); 141 } 142 143 if (i == 5 && par1TileEntityChest.adjacentChestZPosition != null) 144 { 145 GL11.glTranslatef(0.0F, 0.0F, -1.0F); 146 } 147 148 GL11.glRotatef((float)short1, 0.0F, 1.0F, 0.0F); 149 GL11.glTranslatef(-0.5F, -0.5F, -0.5F); 150 float f1 = par1TileEntityChest.prevLidAngle + (par1TileEntityChest.lidAngle - par1TileEntityChest.prevLidAngle) * par8; 151 float f2; 152 153 if (par1TileEntityChest.adjacentChestZNeg != null) 154 { 155 f2 = par1TileEntityChest.adjacentChestZNeg.prevLidAngle + (par1TileEntityChest.adjacentChestZNeg.lidAngle - par1TileEntityChest.adjacentChestZNeg.prevLidAngle) * par8; 156 157 if (f2 > f1) 158 { 159 f1 = f2; 160 } 161 } 162 163 if (par1TileEntityChest.adjacentChestXNeg != null) 164 { 165 f2 = par1TileEntityChest.adjacentChestXNeg.prevLidAngle + (par1TileEntityChest.adjacentChestXNeg.lidAngle - par1TileEntityChest.adjacentChestXNeg.prevLidAngle) * par8; 166 167 if (f2 > f1) 168 { 169 f1 = f2; 170 } 171 } 172 173 f1 = 1.0F - f1; 174 f1 = 1.0F - f1 * f1 * f1; 175 modelchest.chestLid.rotateAngleX = -(f1 * (float)Math.PI / 2.0F); 176 modelchest.renderAll(); 177 GL11.glDisable(GL12.GL_RESCALE_NORMAL); 178 GL11.glPopMatrix(); 179 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 180 } 181 } 182 183 public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8) 184 { 185 this.renderTileEntityChestAt((TileEntityChest)par1TileEntity, par2, par4, par6, par8); 186 } 187}