001package net.minecraft.client.gui;
002
003import cpw.mods.fml.relauncher.Side;
004import cpw.mods.fml.relauncher.SideOnly;
005import java.io.DataInputStream;
006import java.io.DataOutputStream;
007import java.io.IOException;
008import java.net.InetSocketAddress;
009import java.net.Socket;
010import java.util.Collections;
011import java.util.Iterator;
012import java.util.List;
013import net.minecraft.client.Minecraft;
014import net.minecraft.client.mco.ExceptionMcoService;
015import net.minecraft.client.mco.McoClient;
016import net.minecraft.client.mco.McoServer;
017import net.minecraft.client.mco.McoServerList;
018import net.minecraft.client.multiplayer.ServerAddress;
019import net.minecraft.network.packet.Packet;
020import net.minecraft.util.ChatAllowedCharacters;
021import net.minecraft.util.EnumChatFormatting;
022import net.minecraft.util.MathHelper;
023import net.minecraft.util.StringTranslate;
024import org.lwjgl.input.Keyboard;
025import org.lwjgl.opengl.GL11;
026
027@SideOnly(Side.CLIENT)
028public class GuiScreenOnlineServers extends GuiScreen
029{
030    private GuiScreen field_96188_a;
031    private GuiSlotOnlineServerList field_96186_b;
032    private static int field_96187_c = 0;
033    private static final Object field_96185_d = new Object();
034    private int field_96189_n = -1;
035    private GuiButton field_96190_o;
036    private GuiButton field_96198_p;
037    private GuiButtonLink field_96197_q;
038    private GuiButton field_96196_r;
039    private String field_96195_s = null;
040    private McoServerList field_96194_t;
041    private boolean field_96193_u;
042    private List field_96192_v = Collections.emptyList();
043    private String field_96191_w = "http://minecraft.net";
044    private volatile int field_96199_x;
045
046    public GuiScreenOnlineServers(GuiScreen par1)
047    {
048        this.field_96188_a = par1;
049    }
050
051    /**
052     * Adds the buttons (and other controls) to the screen in question.
053     */
054    public void initGui()
055    {
056        Keyboard.enableRepeatEvents(true);
057        this.buttonList.clear();
058        this.field_96194_t = new McoServerList(this.mc.session);
059
060        if (!this.field_96193_u)
061        {
062            this.field_96193_u = true;
063            this.field_96186_b = new GuiSlotOnlineServerList(this);
064        }
065        else
066        {
067            this.field_96186_b.func_77207_a(this.width, this.height, 32, this.height - 64);
068        }
069
070        (new ThreadOnlineScreen(this)).start();
071        this.func_96178_g();
072    }
073
074    public void func_96178_g()
075    {
076        StringTranslate stringtranslate = StringTranslate.getInstance();
077        this.buttonList.add(this.field_96196_r = new GuiButton(1, this.width / 2 - 154, this.height - 52, 100, 20, stringtranslate.translateKey("mco.selectServer.select")));
078        this.buttonList.add(this.field_96198_p = new GuiButton(2, this.width / 2 - 48, this.height - 52, 100, 20, stringtranslate.translateKey("mco.selectServer.create")));
079        this.buttonList.add(this.field_96190_o = new GuiButton(3, this.width / 2 + 58, this.height - 52, 100, 20, stringtranslate.translateKey("mco.selectServer.configure")));
080        this.buttonList.add(this.field_96197_q = new GuiButtonLink(4, this.width / 2 - 154, this.height - 28, 154, 20, stringtranslate.translateKey("mco.selectServer.moreinfo")));
081        this.buttonList.add(new GuiButton(0, this.width / 2 + 6, this.height - 28, 153, 20, stringtranslate.translateKey("gui.cancel")));
082        boolean flag = this.field_96189_n >= 0 && this.field_96189_n < this.field_96186_b.getSize();
083        this.field_96196_r.enabled = flag && ((McoServer)this.field_96192_v.get(this.field_96189_n)).field_96404_d.equals("OPEN") && !((McoServer)this.field_96192_v.get(this.field_96189_n)).field_98166_h;
084        this.field_96190_o.enabled = flag && this.mc.session.username.equals(((McoServer)this.field_96192_v.get(this.field_96189_n)).field_96405_e);
085        this.field_96198_p.enabled = this.field_96199_x > 0;
086    }
087
088    /**
089     * Called from the main game loop to update the screen.
090     */
091    public void updateScreen()
092    {
093        super.updateScreen();
094
095        if (this.field_96194_t.func_98251_a())
096        {
097            List list = this.field_96194_t.func_98252_c();
098            Iterator iterator = list.iterator();
099
100            while (iterator.hasNext())
101            {
102                McoServer mcoserver = (McoServer)iterator.next();
103                Iterator iterator1 = this.field_96192_v.iterator();
104
105                while (iterator1.hasNext())
106                {
107                    McoServer mcoserver1 = (McoServer)iterator1.next();
108
109                    if (mcoserver.field_96408_a == mcoserver1.field_96408_a)
110                    {
111                        mcoserver.func_96401_a(mcoserver1);
112                        break;
113                    }
114                }
115            }
116
117            this.field_96192_v = list;
118            this.field_96194_t.func_98250_b();
119        }
120
121        this.field_96198_p.enabled = this.field_96199_x > 0;
122    }
123
124    /**
125     * Called when the screen is unloaded. Used to disable keyboard repeat events
126     */
127    public void onGuiClosed()
128    {
129        Keyboard.enableRepeatEvents(false);
130    }
131
132    /**
133     * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
134     */
135    protected void actionPerformed(GuiButton par1GuiButton)
136    {
137        if (par1GuiButton.enabled)
138        {
139            if (par1GuiButton.id == 1)
140            {
141                this.func_96159_a(this.field_96189_n);
142            }
143            else if (par1GuiButton.id == 3)
144            {
145                McoServer mcoserver = (McoServer)this.field_96194_t.func_98252_c().get(this.field_96189_n);
146                McoServer mcoserver1 = this.func_98086_a(mcoserver.field_96408_a);
147
148                if (mcoserver1 != null)
149                {
150                    this.field_96194_t.func_98248_d();
151                    this.mc.displayGuiScreen(new GuiScreenConfigureWorld(this, mcoserver1));
152                }
153            }
154            else if (par1GuiButton.id == 0)
155            {
156                this.field_96194_t.func_98248_d();
157                this.mc.displayGuiScreen(this.field_96188_a);
158            }
159            else if (par1GuiButton.id == 2)
160            {
161                this.field_96194_t.func_98248_d();
162                this.mc.displayGuiScreen(new GuiScreenCreateOnlineWorld(this));
163            }
164            else if (par1GuiButton.id == 4)
165            {
166                this.field_96197_q.func_96135_a(this.field_96191_w);
167            }
168            else
169            {
170                this.field_96186_b.actionPerformed(par1GuiButton);
171            }
172        }
173    }
174
175    private McoServer func_98086_a(long par1)
176    {
177        McoClient mcoclient = new McoClient(this.mc.session);
178
179        try
180        {
181            return mcoclient.func_98176_a(par1);
182        }
183        catch (ExceptionMcoService exceptionmcoservice)
184        {
185            ;
186        }
187        catch (IOException ioexception)
188        {
189            ;
190        }
191
192        return null;
193    }
194
195    /**
196     * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
197     */
198    protected void keyTyped(char par1, int par2)
199    {
200        if (par2 == 59)
201        {
202            this.mc.gameSettings.hideServerAddress = !this.mc.gameSettings.hideServerAddress;
203            this.mc.gameSettings.saveOptions();
204        }
205        else
206        {
207            if (par1 == 13)
208            {
209                this.actionPerformed((GuiButton)this.buttonList.get(2));
210            }
211            else
212            {
213                super.keyTyped(par1, par2);
214            }
215        }
216    }
217
218    /**
219     * Draws the screen and all the components in it.
220     */
221    public void drawScreen(int par1, int par2, float par3)
222    {
223        this.field_96195_s = null;
224        StringTranslate stringtranslate = StringTranslate.getInstance();
225        this.drawDefaultBackground();
226        this.field_96186_b.drawScreen(par1, par2, par3);
227        this.drawCenteredString(this.fontRenderer, stringtranslate.translateKey("mco.title"), this.width / 2, 20, 16777215);
228        super.drawScreen(par1, par2, par3);
229
230        if (this.field_96195_s != null)
231        {
232            this.func_96165_a(this.field_96195_s, par1, par2);
233        }
234    }
235
236    private void func_96159_a(int par1)
237    {
238        if (par1 >= 0 && par1 < this.field_96192_v.size())
239        {
240            McoServer mcoserver = (McoServer)this.field_96192_v.get(par1);
241            this.field_96194_t.func_98248_d();
242            GuiScreenLongRunningTask guiscreenlongrunningtask = new GuiScreenLongRunningTask(this.mc, this, new TaskOnlineConnect(this, mcoserver));
243            guiscreenlongrunningtask.func_98117_g();
244            this.mc.displayGuiScreen(guiscreenlongrunningtask);
245        }
246    }
247
248    private void func_101008_c(int par1, int par2, int par3, int par4)
249    {
250        this.mc.renderEngine.func_98187_b("/gui/gui.png");
251        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
252        GL11.glPushMatrix();
253        GL11.glScalef(0.5F, 0.5F, 0.5F);
254        this.drawTexturedModalRect(par1 * 2, par2 * 2, 191, 0, 16, 15);
255        GL11.glPopMatrix();
256
257        if (par3 >= par1 && par3 <= par1 + 9 && par4 >= par2 && par4 <= par2 + 9)
258        {
259            this.field_96195_s = "Expired World";
260        }
261    }
262
263    private void func_101006_d(int par1, int par2, int par3, int par4)
264    {
265        this.mc.renderEngine.func_98187_b("/gui/gui.png");
266        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
267        GL11.glPushMatrix();
268        GL11.glScalef(0.5F, 0.5F, 0.5F);
269        this.drawTexturedModalRect(par1 * 2, par2 * 2, 207, 0, 16, 15);
270        GL11.glPopMatrix();
271
272        if (par3 >= par1 && par3 <= par1 + 9 && par4 >= par2 && par4 <= par2 + 9)
273        {
274            this.field_96195_s = "Open World";
275        }
276    }
277
278    private void func_101001_e(int par1, int par2, int par3, int par4)
279    {
280        this.mc.renderEngine.func_98187_b("/gui/gui.png");
281        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
282        GL11.glPushMatrix();
283        GL11.glScalef(0.5F, 0.5F, 0.5F);
284        this.drawTexturedModalRect(par1 * 2, par2 * 2, 223, 0, 16, 15);
285        GL11.glPopMatrix();
286
287        if (par3 >= par1 && par3 <= par1 + 9 && par4 >= par2 && par4 <= par2 + 9)
288        {
289            this.field_96195_s = "Closed World";
290        }
291    }
292
293    protected void func_96165_a(String par1Str, int par2, int par3)
294    {
295        if (par1Str != null)
296        {
297            int k = par2 + 12;
298            int l = par3 - 12;
299            int i1 = this.fontRenderer.getStringWidth(par1Str);
300            this.drawGradientRect(k - 3, l - 3, k + i1 + 3, l + 8 + 3, -1073741824, -1073741824);
301            this.fontRenderer.drawStringWithShadow(par1Str, k, l, -1);
302        }
303    }
304
305    private void func_96174_a(McoServer par1McoServer) throws IOException
306    {
307        ServerAddress serveraddress = ServerAddress.func_78860_a(par1McoServer.field_96403_g);
308        Socket socket = null;
309        DataInputStream datainputstream = null;
310        DataOutputStream dataoutputstream = null;
311
312        try
313        {
314            socket = new Socket();
315            socket.setSoTimeout(3000);
316            socket.setTcpNoDelay(true);
317            socket.setTrafficClass(18);
318            socket.connect(new InetSocketAddress(serveraddress.getIP(), serveraddress.getPort()), 3000);
319            datainputstream = new DataInputStream(socket.getInputStream());
320            dataoutputstream = new DataOutputStream(socket.getOutputStream());
321            dataoutputstream.write(254);
322            dataoutputstream.write(1);
323
324            if (datainputstream.read() != 255)
325            {
326                throw new IOException("Bad message");
327            }
328
329            String s = Packet.readString(datainputstream, 256);
330            char[] achar = s.toCharArray();
331
332            for (int i = 0; i < achar.length; ++i)
333            {
334                if (achar[i] != 167 && achar[i] != 0 && ChatAllowedCharacters.allowedCharacters.indexOf(achar[i]) < 0)
335                {
336                    achar[i] = 63;
337                }
338            }
339
340            s = new String(achar);
341            int j;
342            int k;
343            String[] astring;
344
345            if (s.startsWith("\u00a7") && s.length() > 1)
346            {
347                astring = s.substring(1).split("\u0000");
348
349                if (MathHelper.parseIntWithDefault(astring[0], 0) == 1)
350                {
351                    par1McoServer.field_96415_h = MathHelper.parseIntWithDefault(astring[1], par1McoServer.field_96415_h);
352                    par1McoServer.field_96413_j = astring[2];
353                    j = MathHelper.parseIntWithDefault(astring[4], 0);
354                    k = MathHelper.parseIntWithDefault(astring[5], 0);
355
356                    if (j >= 0 && k >= 0)
357                    {
358                        par1McoServer.field_96414_k = EnumChatFormatting.GRAY + "" + j;
359                    }
360                    else
361                    {
362                        par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
363                    }
364                }
365                else
366                {
367                    par1McoServer.field_96413_j = "???";
368                    par1McoServer.field_96415_h = 61;
369                    par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
370                }
371            }
372            else
373            {
374                astring = s.split("\u00a7");
375                s = astring[0];
376                j = -1;
377                k = -1;
378
379                try
380                {
381                    j = Integer.parseInt(astring[1]);
382                    k = Integer.parseInt(astring[2]);
383                }
384                catch (Exception exception)
385                {
386                    ;
387                }
388
389                par1McoServer.field_96407_c = EnumChatFormatting.GRAY + s;
390
391                if (j >= 0 && k > 0)
392                {
393                    par1McoServer.field_96414_k = EnumChatFormatting.GRAY + "" + j;
394                }
395                else
396                {
397                    par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
398                }
399
400                par1McoServer.field_96413_j = "1.3";
401                par1McoServer.field_96415_h = 59;
402            }
403        }
404        finally
405        {
406            try
407            {
408                if (datainputstream != null)
409                {
410                    datainputstream.close();
411                }
412            }
413            catch (Throwable throwable)
414            {
415                ;
416            }
417
418            try
419            {
420                if (dataoutputstream != null)
421                {
422                    dataoutputstream.close();
423                }
424            }
425            catch (Throwable throwable1)
426            {
427                ;
428            }
429
430            try
431            {
432                if (socket != null)
433                {
434                    socket.close();
435                }
436            }
437            catch (Throwable throwable2)
438            {
439                ;
440            }
441        }
442    }
443
444    static Minecraft func_96177_a(GuiScreenOnlineServers par0GuiScreenOnlineServers)
445    {
446        return par0GuiScreenOnlineServers.mc;
447    }
448
449    static int func_98081_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
450    {
451        return par0GuiScreenOnlineServers.field_96199_x = par1;
452    }
453
454    static Minecraft func_98075_b(GuiScreenOnlineServers par0GuiScreenOnlineServers)
455    {
456        return par0GuiScreenOnlineServers.mc;
457    }
458
459    static List func_98094_c(GuiScreenOnlineServers par0GuiScreenOnlineServers)
460    {
461        return par0GuiScreenOnlineServers.field_96192_v;
462    }
463
464    static int func_98089_b(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
465    {
466        return par0GuiScreenOnlineServers.field_96189_n = par1;
467    }
468
469    static int func_98072_d(GuiScreenOnlineServers par0GuiScreenOnlineServers)
470    {
471        return par0GuiScreenOnlineServers.field_96189_n;
472    }
473
474    static GuiButton func_96161_f(GuiScreenOnlineServers par0GuiScreenOnlineServers)
475    {
476        return par0GuiScreenOnlineServers.field_96190_o;
477    }
478
479    static Minecraft func_98076_f(GuiScreenOnlineServers par0GuiScreenOnlineServers)
480    {
481        return par0GuiScreenOnlineServers.mc;
482    }
483
484    static GuiButton func_98092_g(GuiScreenOnlineServers par0GuiScreenOnlineServers)
485    {
486        return par0GuiScreenOnlineServers.field_96196_r;
487    }
488
489    static void func_98078_c(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
490    {
491        par0GuiScreenOnlineServers.func_96159_a(par1);
492    }
493
494    static FontRenderer func_98091_h(GuiScreenOnlineServers par0GuiScreenOnlineServers)
495    {
496        return par0GuiScreenOnlineServers.fontRenderer;
497    }
498
499    static void func_101003_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2, int par3, int par4)
500    {
501        par0GuiScreenOnlineServers.func_101008_c(par1, par2, par3, par4);
502    }
503
504    static void func_101012_b(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2, int par3, int par4)
505    {
506        par0GuiScreenOnlineServers.func_101001_e(par1, par2, par3, par4);
507    }
508
509    static void func_101009_c(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2, int par3, int par4)
510    {
511        par0GuiScreenOnlineServers.func_101006_d(par1, par2, par3, par4);
512    }
513
514    static FontRenderer func_98084_i(GuiScreenOnlineServers par0GuiScreenOnlineServers)
515    {
516        return par0GuiScreenOnlineServers.fontRenderer;
517    }
518
519    static FontRenderer func_101005_j(GuiScreenOnlineServers par0GuiScreenOnlineServers)
520    {
521        return par0GuiScreenOnlineServers.fontRenderer;
522    }
523
524    static Object func_101007_h()
525    {
526        return field_96185_d;
527    }
528
529    static int func_101010_i()
530    {
531        return field_96187_c;
532    }
533
534    static int func_101014_j()
535    {
536        return field_96187_c++;
537    }
538
539    static void func_101002_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, McoServer par1McoServer) throws IOException
540    {
541        par0GuiScreenOnlineServers.func_96174_a(par1McoServer);
542    }
543
544    static int func_101013_k()
545    {
546        return field_96187_c--;
547    }
548
549    static FontRenderer func_98079_k(GuiScreenOnlineServers par0GuiScreenOnlineServers)
550    {
551        return par0GuiScreenOnlineServers.fontRenderer;
552    }
553
554    static FontRenderer func_98087_l(GuiScreenOnlineServers par0GuiScreenOnlineServers)
555    {
556        return par0GuiScreenOnlineServers.fontRenderer;
557    }
558
559    static FontRenderer func_98074_m(GuiScreenOnlineServers par0GuiScreenOnlineServers)
560    {
561        return par0GuiScreenOnlineServers.fontRenderer;
562    }
563
564    static FontRenderer func_101000_n(GuiScreenOnlineServers par0GuiScreenOnlineServers)
565    {
566        return par0GuiScreenOnlineServers.fontRenderer;
567    }
568
569    static Minecraft func_101004_o(GuiScreenOnlineServers par0GuiScreenOnlineServers)
570    {
571        return par0GuiScreenOnlineServers.mc;
572    }
573
574    static String func_101011_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, String par1Str)
575    {
576        return par0GuiScreenOnlineServers.field_96195_s = par1Str;
577    }
578}