001 package net.minecraft.client.gui.achievement; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 006 import java.util.LinkedList; 007 import java.util.List; 008 import java.util.Random; 009 import net.minecraft.block.Block; 010 import net.minecraft.client.Minecraft; 011 import net.minecraft.client.gui.GuiButton; 012 import net.minecraft.client.gui.GuiScreen; 013 import net.minecraft.client.gui.GuiSmallButton; 014 import net.minecraft.client.renderer.RenderHelper; 015 import net.minecraft.client.renderer.entity.RenderItem; 016 import net.minecraft.stats.Achievement; 017 import net.minecraft.stats.AchievementList; 018 import net.minecraft.stats.StatFileWriter; 019 import net.minecraft.util.MathHelper; 020 import net.minecraft.util.StatCollector; 021 import org.lwjgl.input.Mouse; 022 import org.lwjgl.opengl.GL11; 023 import org.lwjgl.opengl.GL12; 024 025 import net.minecraftforge.common.AchievementPage; 026 027 @SideOnly(Side.CLIENT) 028 public class GuiAchievements extends GuiScreen 029 { 030 /** The top x coordinate of the achievement map */ 031 private static final int guiMapTop = AchievementList.minDisplayColumn * 24 - 112; 032 033 /** The left y coordinate of the achievement map */ 034 private static final int guiMapLeft = AchievementList.minDisplayRow * 24 - 112; 035 036 /** The bottom x coordinate of the achievement map */ 037 private static final int guiMapBottom = AchievementList.maxDisplayColumn * 24 - 77; 038 039 /** The right y coordinate of the achievement map */ 040 private static final int guiMapRight = AchievementList.maxDisplayRow * 24 - 77; 041 protected int achievementsPaneWidth = 256; 042 protected int achievementsPaneHeight = 202; 043 044 /** The current mouse x coordinate */ 045 protected int mouseX = 0; 046 047 /** The current mouse y coordinate */ 048 protected int mouseY = 0; 049 protected double field_74117_m; 050 protected double field_74115_n; 051 052 /** The x position of the achievement map */ 053 protected double guiMapX; 054 055 /** The y position of the achievement map */ 056 protected double guiMapY; 057 protected double field_74124_q; 058 protected double field_74123_r; 059 060 /** Whether the Mouse Button is down or not */ 061 private int isMouseButtonDown = 0; 062 private StatFileWriter statFileWriter; 063 064 private int currentPage = -1; 065 private GuiSmallButton button; 066 private LinkedList<Achievement> minecraftAchievements = new LinkedList<Achievement>(); 067 068 public GuiAchievements(StatFileWriter par1StatFileWriter) 069 { 070 this.statFileWriter = par1StatFileWriter; 071 short var2 = 141; 072 short var3 = 141; 073 this.field_74117_m = this.guiMapX = this.field_74124_q = (double)(AchievementList.openInventory.displayColumn * 24 - var2 / 2 - 12); 074 this.field_74115_n = this.guiMapY = this.field_74123_r = (double)(AchievementList.openInventory.displayRow * 24 - var3 / 2); 075 minecraftAchievements.clear(); 076 for (Object achievement : AchievementList.achievementList) 077 { 078 if (!AchievementPage.isAchievementInPages((Achievement)achievement)) 079 { 080 minecraftAchievements.add((Achievement)achievement); 081 } 082 } 083 } 084 085 /** 086 * Adds the buttons (and other controls) to the screen in question. 087 */ 088 public void initGui() 089 { 090 this.controlList.clear(); 091 this.controlList.add(new GuiSmallButton(1, this.width / 2 + 24, this.height / 2 + 74, 80, 20, StatCollector.translateToLocal("gui.done"))); 092 this.controlList.add(button = new GuiSmallButton(2, (width - achievementsPaneWidth) / 2 + 24, height / 2 + 74, 125, 20, AchievementPage.getTitle(currentPage))); 093 } 094 095 /** 096 * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). 097 */ 098 protected void actionPerformed(GuiButton par1GuiButton) 099 { 100 if (par1GuiButton.id == 1) 101 { 102 this.mc.displayGuiScreen((GuiScreen)null); 103 this.mc.setIngameFocus(); 104 } 105 106 if (par1GuiButton.id == 2) 107 { 108 currentPage++; 109 if (currentPage >= AchievementPage.getAchievementPages().size()) 110 { 111 currentPage = -1; 112 } 113 button.displayString = AchievementPage.getTitle(currentPage); 114 } 115 116 super.actionPerformed(par1GuiButton); 117 } 118 119 /** 120 * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e). 121 */ 122 protected void keyTyped(char par1, int par2) 123 { 124 if (par2 == this.mc.gameSettings.keyBindInventory.keyCode) 125 { 126 this.mc.displayGuiScreen((GuiScreen)null); 127 this.mc.setIngameFocus(); 128 } 129 else 130 { 131 super.keyTyped(par1, par2); 132 } 133 } 134 135 /** 136 * Draws the screen and all the components in it. 137 */ 138 public void drawScreen(int par1, int par2, float par3) 139 { 140 if (Mouse.isButtonDown(0)) 141 { 142 int var4 = (this.width - this.achievementsPaneWidth) / 2; 143 int var5 = (this.height - this.achievementsPaneHeight) / 2; 144 int var6 = var4 + 8; 145 int var7 = var5 + 17; 146 147 if ((this.isMouseButtonDown == 0 || this.isMouseButtonDown == 1) && par1 >= var6 && par1 < var6 + 224 && par2 >= var7 && par2 < var7 + 155) 148 { 149 if (this.isMouseButtonDown == 0) 150 { 151 this.isMouseButtonDown = 1; 152 } 153 else 154 { 155 this.guiMapX -= (double)(par1 - this.mouseX); 156 this.guiMapY -= (double)(par2 - this.mouseY); 157 this.field_74124_q = this.field_74117_m = this.guiMapX; 158 this.field_74123_r = this.field_74115_n = this.guiMapY; 159 } 160 161 this.mouseX = par1; 162 this.mouseY = par2; 163 } 164 165 if (this.field_74124_q < (double)guiMapTop) 166 { 167 this.field_74124_q = (double)guiMapTop; 168 } 169 170 if (this.field_74123_r < (double)guiMapLeft) 171 { 172 this.field_74123_r = (double)guiMapLeft; 173 } 174 175 if (this.field_74124_q >= (double)guiMapBottom) 176 { 177 this.field_74124_q = (double)(guiMapBottom - 1); 178 } 179 180 if (this.field_74123_r >= (double)guiMapRight) 181 { 182 this.field_74123_r = (double)(guiMapRight - 1); 183 } 184 } 185 else 186 { 187 this.isMouseButtonDown = 0; 188 } 189 190 this.drawDefaultBackground(); 191 this.genAchievementBackground(par1, par2, par3); 192 GL11.glDisable(GL11.GL_LIGHTING); 193 GL11.glDisable(GL11.GL_DEPTH_TEST); 194 this.drawTitle(); 195 GL11.glEnable(GL11.GL_LIGHTING); 196 GL11.glEnable(GL11.GL_DEPTH_TEST); 197 } 198 199 /** 200 * Called from the main game loop to update the screen. 201 */ 202 public void updateScreen() 203 { 204 this.field_74117_m = this.guiMapX; 205 this.field_74115_n = this.guiMapY; 206 double var1 = this.field_74124_q - this.guiMapX; 207 double var3 = this.field_74123_r - this.guiMapY; 208 209 if (var1 * var1 + var3 * var3 < 4.0D) 210 { 211 this.guiMapX += var1; 212 this.guiMapY += var3; 213 } 214 else 215 { 216 this.guiMapX += var1 * 0.85D; 217 this.guiMapY += var3 * 0.85D; 218 } 219 } 220 221 /** 222 * Draws the "Achievements" title at the top of the GUI. 223 */ 224 protected void drawTitle() 225 { 226 int var1 = (this.width - this.achievementsPaneWidth) / 2; 227 int var2 = (this.height - this.achievementsPaneHeight) / 2; 228 this.fontRenderer.drawString("Achievements", var1 + 15, var2 + 5, 4210752); 229 } 230 231 protected void genAchievementBackground(int par1, int par2, float par3) 232 { 233 int var4 = MathHelper.floor_double(this.field_74117_m + (this.guiMapX - this.field_74117_m) * (double)par3); 234 int var5 = MathHelper.floor_double(this.field_74115_n + (this.guiMapY - this.field_74115_n) * (double)par3); 235 236 if (var4 < guiMapTop) 237 { 238 var4 = guiMapTop; 239 } 240 241 if (var5 < guiMapLeft) 242 { 243 var5 = guiMapLeft; 244 } 245 246 if (var4 >= guiMapBottom) 247 { 248 var4 = guiMapBottom - 1; 249 } 250 251 if (var5 >= guiMapRight) 252 { 253 var5 = guiMapRight - 1; 254 } 255 256 int var6 = this.mc.renderEngine.getTexture("/terrain.png"); 257 int var7 = this.mc.renderEngine.getTexture("/achievement/bg.png"); 258 int var8 = (this.width - this.achievementsPaneWidth) / 2; 259 int var9 = (this.height - this.achievementsPaneHeight) / 2; 260 int var10 = var8 + 16; 261 int var11 = var9 + 17; 262 this.zLevel = 0.0F; 263 GL11.glDepthFunc(GL11.GL_GEQUAL); 264 GL11.glPushMatrix(); 265 GL11.glTranslatef(0.0F, 0.0F, -200.0F); 266 GL11.glEnable(GL11.GL_TEXTURE_2D); 267 GL11.glDisable(GL11.GL_LIGHTING); 268 GL11.glEnable(GL12.GL_RESCALE_NORMAL); 269 GL11.glEnable(GL11.GL_COLOR_MATERIAL); 270 this.mc.renderEngine.bindTexture(var6); 271 int var12 = var4 + 288 >> 4; 272 int var13 = var5 + 288 >> 4; 273 int var14 = (var4 + 288) % 16; 274 int var15 = (var5 + 288) % 16; 275 Random var21 = new Random(); 276 int var22; 277 int var25; 278 int var24; 279 int var26; 280 281 for (var22 = 0; var22 * 16 - var15 < 155; ++var22) 282 { 283 float var23 = 0.6F - (float)(var13 + var22) / 25.0F * 0.3F; 284 GL11.glColor4f(var23, var23, var23, 1.0F); 285 286 for (var24 = 0; var24 * 16 - var14 < 224; ++var24) 287 { 288 var21.setSeed((long)(1234 + var12 + var24)); 289 var21.nextInt(); 290 var25 = var21.nextInt(1 + var13 + var22) + (var13 + var22) / 2; 291 var26 = Block.sand.blockIndexInTexture; 292 293 if (var25 <= 37 && var13 + var22 != 35) 294 { 295 if (var25 == 22) 296 { 297 if (var21.nextInt(2) == 0) 298 { 299 var26 = Block.oreDiamond.blockIndexInTexture; 300 } 301 else 302 { 303 var26 = Block.oreRedstone.blockIndexInTexture; 304 } 305 } 306 else if (var25 == 10) 307 { 308 var26 = Block.oreIron.blockIndexInTexture; 309 } 310 else if (var25 == 8) 311 { 312 var26 = Block.oreCoal.blockIndexInTexture; 313 } 314 else if (var25 > 4) 315 { 316 var26 = Block.stone.blockIndexInTexture; 317 } 318 else if (var25 > 0) 319 { 320 var26 = Block.dirt.blockIndexInTexture; 321 } 322 } 323 else 324 { 325 var26 = Block.bedrock.blockIndexInTexture; 326 } 327 328 this.drawTexturedModalRect(var10 + var24 * 16 - var14, var11 + var22 * 16 - var15, var26 % 16 << 4, var26 >> 4 << 4, 16, 16); 329 } 330 } 331 332 GL11.glEnable(GL11.GL_DEPTH_TEST); 333 GL11.glDepthFunc(GL11.GL_LEQUAL); 334 GL11.glDisable(GL11.GL_TEXTURE_2D); 335 int var27; 336 int var30; 337 338 List<Achievement> achievementList = (currentPage == -1 ? minecraftAchievements : AchievementPage.getAchievementPage(currentPage).getAchievements()); 339 for (var22 = 0; var22 < achievementList.size(); ++var22) 340 { 341 Achievement var33 = achievementList.get(var22); 342 343 if (var33.parentAchievement != null && achievementList.contains(var33.parentAchievement)) 344 { 345 var24 = var33.displayColumn * 24 - var4 + 11 + var10; 346 var25 = var33.displayRow * 24 - var5 + 11 + var11; 347 var26 = var33.parentAchievement.displayColumn * 24 - var4 + 11 + var10; 348 var27 = var33.parentAchievement.displayRow * 24 - var5 + 11 + var11; 349 boolean var28 = this.statFileWriter.hasAchievementUnlocked(var33); 350 boolean var29 = this.statFileWriter.canUnlockAchievement(var33); 351 var30 = Math.sin((double)(Minecraft.getSystemTime() % 600L) / 600.0D * Math.PI * 2.0D) > 0.6D ? 255 : 130; 352 int var31 = -16777216; 353 354 if (var28) 355 { 356 var31 = -9408400; 357 } 358 else if (var29) 359 { 360 var31 = 65280 + (var30 << 24); 361 } 362 363 this.drawHorizontalLine(var24, var26, var25, var31); 364 this.drawVerticalLine(var26, var25, var27, var31); 365 } 366 } 367 368 Achievement var32 = null; 369 RenderItem var37 = new RenderItem(); 370 RenderHelper.enableGUIStandardItemLighting(); 371 GL11.glDisable(GL11.GL_LIGHTING); 372 GL11.glEnable(GL12.GL_RESCALE_NORMAL); 373 GL11.glEnable(GL11.GL_COLOR_MATERIAL); 374 int var42; 375 int var41; 376 377 for (var24 = 0; var24 < achievementList.size(); ++var24) 378 { 379 Achievement var35 = achievementList.get(var24); 380 var26 = var35.displayColumn * 24 - var4; 381 var27 = var35.displayRow * 24 - var5; 382 383 if (var26 >= -24 && var27 >= -24 && var26 <= 224 && var27 <= 155) 384 { 385 float var38; 386 387 if (this.statFileWriter.hasAchievementUnlocked(var35)) 388 { 389 var38 = 1.0F; 390 GL11.glColor4f(var38, var38, var38, 1.0F); 391 } 392 else if (this.statFileWriter.canUnlockAchievement(var35)) 393 { 394 var38 = Math.sin((double)(Minecraft.getSystemTime() % 600L) / 600.0D * Math.PI * 2.0D) < 0.6D ? 0.6F : 0.8F; 395 GL11.glColor4f(var38, var38, var38, 1.0F); 396 } 397 else 398 { 399 var38 = 0.3F; 400 GL11.glColor4f(var38, var38, var38, 1.0F); 401 } 402 403 this.mc.renderEngine.bindTexture(var7); 404 var42 = var10 + var26; 405 var41 = var11 + var27; 406 407 if (var35.getSpecial()) 408 { 409 this.drawTexturedModalRect(var42 - 2, var41 - 2, 26, 202, 26, 26); 410 } 411 else 412 { 413 this.drawTexturedModalRect(var42 - 2, var41 - 2, 0, 202, 26, 26); 414 } 415 416 if (!this.statFileWriter.canUnlockAchievement(var35)) 417 { 418 float var40 = 0.1F; 419 GL11.glColor4f(var40, var40, var40, 1.0F); 420 var37.field_77024_a = false; 421 } 422 423 GL11.glEnable(GL11.GL_LIGHTING); 424 GL11.glEnable(GL11.GL_CULL_FACE); 425 var37.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, var35.theItemStack, var42 + 3, var41 + 3); 426 GL11.glDisable(GL11.GL_LIGHTING); 427 428 if (!this.statFileWriter.canUnlockAchievement(var35)) 429 { 430 var37.field_77024_a = true; 431 } 432 433 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 434 435 if (par1 >= var10 && par2 >= var11 && par1 < var10 + 224 && par2 < var11 + 155 && par1 >= var42 && par1 <= var42 + 22 && par2 >= var41 && par2 <= var41 + 22) 436 { 437 var32 = var35; 438 } 439 } 440 } 441 442 GL11.glDisable(GL11.GL_DEPTH_TEST); 443 GL11.glEnable(GL11.GL_BLEND); 444 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 445 this.mc.renderEngine.bindTexture(var7); 446 this.drawTexturedModalRect(var8, var9, 0, 0, this.achievementsPaneWidth, this.achievementsPaneHeight); 447 GL11.glPopMatrix(); 448 this.zLevel = 0.0F; 449 GL11.glDepthFunc(GL11.GL_LEQUAL); 450 GL11.glDisable(GL11.GL_DEPTH_TEST); 451 GL11.glEnable(GL11.GL_TEXTURE_2D); 452 super.drawScreen(par1, par2, par3); 453 454 if (var32 != null) 455 { 456 String var34 = StatCollector.translateToLocal(var32.getName()); 457 String var36 = var32.getDescription(); 458 var26 = par1 + 12; 459 var27 = par2 - 4; 460 461 if (this.statFileWriter.canUnlockAchievement(var32)) 462 { 463 var42 = Math.max(this.fontRenderer.getStringWidth(var34), 120); 464 var41 = this.fontRenderer.splitStringWidth(var36, var42); 465 466 if (this.statFileWriter.hasAchievementUnlocked(var32)) 467 { 468 var41 += 12; 469 } 470 471 this.drawGradientRect(var26 - 3, var27 - 3, var26 + var42 + 3, var27 + var41 + 3 + 12, -1073741824, -1073741824); 472 this.fontRenderer.drawSplitString(var36, var26, var27 + 12, var42, -6250336); 473 474 if (this.statFileWriter.hasAchievementUnlocked(var32)) 475 { 476 this.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("achievement.taken"), var26, var27 + var41 + 4, -7302913); 477 } 478 } 479 else 480 { 481 var42 = Math.max(this.fontRenderer.getStringWidth(var34), 120); 482 String var39 = StatCollector.translateToLocalFormatted("achievement.requires", new Object[] {StatCollector.translateToLocal(var32.parentAchievement.getName())}); 483 var30 = this.fontRenderer.splitStringWidth(var39, var42); 484 this.drawGradientRect(var26 - 3, var27 - 3, var26 + var42 + 3, var27 + var30 + 12 + 3, -1073741824, -1073741824); 485 this.fontRenderer.drawSplitString(var39, var26, var27 + 12, var42, -9416624); 486 } 487 488 this.fontRenderer.drawStringWithShadow(var34, var26, var27, this.statFileWriter.canUnlockAchievement(var32) ? (var32.getSpecial() ? -128 : -1) : (var32.getSpecial() ? -8355776 : -8355712)); 489 } 490 491 GL11.glEnable(GL11.GL_DEPTH_TEST); 492 GL11.glEnable(GL11.GL_LIGHTING); 493 RenderHelper.disableStandardItemLighting(); 494 } 495 496 /** 497 * Returns true if this GUI should pause the game when it is displayed in single-player 498 */ 499 public boolean doesGuiPauseGame() 500 { 501 return true; 502 } 503 }