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}