001    package net.minecraft.client.renderer.tileentity;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.HashMap;
006    import java.util.Iterator;
007    import java.util.Map;
008    import net.minecraft.client.gui.FontRenderer;
009    import net.minecraft.client.renderer.OpenGlHelper;
010    import net.minecraft.client.renderer.RenderEngine;
011    import net.minecraft.client.renderer.entity.RenderEnchantmentTable;
012    import net.minecraft.entity.EntityLiving;
013    import net.minecraft.tileentity.TileEntity;
014    import net.minecraft.tileentity.TileEntityBeacon;
015    import net.minecraft.tileentity.TileEntityChest;
016    import net.minecraft.tileentity.TileEntityEnchantmentTable;
017    import net.minecraft.tileentity.TileEntityEndPortal;
018    import net.minecraft.tileentity.TileEntityEnderChest;
019    import net.minecraft.tileentity.TileEntityMobSpawner;
020    import net.minecraft.tileentity.TileEntityPiston;
021    import net.minecraft.tileentity.TileEntitySign;
022    import net.minecraft.tileentity.TileEntitySkull;
023    import net.minecraft.world.World;
024    import org.lwjgl.opengl.GL11;
025    
026    @SideOnly(Side.CLIENT)
027    public class TileEntityRenderer
028    {
029        /**
030         * A mapping of TileEntitySpecialRenderers used for each TileEntity that has one
031         */
032        public Map specialRendererMap = new HashMap();
033    
034        /** The static instance of TileEntityRenderer */
035        public static TileEntityRenderer instance = new TileEntityRenderer();
036    
037        /** The FontRenderer instance used by the TileEntityRenderer */
038        private FontRenderer fontRenderer;
039    
040        /** The player's current X position (same as playerX) */
041        public static double staticPlayerX;
042    
043        /** The player's current Y position (same as playerY) */
044        public static double staticPlayerY;
045    
046        /** The player's current Z position (same as playerZ) */
047        public static double staticPlayerZ;
048    
049        /** The RenderEngine instance used by the TileEntityRenderer */
050        public RenderEngine renderEngine;
051    
052        /** Reference to the World object. */
053        public World worldObj;
054        public EntityLiving entityLivingPlayer;
055        public float playerYaw;
056        public float playerPitch;
057    
058        /** The player's X position in this rendering context */
059        public double playerX;
060    
061        /** The player's Y position in this rendering context */
062        public double playerY;
063    
064        /** The player's Z position in this rendering context */
065        public double playerZ;
066    
067        private TileEntityRenderer()
068        {
069            this.specialRendererMap.put(TileEntitySign.class, new TileEntitySignRenderer());
070            this.specialRendererMap.put(TileEntityMobSpawner.class, new TileEntityMobSpawnerRenderer());
071            this.specialRendererMap.put(TileEntityPiston.class, new TileEntityRendererPiston());
072            this.specialRendererMap.put(TileEntityChest.class, new TileEntityChestRenderer());
073            this.specialRendererMap.put(TileEntityEnderChest.class, new TileEntityEnderChestRenderer());
074            this.specialRendererMap.put(TileEntityEnchantmentTable.class, new RenderEnchantmentTable());
075            this.specialRendererMap.put(TileEntityEndPortal.class, new RenderEndPortal());
076            this.specialRendererMap.put(TileEntityBeacon.class, new TileEntityBeaconRenderer());
077            this.specialRendererMap.put(TileEntitySkull.class, new TileEntitySkullRenderer());
078            Iterator var1 = this.specialRendererMap.values().iterator();
079    
080            while (var1.hasNext())
081            {
082                TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)var1.next();
083                var2.setTileEntityRenderer(this);
084            }
085        }
086    
087        /**
088         * Returns the TileEntitySpecialRenderer used to render this TileEntity class, or null if it has no special renderer
089         */
090        public TileEntitySpecialRenderer getSpecialRendererForClass(Class par1Class)
091        {
092            TileEntitySpecialRenderer var2 = (TileEntitySpecialRenderer)this.specialRendererMap.get(par1Class);
093    
094            if (var2 == null && par1Class != TileEntity.class)
095            {
096                var2 = this.getSpecialRendererForClass(par1Class.getSuperclass());
097                this.specialRendererMap.put(par1Class, var2);
098            }
099    
100            return var2;
101        }
102    
103        /**
104         * Returns true if this TileEntity instance has a TileEntitySpecialRenderer associated with it, false otherwise.
105         */
106        public boolean hasSpecialRenderer(TileEntity par1TileEntity)
107        {
108            return this.getSpecialRendererForEntity(par1TileEntity) != null;
109        }
110    
111        /**
112         * Returns the TileEntitySpecialRenderer used to render this TileEntity instance, or null if it has no special
113         * renderer
114         */
115        public TileEntitySpecialRenderer getSpecialRendererForEntity(TileEntity par1TileEntity)
116        {
117            return par1TileEntity == null ? null : this.getSpecialRendererForClass(par1TileEntity.getClass());
118        }
119    
120        /**
121         * Caches several render-related references, including the active World, RenderEngine, FontRenderer, and the camera-
122         * bound EntityLiving's interpolated pitch, yaw and position. Args: world, renderengine, fontrenderer, entityliving,
123         * partialTickTime
124         */
125        public void cacheActiveRenderInfo(World par1World, RenderEngine par2RenderEngine, FontRenderer par3FontRenderer, EntityLiving par4EntityLiving, float par5)
126        {
127            if (this.worldObj != par1World)
128            {
129                this.setWorld(par1World);
130            }
131    
132            this.renderEngine = par2RenderEngine;
133            this.entityLivingPlayer = par4EntityLiving;
134            this.fontRenderer = par3FontRenderer;
135            this.playerYaw = par4EntityLiving.prevRotationYaw + (par4EntityLiving.rotationYaw - par4EntityLiving.prevRotationYaw) * par5;
136            this.playerPitch = par4EntityLiving.prevRotationPitch + (par4EntityLiving.rotationPitch - par4EntityLiving.prevRotationPitch) * par5;
137            this.playerX = par4EntityLiving.lastTickPosX + (par4EntityLiving.posX - par4EntityLiving.lastTickPosX) * (double)par5;
138            this.playerY = par4EntityLiving.lastTickPosY + (par4EntityLiving.posY - par4EntityLiving.lastTickPosY) * (double)par5;
139            this.playerZ = par4EntityLiving.lastTickPosZ + (par4EntityLiving.posZ - par4EntityLiving.lastTickPosZ) * (double)par5;
140        }
141    
142        /**
143         * Render this TileEntity at its current position from the player
144         */
145        public void renderTileEntity(TileEntity par1TileEntity, float par2)
146        {
147            if (par1TileEntity.getDistanceFrom(this.playerX, this.playerY, this.playerZ) < par1TileEntity.func_82115_m())
148            {
149                int var3 = this.worldObj.getLightBrightnessForSkyBlocks(par1TileEntity.xCoord, par1TileEntity.yCoord, par1TileEntity.zCoord, 0);
150                int var4 = var3 % 65536;
151                int var5 = var3 / 65536;
152                OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)var4 / 1.0F, (float)var5 / 1.0F);
153                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
154                this.renderTileEntityAt(par1TileEntity, (double)par1TileEntity.xCoord - staticPlayerX, (double)par1TileEntity.yCoord - staticPlayerY, (double)par1TileEntity.zCoord - staticPlayerZ, par2);
155            }
156        }
157    
158        /**
159         * Render this TileEntity at a given set of coordinates
160         */
161        public void renderTileEntityAt(TileEntity par1TileEntity, double par2, double par4, double par6, float par8)
162        {
163            TileEntitySpecialRenderer var9 = this.getSpecialRendererForEntity(par1TileEntity);
164    
165            if (var9 != null)
166            {
167                var9.renderTileEntityAt(par1TileEntity, par2, par4, par6, par8);
168            }
169        }
170    
171        /**
172         * Sets the world used by all TileEntitySpecialRender instances and notifies them of this change.
173         */
174        public void setWorld(World par1World)
175        {
176            this.worldObj = par1World;
177            Iterator var2 = this.specialRendererMap.values().iterator();
178    
179            while (var2.hasNext())
180            {
181                TileEntitySpecialRenderer var3 = (TileEntitySpecialRenderer)var2.next();
182    
183                if (var3 != null)
184                {
185                    var3.onWorldChange(par1World);
186                }
187            }
188        }
189    
190        public FontRenderer getFontRenderer()
191        {
192            return this.fontRenderer;
193        }
194    }