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_98088_b(int par1, int par2)
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
258    private void func_96175_b(int par1, int par2)
259    {
260        this.mc.renderEngine.func_98187_b("/gui/gui.png");
261        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
262        GL11.glPushMatrix();
263        GL11.glScalef(0.5F, 0.5F, 0.5F);
264        this.drawTexturedModalRect(par1 * 2, par2 * 2, 207, 0, 16, 15);
265        GL11.glPopMatrix();
266    }
267
268    private void func_96168_c(int par1, int par2)
269    {
270        this.mc.renderEngine.func_98187_b("/gui/gui.png");
271        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
272        GL11.glPushMatrix();
273        GL11.glScalef(0.5F, 0.5F, 0.5F);
274        this.drawTexturedModalRect(par1 * 2, par2 * 2, 223, 0, 16, 15);
275        GL11.glPopMatrix();
276    }
277
278    protected void func_96165_a(String par1Str, int par2, int par3)
279    {
280        if (par1Str != null)
281        {
282            int k = par2 + 12;
283            int l = par3 - 12;
284            int i1 = this.fontRenderer.getStringWidth(par1Str);
285            this.drawGradientRect(k - 3, l - 3, k + i1 + 3, l + 8 + 3, -1073741824, -1073741824);
286            this.fontRenderer.drawStringWithShadow(par1Str, k, l, -1);
287        }
288    }
289
290    private void func_96174_a(McoServer par1McoServer) throws IOException
291    {
292        ServerAddress serveraddress = ServerAddress.func_78860_a(par1McoServer.field_96403_g);
293        Socket socket = null;
294        DataInputStream datainputstream = null;
295        DataOutputStream dataoutputstream = null;
296
297        try
298        {
299            socket = new Socket();
300            socket.setSoTimeout(3000);
301            socket.setTcpNoDelay(true);
302            socket.setTrafficClass(18);
303            socket.connect(new InetSocketAddress(serveraddress.getIP(), serveraddress.getPort()), 3000);
304            datainputstream = new DataInputStream(socket.getInputStream());
305            dataoutputstream = new DataOutputStream(socket.getOutputStream());
306            dataoutputstream.write(254);
307            dataoutputstream.write(1);
308
309            if (datainputstream.read() != 255)
310            {
311                throw new IOException("Bad message");
312            }
313
314            String s = Packet.readString(datainputstream, 256);
315            char[] achar = s.toCharArray();
316
317            for (int i = 0; i < achar.length; ++i)
318            {
319                if (achar[i] != 167 && achar[i] != 0 && ChatAllowedCharacters.allowedCharacters.indexOf(achar[i]) < 0)
320                {
321                    achar[i] = 63;
322                }
323            }
324
325            s = new String(achar);
326            int j;
327            int k;
328            String[] astring;
329
330            if (s.startsWith("\u00a7") && s.length() > 1)
331            {
332                astring = s.substring(1).split("\u0000");
333
334                if (MathHelper.parseIntWithDefault(astring[0], 0) == 1)
335                {
336                    par1McoServer.field_96415_h = MathHelper.parseIntWithDefault(astring[1], par1McoServer.field_96415_h);
337                    par1McoServer.field_96413_j = astring[2];
338                    j = MathHelper.parseIntWithDefault(astring[4], 0);
339                    k = MathHelper.parseIntWithDefault(astring[5], 0);
340
341                    if (j >= 0 && k >= 0)
342                    {
343                        par1McoServer.field_96414_k = EnumChatFormatting.GRAY + "" + j;
344                    }
345                    else
346                    {
347                        par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
348                    }
349                }
350                else
351                {
352                    par1McoServer.field_96413_j = "???";
353                    par1McoServer.field_96415_h = 61;
354                    par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
355                }
356            }
357            else
358            {
359                astring = s.split("\u00a7");
360                s = astring[0];
361                j = -1;
362                k = -1;
363
364                try
365                {
366                    j = Integer.parseInt(astring[1]);
367                    k = Integer.parseInt(astring[2]);
368                }
369                catch (Exception exception)
370                {
371                    ;
372                }
373
374                par1McoServer.field_96407_c = EnumChatFormatting.GRAY + s;
375
376                if (j >= 0 && k > 0)
377                {
378                    par1McoServer.field_96414_k = EnumChatFormatting.GRAY + "" + j;
379                }
380                else
381                {
382                    par1McoServer.field_96414_k = "" + EnumChatFormatting.DARK_GRAY + "???";
383                }
384
385                par1McoServer.field_96413_j = "1.3";
386                par1McoServer.field_96415_h = 59;
387            }
388        }
389        finally
390        {
391            try
392            {
393                if (datainputstream != null)
394                {
395                    datainputstream.close();
396                }
397            }
398            catch (Throwable throwable)
399            {
400                ;
401            }
402
403            try
404            {
405                if (dataoutputstream != null)
406                {
407                    dataoutputstream.close();
408                }
409            }
410            catch (Throwable throwable1)
411            {
412                ;
413            }
414
415            try
416            {
417                if (socket != null)
418                {
419                    socket.close();
420                }
421            }
422            catch (Throwable throwable2)
423            {
424                ;
425            }
426        }
427    }
428
429    static Minecraft func_96177_a(GuiScreenOnlineServers par0GuiScreenOnlineServers)
430    {
431        return par0GuiScreenOnlineServers.mc;
432    }
433
434    static int func_98081_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
435    {
436        return par0GuiScreenOnlineServers.field_96199_x = par1;
437    }
438
439    static Minecraft func_98075_b(GuiScreenOnlineServers par0GuiScreenOnlineServers)
440    {
441        return par0GuiScreenOnlineServers.mc;
442    }
443
444    static List func_98094_c(GuiScreenOnlineServers par0GuiScreenOnlineServers)
445    {
446        return par0GuiScreenOnlineServers.field_96192_v;
447    }
448
449    static int func_98089_b(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
450    {
451        return par0GuiScreenOnlineServers.field_96189_n = par1;
452    }
453
454    static int func_98072_d(GuiScreenOnlineServers par0GuiScreenOnlineServers)
455    {
456        return par0GuiScreenOnlineServers.field_96189_n;
457    }
458
459    static GuiButton func_96161_f(GuiScreenOnlineServers par0GuiScreenOnlineServers)
460    {
461        return par0GuiScreenOnlineServers.field_96190_o;
462    }
463
464    static Minecraft func_98076_f(GuiScreenOnlineServers par0GuiScreenOnlineServers)
465    {
466        return par0GuiScreenOnlineServers.mc;
467    }
468
469    static GuiButton func_98092_g(GuiScreenOnlineServers par0GuiScreenOnlineServers)
470    {
471        return par0GuiScreenOnlineServers.field_96196_r;
472    }
473
474    static void func_98078_c(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1)
475    {
476        par0GuiScreenOnlineServers.func_96159_a(par1);
477    }
478
479    static FontRenderer func_98091_h(GuiScreenOnlineServers par0GuiScreenOnlineServers)
480    {
481        return par0GuiScreenOnlineServers.fontRenderer;
482    }
483
484    static void func_98070_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2)
485    {
486        par0GuiScreenOnlineServers.func_98088_b(par1, par2);
487    }
488
489    static void func_98083_b(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2)
490    {
491        par0GuiScreenOnlineServers.func_96168_c(par1, par2);
492    }
493
494    static void func_98077_c(GuiScreenOnlineServers par0GuiScreenOnlineServers, int par1, int par2)
495    {
496        par0GuiScreenOnlineServers.func_96175_b(par1, par2);
497    }
498
499    static FontRenderer func_98084_i(GuiScreenOnlineServers par0GuiScreenOnlineServers)
500    {
501        return par0GuiScreenOnlineServers.fontRenderer;
502    }
503
504    static Object func_96170_h()
505    {
506        return field_96185_d;
507    }
508
509    static int func_98082_i()
510    {
511        return field_96187_c;
512    }
513
514    static int func_98093_j()
515    {
516        return field_96187_c++;
517    }
518
519    static void func_96179_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, McoServer par1McoServer) throws IOException
520    {
521        par0GuiScreenOnlineServers.func_96174_a(par1McoServer);
522    }
523
524    static int func_96181_k()
525    {
526        return field_96187_c--;
527    }
528
529    static FontRenderer func_96182_l(GuiScreenOnlineServers par0GuiScreenOnlineServers)
530    {
531        return par0GuiScreenOnlineServers.fontRenderer;
532    }
533
534    static FontRenderer func_98079_k(GuiScreenOnlineServers par0GuiScreenOnlineServers)
535    {
536        return par0GuiScreenOnlineServers.fontRenderer;
537    }
538
539    static FontRenderer func_98087_l(GuiScreenOnlineServers par0GuiScreenOnlineServers)
540    {
541        return par0GuiScreenOnlineServers.fontRenderer;
542    }
543
544    static FontRenderer func_98074_m(GuiScreenOnlineServers par0GuiScreenOnlineServers)
545    {
546        return par0GuiScreenOnlineServers.fontRenderer;
547    }
548
549    static Minecraft func_98071_n(GuiScreenOnlineServers par0GuiScreenOnlineServers)
550    {
551        return par0GuiScreenOnlineServers.mc;
552    }
553
554    static String func_98085_a(GuiScreenOnlineServers par0GuiScreenOnlineServers, String par1Str)
555    {
556        return par0GuiScreenOnlineServers.field_96195_s = par1Str;
557    }
558}