001 /* 002 * The FML Forge Mod Loader suite. 003 * Copyright (C) 2012 cpw 004 * 005 * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free 006 * Software Foundation; either version 2.1 of the License, or any later version. 007 * 008 * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 009 * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 010 * 011 * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 012 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 013 */ 014 015 package cpw.mods.fml.client; 016 017 import java.awt.Dimension; 018 import java.util.ArrayList; 019 020 import net.minecraft.client.Minecraft; 021 import net.minecraft.client.gui.FontRenderer; 022 import net.minecraft.client.gui.GuiButton; 023 import net.minecraft.client.gui.GuiScreen; 024 import net.minecraft.client.gui.GuiSmallButton; 025 import net.minecraft.client.renderer.Tessellator; 026 import net.minecraft.util.StringTranslate; 027 028 import org.lwjgl.opengl.GL11; 029 030 import com.google.common.base.Strings; 031 032 import cpw.mods.fml.common.Loader; 033 import cpw.mods.fml.common.ModContainer; 034 035 /** 036 * @author cpw 037 * 038 */ 039 public class GuiModList extends GuiScreen 040 { 041 private GuiScreen mainMenu; 042 private GuiSlotModList modList; 043 private int selected = -1; 044 private ModContainer selectedMod; 045 private int listWidth; 046 private ArrayList<ModContainer> mods; 047 048 /** 049 * @param mainMenu 050 */ 051 public GuiModList(GuiScreen mainMenu) 052 { 053 this.mainMenu=mainMenu; 054 this.mods=new ArrayList<ModContainer>(); 055 FMLClientHandler.instance().addSpecialModEntries(mods); 056 for (ModContainer mod : Loader.instance().getModList()) { 057 if (mod.getMetadata()!=null && mod.getMetadata().parentMod==null && !Strings.isNullOrEmpty(mod.getMetadata().parent)) { 058 String parentMod = mod.getMetadata().parent; 059 ModContainer parentContainer = Loader.instance().getIndexedModList().get(parentMod); 060 if (parentContainer != null) 061 { 062 mod.getMetadata().parentMod = parentContainer; 063 parentContainer.getMetadata().childMods.add(mod); 064 continue; 065 } 066 } 067 else if (mod.getMetadata()!=null && mod.getMetadata().parentMod!=null) 068 { 069 continue; 070 } 071 mods.add(mod); 072 } 073 } 074 075 @Override 076 077 /** 078 * Adds the buttons (and other controls) to the screen in question. 079 */ 080 public void initGui() 081 { 082 for (ModContainer mod : mods) { 083 listWidth=Math.max(listWidth,getFontRenderer().getStringWidth(mod.getName()) + 10); 084 listWidth=Math.max(listWidth,getFontRenderer().getStringWidth(mod.getVersion()) + 10); 085 } 086 listWidth=Math.min(listWidth, 150); 087 StringTranslate translations = StringTranslate.getInstance(); 088 this.controlList.add(new GuiSmallButton(6, this.width / 2 - 75, this.height - 38, translations.translateKey("gui.done"))); 089 this.modList=new GuiSlotModList(this, mods, listWidth); 090 this.modList.registerScrollButtons(this.controlList, 7, 8); 091 } 092 093 @Override 094 095 /** 096 * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). 097 */ 098 protected void actionPerformed(GuiButton button) { 099 if (button.enabled) 100 { 101 switch (button.id) 102 { 103 case 6: 104 this.mc.displayGuiScreen(this.mainMenu); 105 return; 106 } 107 } 108 super.actionPerformed(button); 109 } 110 111 public int drawLine(String line, int offset, int shifty) 112 { 113 this.fontRenderer.drawString(line, offset, shifty, 0xd7edea); 114 return shifty + 10; 115 } 116 117 @Override 118 119 /** 120 * Draws the screen and all the components in it. 121 */ 122 public void drawScreen(int p_571_1_, int p_571_2_, float p_571_3_) 123 { 124 this.modList.drawScreen(p_571_1_, p_571_2_, p_571_3_); 125 this.drawCenteredString(this.fontRenderer, "Mod List", this.width / 2, 16, 0xFFFFFF); 126 int offset = this.listWidth + 20; 127 if (selectedMod != null) { 128 GL11.glEnable(GL11.GL_BLEND); 129 if (!selectedMod.getMetadata().autogenerated) { 130 int shifty = 35; 131 if (!selectedMod.getMetadata().logoFile.isEmpty()) 132 { 133 int texture = this.mc.renderEngine.getTexture(selectedMod.getMetadata().logoFile); 134 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); 135 this.mc.renderEngine.bindTexture(texture); 136 Dimension dim = TextureFXManager.instance().getTextureDimensions(texture); 137 int top = 32; 138 Tessellator tess = Tessellator.instance; 139 tess.startDrawingQuads(); 140 tess.addVertexWithUV(offset, top + dim.height, zLevel, 0, 1); 141 tess.addVertexWithUV(offset + dim.width, top + dim.height, zLevel, 1, 1); 142 tess.addVertexWithUV(offset + dim.width, top, zLevel, 1, 0); 143 tess.addVertexWithUV(offset, top, zLevel, 0, 0); 144 tess.draw(); 145 146 shifty += 65; 147 } 148 this.fontRenderer.drawStringWithShadow(selectedMod.getMetadata().name, offset, shifty, 0xFFFFFF); 149 shifty += 12; 150 151 shifty = drawLine(String.format("Version: %s (%s)", selectedMod.getDisplayVersion(), selectedMod.getVersion()), offset, shifty); 152 shifty = drawLine(String.format("Mod ID: '%s' Mod State: %s", selectedMod.getModId(), Loader.instance().getModState(selectedMod)), offset, shifty); 153 if (!selectedMod.getMetadata().credits.isEmpty()) { 154 shifty = drawLine(String.format("Credits: %s", selectedMod.getMetadata().credits), offset, shifty); 155 } 156 shifty = drawLine(String.format("Authors: %s", selectedMod.getMetadata().getAuthorList()), offset, shifty); 157 shifty = drawLine(String.format("URL: %s", selectedMod.getMetadata().url), offset, shifty); 158 shifty = drawLine(selectedMod.getMetadata().childMods.isEmpty() ? "No child mods for this mod" : String.format("Child mods: %s", selectedMod.getMetadata().getChildModList()), offset, shifty); 159 this.getFontRenderer().drawSplitString(selectedMod.getMetadata().description, offset, shifty + 10, this.width - offset - 20, 0xDDDDDD); 160 } else { 161 offset = ( this.listWidth + this.width ) / 2; 162 this.drawCenteredString(this.fontRenderer, selectedMod.getName(), offset, 35, 0xFFFFFF); 163 this.drawCenteredString(this.fontRenderer, String.format("Version: %s",selectedMod.getVersion()), offset, 45, 0xFFFFFF); 164 this.drawCenteredString(this.fontRenderer, String.format("Mod State: %s",Loader.instance().getModState(selectedMod)), offset, 55, 0xFFFFFF); 165 this.drawCenteredString(this.fontRenderer, "No mod information found", offset, 65, 0xDDDDDD); 166 this.drawCenteredString(this.fontRenderer, "Ask your mod author to provide a mod mcmod.info file", offset, 75, 0xDDDDDD); 167 } 168 GL11.glDisable(GL11.GL_BLEND); 169 } 170 super.drawScreen(p_571_1_, p_571_2_, p_571_3_); 171 } 172 173 Minecraft getMinecraftInstance() { 174 return mc; 175 } 176 177 FontRenderer getFontRenderer() { 178 return fontRenderer; 179 } 180 181 /** 182 * @param var1 183 */ 184 public void selectModIndex(int var1) 185 { 186 this.selected=var1; 187 if (var1>=0 && var1<=mods.size()) { 188 this.selectedMod=mods.get(selected); 189 } else { 190 this.selectedMod=null; 191 } 192 } 193 194 public boolean modIndexSelected(int var1) 195 { 196 return var1==selected; 197 } 198 }