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}