    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    }