001package net.minecraft.client.renderer.texture;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005
006import java.awt.image.BufferedImage;
007import java.io.BufferedReader;
008import java.util.ArrayList;
009import java.util.List;
010
011import net.minecraft.client.texturepacks.ITexturePack;
012import net.minecraft.util.Icon;
013import net.minecraft.util.Tuple;
014
015@SideOnly(Side.CLIENT)
016public class TextureStitched implements Icon
017{
018    private final String field_94235_h;
019    protected Texture field_94228_a;
020    protected List field_94226_b;
021    private List field_94236_i;
022    protected boolean field_94227_c;
023    protected int field_94224_d;
024    protected int field_94225_e;
025    private int field_94233_j;
026    private int field_94234_k;
027    private float field_94231_l;
028    private float field_94232_m;
029    private float field_94229_n;
030    private float field_94230_o;
031    private float field_94238_p;
032    private float field_94237_q;
033    protected int field_94222_f = 0;
034    protected int field_94223_g = 0;
035
036    public static TextureStitched func_94220_a(String par0Str)
037    {
038        return (TextureStitched)("clock".equals(par0Str) ? new TextureClock() : ("compass".equals(par0Str) ? new TextureCompass() : new TextureStitched(par0Str)));
039    }
040
041    protected TextureStitched(String par1)
042    {
043        this.field_94235_h = par1;
044    }
045
046    public void func_94218_a(Texture par1Texture, List par2List, int par3, int par4, int par5, int par6, boolean par7)
047    {
048        this.field_94228_a = par1Texture;
049        this.field_94226_b = par2List;
050        this.field_94224_d = par3;
051        this.field_94225_e = par4;
052        this.field_94233_j = par5;
053        this.field_94234_k = par6;
054        this.field_94227_c = par7;
055        this.field_94231_l = (float)par3 / (float)par1Texture.func_94275_d();
056        this.field_94232_m = (float)(par3 + par5) / (float)par1Texture.func_94275_d();
057        this.field_94229_n = (float)par4 / (float)par1Texture.func_94276_e();
058        this.field_94230_o = (float)(par4 + par6) / (float)par1Texture.func_94276_e();
059        this.field_94238_p = (float)par5 / 16.0F;
060        this.field_94237_q = (float)par6 / 16.0F;
061    }
062
063    public void func_94217_a(TextureStitched par1TextureStitched)
064    {
065        this.func_94218_a(par1TextureStitched.field_94228_a, par1TextureStitched.field_94226_b, par1TextureStitched.field_94224_d, par1TextureStitched.field_94225_e, par1TextureStitched.field_94233_j, par1TextureStitched.field_94234_k, par1TextureStitched.field_94227_c);
066    }
067
068    public int func_94211_a()
069    {
070        return this.field_94224_d;
071    }
072
073    public int func_94216_b()
074    {
075        return this.field_94225_e;
076    }
077
078    public float func_94209_e()
079    {
080        return this.field_94231_l;
081    }
082
083    public float func_94212_f()
084    {
085        return this.field_94232_m - Float.MIN_VALUE;
086    }
087
088    public float func_94214_a(double par1)
089    {
090        float f = this.field_94232_m - this.field_94231_l;
091        return this.field_94231_l + f * ((float)par1 / 16.0F) - Float.MIN_VALUE;
092    }
093
094    public float func_94206_g()
095    {
096        return this.field_94229_n;
097    }
098
099    public float func_94210_h()
100    {
101        return this.field_94230_o - Float.MIN_VALUE;
102    }
103
104    public float func_94207_b(double par1)
105    {
106        float f = this.field_94230_o - this.field_94229_n;
107        return this.field_94229_n + f * ((float)par1 / 16.0F) - Float.MIN_VALUE;
108    }
109
110    public String func_94215_i()
111    {
112        return this.field_94235_h;
113    }
114
115    public int func_94213_j()
116    {
117        return this.field_94228_a.func_94275_d();
118    }
119
120    public int func_94208_k()
121    {
122        return this.field_94228_a.func_94276_e();
123    }
124
125    public void func_94219_l()
126    {
127        if (this.field_94236_i != null)
128        {
129            Tuple tuple = (Tuple)this.field_94236_i.get(this.field_94222_f);
130            ++this.field_94223_g;
131
132            if (this.field_94223_g >= ((Integer)tuple.getSecond()).intValue())
133            {
134                int i = ((Integer)tuple.getFirst()).intValue();
135                this.field_94222_f = (this.field_94222_f + 1) % this.field_94236_i.size();
136                this.field_94223_g = 0;
137                tuple = (Tuple)this.field_94236_i.get(this.field_94222_f);
138                int j = ((Integer)tuple.getFirst()).intValue();
139
140                if (i != j && j >= 0 && j < this.field_94226_b.size())
141                {
142                    this.field_94228_a.func_94281_a(this.field_94224_d, this.field_94225_e, (Texture)this.field_94226_b.get(j), this.field_94227_c);
143                }
144            }
145        }
146        else
147        {
148            int k = this.field_94222_f;
149            this.field_94222_f = (this.field_94222_f + 1) % this.field_94226_b.size();
150
151            if (k != this.field_94222_f)
152            {
153                this.field_94228_a.func_94281_a(this.field_94224_d, this.field_94225_e, (Texture)this.field_94226_b.get(this.field_94222_f), this.field_94227_c);
154            }
155        }
156    }
157
158    public void func_94221_a(BufferedReader par1BufferedReader)
159    {
160        ArrayList arraylist = new ArrayList();
161
162        try
163        {
164            for (String s = par1BufferedReader.readLine(); s != null; s = par1BufferedReader.readLine())
165            {
166                s = s.trim();
167
168                if (s.length() > 0)
169                {
170                    String[] astring = s.split(",");
171                    String[] astring1 = astring;
172                    int i = astring.length;
173
174                    for (int j = 0; j < i; ++j)
175                    {
176                        String s1 = astring1[j];
177                        int k = s1.indexOf(42);
178
179                        if (k > 0)
180                        {
181                            Integer integer = new Integer(s1.substring(0, k));
182                            Integer integer1 = new Integer(s1.substring(k + 1));
183                            arraylist.add(new Tuple(integer, integer1));
184                        }
185                        else
186                        {
187                            arraylist.add(new Tuple(new Integer(s1), Integer.valueOf(1)));
188                        }
189                    }
190                }
191            }
192        }
193        catch (Exception exception)
194        {
195            System.err.println("Failed to read animation info for " + this.field_94235_h + ": " + exception.getMessage());
196        }
197
198        if (!arraylist.isEmpty() && arraylist.size() < 600)
199        {
200            this.field_94236_i = arraylist;
201        }
202    }
203
204    //===================================================================================================
205    //                                           Forge Start
206    //===================================================================================================
207    /**
208     * Called when texture packs are refreshed, from TextureManager.createNewTexture,
209     * allows for finer control over loading the animation lists and verification of the image.
210     * If the return value from this is true, no further loading will be done by vanilla code.
211     * 
212     * You need to add all Texture's to the textures argument. At the end of this function at least one
213     * entry should be in that argument, or a error should of been thrown.
214     * 
215     * @param manager The invoking manager
216     * @param texturepack Current texture pack
217     * @param name The name of the texture
218     * @param fileName Resource path for this texture
219     * @param image Buffered image of the loaded resource
220     * @param textures ArrayList of element type Texture, split textures should be added to this list for the stitcher to handle.  
221     * @return Return true to skip further vanilla texture loading for this texture
222     */
223    public boolean loadTexture(TextureManager manager, ITexturePack texturepack, String name, String fileName, BufferedImage image, ArrayList textures)
224    {
225        return false;
226    }
227}