    001package net.minecraft.client.texturepacks;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.awt.image.BufferedImage;
    006import java.io.BufferedReader;
    007import java.io.File;
    008import java.io.IOException;
    009import java.io.InputStream;
    010import java.io.InputStreamReader;
    011import javax.imageio.ImageIO;
    012import net.minecraft.client.renderer.RenderEngine;
    013import org.lwjgl.opengl.GL11;
    014
    015@SideOnly(Side.CLIENT)
    016public abstract class TexturePackImplementation implements ITexturePack
    017{
    018    /**
    019     * Texture pack ID as returnd by generateTexturePackID(). Used only internally and not visible to the user.
    020     */
    021    private final String texturePackID;
    022
    023    /**
    024     * The name of the texture pack's zip file/directory or "Default" for the builtin texture pack. Shown in the GUI.
    025     */
    026    private final String texturePackFileName;
    027
    028    /**
    029     * File object for the texture pack's zip file in TexturePackCustom or the directory in TexturePackFolder.
    030     */
    031    protected final File texturePackFile;
    032
    033    /**
    034     * First line of texture pack description (from /pack.txt) displayed in the GUI
    035     */
    036    protected String firstDescriptionLine;
    037
    038    /**
    039     * Second line of texture pack description (from /pack.txt) displayed in the GUI
    040     */
    041    protected String secondDescriptionLine;
    042    private final ITexturePack field_98141_g;
    043
    044    /** The texture pack's thumbnail image loaded from the /pack.png file. */
    045    protected BufferedImage thumbnailImage;
    046
    047    /** The texture id for this pcak's thumbnail image. */
    048    private int thumbnailTextureName = -1;
    049
    050    protected TexturePackImplementation(String par1, File par2File, String par3Str, ITexturePack par4ITexturePack)
    051    {
    052        this.texturePackID = par1;
    053        this.texturePackFileName = par3Str;
    054        this.texturePackFile = par2File;
    055        this.field_98141_g = par4ITexturePack;
    056        this.loadThumbnailImage();
    057        this.loadDescription();
    058    }
    059
    060    /**
    061     * Truncate strings to at most 34 characters. Truncates description lines
    062     */
    063    private static String trimStringToGUIWidth(String par0Str)
    064    {
    065        if (par0Str != null && par0Str.length() > 34)
    066        {
    067            par0Str = par0Str.substring(0, 34);
    068        }
    069
    070        return par0Str;
    071    }
    072
    073    /**
    074     * Load and initialize thumbnailImage from the the /pack.png file.
    075     */
    076    private void loadThumbnailImage()
    077    {
    078        InputStream inputstream = null;
    079
    080        try
    081        {
    082            inputstream = this.func_98137_a("/pack.png", false);
    083            this.thumbnailImage = ImageIO.read(inputstream);
    084        }
    085        catch (IOException ioexception)
    086        {
    087            ;
    088        }
    089        finally
    090        {
    091            try
    092            {
    093                if (inputstream != null)
    094                {
    095                    inputstream.close();
    096                }
    097            }
    098            catch (IOException ioexception1)
    099            {
    100                ;
    101            }
    102        }
    103    }
    104
    105    /**
    106     * Load texture pack description from /pack.txt file in the texture pack
    107     */
    108    protected void loadDescription()
    109    {
    110        InputStream inputstream = null;
    111        BufferedReader bufferedreader = null;
    112
    113        try
    114        {
    115            inputstream = this.func_98139_b("/pack.txt");
    116            bufferedreader = new BufferedReader(new InputStreamReader(inputstream));
    117            this.firstDescriptionLine = trimStringToGUIWidth(bufferedreader.readLine());
    118            this.secondDescriptionLine = trimStringToGUIWidth(bufferedreader.readLine());
    119        }
    120        catch (IOException ioexception)
    121        {
    122            ;
    123        }
    124        finally
    125        {
    126            try
    127            {
    128                if (bufferedreader != null)
    129                {
    130                    bufferedreader.close();
    131                }
    132
    133                if (inputstream != null)
    134                {
    135                    inputstream.close();
    136                }
    137            }
    138            catch (IOException ioexception1)
    139            {
    140                ;
    141            }
    142        }
    143    }
    144
    145    public InputStream func_98137_a(String par1Str, boolean par2) throws IOException
    146    {
    147        try
    148        {
    149            return this.func_98139_b(par1Str);
    150        }
    151        catch (IOException ioexception)
    152        {
    153            if (this.field_98141_g != null && par2)
    154            {
    155                return this.field_98141_g.func_98137_a(par1Str, true);
    156            }
    157            else
    158            {
    159                throw ioexception;
    160            }
    161        }
    162    }
    163
    164    /**
    165     * Gives a texture resource as InputStream.
    166     */
    167    public InputStream getResourceAsStream(String par1Str) throws IOException
    168    {
    169        return this.func_98137_a(par1Str, true);
    170    }
    171
    172    protected abstract InputStream func_98139_b(String s) throws IOException;
    173
    174    /**
    175     * Delete the OpenGL texture id of the pack's thumbnail image, and close the zip file in case of TexturePackCustom.
    176     */
    177    public void deleteTexturePack(RenderEngine par1RenderEngine)
    178    {
    179        if (this.thumbnailImage != null && this.thumbnailTextureName != -1)
    180        {
    181            par1RenderEngine.deleteTexture(this.thumbnailTextureName);
    182        }
    183    }
    184
    185    /**
    186     * Bind the texture id of the pack's thumbnail image, loading it if necessary.
    187     */
    188    public void bindThumbnailTexture(RenderEngine par1RenderEngine)
    189    {
    190        if (this.thumbnailImage != null)
    191        {
    192            if (this.thumbnailTextureName == -1)
    193            {
    194                this.thumbnailTextureName = par1RenderEngine.allocateAndSetupTexture(this.thumbnailImage);
    195            }
    196
    197            GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.thumbnailTextureName);
    198            par1RenderEngine.resetBoundTexture();
    199        }
    200        else
    201        {
    202            par1RenderEngine.bindTexture("/gui/unknown_pack.png");
    203        }
    204    }
    205
    206    public boolean func_98138_b(String par1Str, boolean par2)
    207    {
    208        boolean flag1 = this.func_98140_c(par1Str);
    209        return !flag1 && par2 && this.field_98141_g != null ? this.field_98141_g.func_98138_b(par1Str, par2) : flag1;
    210    }
    211
    212    public abstract boolean func_98140_c(String s);
    213
    214    /**
    215     * Get the texture pack ID
    216     */
    217    public String getTexturePackID()
    218    {
    219        return this.texturePackID;
    220    }
    221
    222    /**
    223     * Get the file name of the texture pack, or Default if not from a custom texture pack
    224     */
    225    public String getTexturePackFileName()
    226    {
    227        return this.texturePackFileName;
    228    }
    229
    230    /**
    231     * Get the first line of the texture pack description (read from the pack.txt file)
    232     */
    233    public String getFirstDescriptionLine()
    234    {
    235        return this.firstDescriptionLine;
    236    }
    237
    238    /**
    239     * Get the second line of the texture pack description (read from the pack.txt file)
    240     */
    241    public String getSecondDescriptionLine()
    242    {
    243        return this.secondDescriptionLine;
    244    }
    245}