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