    001package net.minecraft.client.renderer.texture;
    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.IOException;
    008import java.io.InputStream;
    009import java.io.InputStreamReader;
    010import java.util.ArrayList;
    011import java.util.Arrays;
    012import java.util.HashMap;
    013import java.util.Iterator;
    014import java.util.List;
    015import java.util.Map;
    016import net.minecraft.block.Block;
    017import net.minecraft.client.Minecraft;
    018import net.minecraft.client.renderer.StitcherException;
    019import net.minecraft.client.renderer.entity.RenderManager;
    020import net.minecraft.client.texturepacks.ITexturePack;
    021import net.minecraft.item.Item;
    022import net.minecraft.util.Icon;
    023import net.minecraftforge.client.ForgeHooksClient;
    024import net.minecraftforge.common.ForgeDummyContainer;
    025
    026@SideOnly(Side.CLIENT)
    027public class TextureMap implements IconRegister
    028{
    029    public final int field_94255_a;
    030    public final String field_94253_b;
    031    public final String field_94254_c;
    032    public final String field_94251_d;
    033    private final HashMap field_94252_e = new HashMap();
    034    private BufferedImage field_94249_f = new BufferedImage(64, 64, 2);
    035    private TextureStitched field_94250_g;
    036    private Texture field_94257_h;
    037    private final List field_94258_i = new ArrayList();
    038    private final Map field_94256_j = new HashMap();
    039
    040    public TextureMap(int par1, String par2, String par3Str, BufferedImage par4BufferedImage)
    041    {
    042        this.field_94255_a = par1;
    043        this.field_94253_b = par2;
    044        this.field_94254_c = par3Str;
    045        this.field_94251_d = ".png";
    046        this.field_94249_f = par4BufferedImage;
    047    }
    048
    049    public void func_94247_b()
    050    {
    051        this.field_94256_j.clear();
    052        ForgeHooksClient.onTextureStitchedPre(this);
    053        int i;
    054        int j;
    055
    056        if (this.field_94255_a == 0)
    057        {
    058            Block[] ablock = Block.blocksList;
    059            i = ablock.length;
    060
    061            for (j = 0; j < i; ++j)
    062            {
    063                Block block = ablock[j];
    064
    065                if (block != null)
    066                {
    067                    block.func_94332_a(this);
    068                }
    069            }
    070
    071            Minecraft.getMinecraft().renderGlobal.func_94140_a(this);
    072            RenderManager.instance.func_94178_a(this);
    073        }
    074
    075        Item[] aitem = Item.itemsList;
    076        i = aitem.length;
    077
    078        for (j = 0; j < i; ++j)
    079        {
    080            Item item = aitem[j];
    081
    082            if (item != null && item.func_94901_k() == this.field_94255_a)
    083            {
    084                item.func_94581_a(this);
    085            }
    086        }
    087
    088        HashMap hashmap = new HashMap();
    089        Stitcher stitcher = TextureManager.func_94267_b().func_94262_d(this.field_94253_b);
    090        this.field_94252_e.clear();
    091        this.field_94258_i.clear();
    092        Texture texture = TextureManager.func_94267_b().func_94261_a("missingno", 2, this.field_94249_f.getWidth(), this.field_94249_f.getHeight(), 10496, 6408, 9728, 9728, false, this.field_94249_f);
    093        StitchHolder stitchholder = new StitchHolder(texture);
    094        stitcher.func_94312_a(stitchholder);
    095        hashmap.put(stitchholder, Arrays.asList(new Texture[] {texture}));
    096
    097        for (Map.Entry<String, TextureStitched> entry : ((Map<String, TextureStitched>)field_94256_j).entrySet())
    098        {
    099            String name = entry.getKey();
    100            String path;
    101            if (name.indexOf(':') == -1)
    102            {
    103                path = this.field_94254_c + name + this.field_94251_d;
    104            }
    105            else
    106            {
    107                String domain = name.substring(0,name.indexOf(':'));
    108                String file = name.substring(name.indexOf(':')+1);
    109                path = "mods/" + domain +"/" + field_94254_c + file + field_94251_d;
    110            }
    111            List list = TextureManager.func_94267_b().createNewTexture(name, path, entry.getValue());
    112
    113            if (!list.isEmpty())
    114            {
    115                StitchHolder stitchholder1 = new StitchHolder((Texture)list.get(0));
    116                stitcher.func_94312_a(stitchholder1);
    117                hashmap.put(stitchholder1, list);
    118            }
    119        }
    120
    121        try
    122        {
    123            stitcher.func_94305_f();
    124        }
    125        catch (StitcherException stitcherexception)
    126        {
    127            throw stitcherexception;
    128        }
    129
    130        this.field_94257_h = stitcher.func_94306_e();
    131        Iterator iterator = stitcher.func_94309_g().iterator();
    132
    133        while (iterator.hasNext())
    134        {
    135            StitchSlot stitchslot = (StitchSlot)iterator.next();
    136            StitchHolder stitchholder2 = stitchslot.func_94183_a();
    137            Texture texture1 = stitchholder2.func_98150_a();
    138            String s2 = texture1.func_94280_f();
    139            List list1 = (List)hashmap.get(stitchholder2);
    140            TextureStitched texturestitched = (TextureStitched)this.field_94256_j.get(s2);
    141            boolean flag = false;
    142
    143            if (texturestitched == null)
    144            {
    145                flag = true;
    146                texturestitched = TextureStitched.func_94220_a(s2);
    147
    148                if (!s2.equals("missingno"))
    149                {
    150                    Minecraft.getMinecraft().func_98033_al().func_98236_b("Couldn\'t find premade icon for " + s2 + " doing " + this.field_94253_b);
    151                }
    152            }
    153
    154            texturestitched.func_94218_a(this.field_94257_h, list1, stitchslot.func_94186_b(), stitchslot.func_94185_c(), stitchholder2.func_98150_a().func_94275_d(), stitchholder2.func_98150_a().func_94276_e(), stitchholder2.func_94195_e());
    155            this.field_94252_e.put(s2, texturestitched);
    156
    157            if (!flag)
    158            {
    159                this.field_94256_j.remove(s2);
    160            }
    161
    162            if (list1.size() > 1)
    163            {
    164                this.field_94258_i.add(texturestitched);
    165                String s3;
    166                if (s2.indexOf(':') == -1)
    167                {
    168                    s3 = field_94254_c + s2 + ".txt";
    169                }
    170                else
    171                {
    172                    String domain = s2.substring(0, s2.indexOf(':'));
    173                    String file = s2.substring(s2.indexOf(':') + 1);
    174                    s3 = "mods/" + domain + "/" + field_94254_c + file + ".txt";
    175                }
    176                ITexturePack itexturepack = Minecraft.getMinecraft().texturePackList.getSelectedTexturePack();
    177                boolean flag1 = !itexturepack.func_98138_b("/" + this.field_94254_c + s2 + ".png", false);
    178
    179                try
    180                {
    181                    InputStream inputstream = itexturepack.func_98137_a("/" + s3, flag1);
    182                    Minecraft.getMinecraft().func_98033_al().func_98233_a("Found animation info for: " + s3);
    183                    texturestitched.func_94221_a(new BufferedReader(new InputStreamReader(inputstream)));
    184                }
    185                catch (IOException ioexception)
    186                {
    187                    ;
    188                }
    189            }
    190        }
    191
    192        this.field_94250_g = (TextureStitched)this.field_94252_e.get("missingno");
    193        iterator = this.field_94256_j.values().iterator();
    194
    195        while (iterator.hasNext())
    196        {
    197            TextureStitched texturestitched1 = (TextureStitched)iterator.next();
    198            texturestitched1.func_94217_a(this.field_94250_g);
    199        }
    200
    201        if (!ForgeDummyContainer.disableStitchedFileSaving)
    202        {
    203            this.field_94257_h.func_94279_c("debug.stitched_" + this.field_94253_b + ".png");
    204        }
    205        ForgeHooksClient.onTextureStitchedPost(this);
    206        this.field_94257_h.func_94285_g();
    207    }
    208
    209    public void func_94248_c()
    210    {
    211        Iterator iterator = this.field_94258_i.iterator();
    212
    213        while (iterator.hasNext())
    214        {
    215            TextureStitched texturestitched = (TextureStitched)iterator.next();
    216            texturestitched.func_94219_l();
    217        }
    218    }
    219
    220    public Texture func_94246_d()
    221    {
    222        return this.field_94257_h;
    223    }
    224
    225    public Icon func_94245_a(String par1Str)
    226    {
    227        if (par1Str == null)
    228        {
    229            (new RuntimeException("Don\'t register null!")).printStackTrace();
    230        }
    231
    232        TextureStitched texturestitched = (TextureStitched)this.field_94256_j.get(par1Str);
    233
    234        if (texturestitched == null)
    235        {
    236            texturestitched = TextureStitched.func_94220_a(par1Str);
    237            this.field_94256_j.put(par1Str, texturestitched);
    238        }
    239
    240        return texturestitched;
    241    }
    242
    243    public Icon func_96455_e()
    244    {
    245        return this.field_94250_g;
    246    }
    247
    248    //===================================================================================================
    249    //                                           Forge Start
    250    //===================================================================================================
    251    /**
    252     * Grabs the registered entry for the specified name, returning null if there was not a entry.
    253     * Opposed to func_94245_a, this will not instantiate the entry, useful to test if a maping exists.
    254     *
    255     * @param name The name of the entry to find
    256     * @return The registered entry, null if nothing was registered.
    257     */
    258    public TextureStitched getTextureExtry(String name)
    259    {
    260        return (TextureStitched)field_94256_j.get(name);
    261    }
    262
    263    /**
    264     * Adds a texture registry entry to this map for the specified name if one does not already exist.
    265     * Returns false if the map already contains a entry for the specified name.
    266     *
    267     * @param name Entry name
    268     * @param entry Entry instance
    269     * @return True if the entry was added to the map, false otherwise.
    270     */
    271    public boolean setTextureEntry(String name, TextureStitched entry)
    272    {
    273        if (!field_94256_j.containsKey(name))
    274        {
    275            field_94256_j.put(name, entry);
    276            return true;
    277        }
    278        return false;
    279    }
    280}