Package org.spoutcraft.client.gui.about

Source Code of org.spoutcraft.client.gui.about.GuiAbout

/*
* This file is part of Spoutcraft.
*
* Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/>
* Spoutcraft is licensed under the GNU Lesser General Public License.
*
* Spoutcraft 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 Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Spoutcraft is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.spoutcraft.client.gui.about;

import java.awt.Desktop;
import java.net.URL;

import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.newdawn.slick.opengl.Texture;

import net.minecraft.src.GuiButton;
import net.minecraft.src.GuiScreen;
import net.minecraft.src.Minecraft;
import net.minecraft.src.ResourceLocation;
import net.minecraft.src.Tessellator;

import org.spoutcraft.api.gui.Color;
import org.spoutcraft.api.gui.GenericGradient;
import org.spoutcraft.api.gui.Gradient;
import org.spoutcraft.api.gui.RenderUtil;
import org.spoutcraft.client.SpoutClient;
import org.spoutcraft.client.io.CustomTextureManager;
import org.spoutcraft.client.io.FileUtil;

public class GuiAbout extends GuiScreen {
  private float scrolled = 0f;
  private boolean holdingScrollBar = false;
  private Color background1 = new Color(0.06F, 0.06F, 0.06F, 0.65F);
  private Color background2 = new Color(0.06F, 0.06F, 0.06F, 0.72F);
  private Color scrollBarColor = new Color(0.46F, 0.46F, 0.46F, 0.55F);
  private Color scrollBarColor2 = new Color(0.06F, 0.06F, 0.06F, 0.62F);
  private Gradient scrollArea = new GenericGradient();
  private static final int SCREEN_SIZE = 230;
  private static final int SCREEN_START = 60;
  private static final int SCREEN_END = 94;
  private static final float SCROLL_FACTOR = 10f;
  Texture spoutcraftTexture = CustomTextureManager.getTextureFromPath(FileUtil.getAssetsDir().getPath()+"/logo/spoutcraft.png");
  Texture beastNodeLogo = CustomTextureManager.getTextureFromPath(FileUtil.getAssetsDir().getPath()+"/logo/beastnode.png");
  Texture minecraftBizLogo = CustomTextureManager.getTextureFromPath(FileUtil.getAssetsDir().getPath()+"/logo/minecraft_biz.png");
  private int sourceY = -1;
  private int sourceWidth = -1;
  private boolean hoveringLink = false;
  private final GuiScreen parent;

  public GuiAbout(GuiScreen parent) {
    this.parent = parent;
  }

  @Override
  public void initGui() {
    this.buttonList.clear();
    buttonList.add(new GuiButton(1, this.width / 2 - 50, this.height - 25, 100, 20, "Main Menu"));
  }

  @Override
  public void actionPerformed(GuiButton button) {
    this.mc.displayGuiScreen(parent);
  }

  @Override
  public void mouseClicked(int mouseX, int mouseY, int click) {
    holdingScrollBar = false;
    int height = getInvertedScaledHeight(this.height );
    String browseUrl = null;
    if (mouseX >= this.width - 12 && mouseY <= this.width) {
      // Do nothing if we clicked on the slider bar itself
      if (mouseY > height + 16 && mouseY < this.height - 50) {
        setScrolled(getScrolled() + 0.1f);
      } else if (mouseY < height && mouseY > 30) {
        setScrolled(getScrolled() - 0.1f);
      } else {
        holdingScrollBar = true;
      }
    } else if (this.isInBoundingRect(this.width / 2 + 30, getScaledHeight(15), 33, 147, mouseX, mouseY)) {
      browseUrl = "http://spout.in/beast";
    } else if (this.isInBoundingRect((int)(0.0325f * this.width), (this.height - 40), (int)(44 * 0.4f), (int)(310 * 0.4f), mouseX, mouseY)) {
      browseUrl = "http://spout.in/minecraft";
    } else if (this.isInBoundingRect((this.width - 140), this.height - 45, 32, 128, mouseX, mouseY)) {
      browseUrl = "http://spout.in/spoutcraft";
    } else if (this.isInBoundingRect(this.width / 2 + 30, getScaledHeight(sourceY), 10, sourceWidth, mouseX, mouseY)) {
      browseUrl = "https://github.com/SpoutDev";
    }
    if (browseUrl != null) {
      try {
        URL url =  new URL(browseUrl);
        Desktop.getDesktop().browse(url.toURI());
      } catch (Exception e) { }
    }

    super.mouseClicked(mouseX, mouseY, click);
  }

  @Override
  public void mouseMovedOrUp(int mouseX, int mouseY, int click) {
    hoveringLink = false;
    if (click != 0) { // Still dragging
      if (holdingScrollBar) {
        int height = getInvertedScaledHeight(this.height);
        if (mouseY > height + 16) {
          setScrolled(getScrolled() + 0.01f);
        } else if (mouseY < height) {
          setScrolled(getScrolled() - 0.01f);
        }
      }
    } else {
      holdingScrollBar = false;
    }
    if (this.isInBoundingRect(this.width / 2 + 30, getScaledHeight(sourceY), 10, sourceWidth, mouseX, mouseY)) {
      hoveringLink = true;
    }
    super.mouseMovedOrUp(mouseX, mouseY, click);
  }

  @Override
  public void handleMouseInput() {
    super.handleMouseInput();
    int scroll = Mouse.getEventDWheel();
    if (scroll != 0) {
      setScrolled(getScrolled() - (scroll / (SCROLL_FACTOR * SCREEN_SIZE)));
    }
  }

  public float getScrolled() {
    return scrolled;
  }

  public void setScrolled(float f) {
    if (f > 1f) {
      scrolled = 1f;
    } else if (f < 0f) {
      scrolled = 0f;
    } else {
      scrolled = f;
    }
  }

  public int getScaledHeight(int height) {
    return SCREEN_END + height - (int)(SCREEN_SIZE * scrolled) - SCREEN_START;
  }

  public int getInvertedScaledHeight(int height) {
    return (int)((this.height - SCREEN_END) * scrolled) + height - this.height + SCREEN_START / 2;
  }

  public void drawScaledString(String string, int width, int height, int color) {
    drawString(this.fontRenderer, string, width, getScaledHeight(height), color);
  }

  @Override
  public void drawScreen(int x, int y, float z) {
    super.drawBackground(0);
    GL11.glPushMatrix();

    GL11.glDisable(2896 /*GL_LIGHTING*/);
    GL11.glDisable(2912 /*GL_FOG*/);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    bg.setTopColor(background1);
    bg.setBottomColor(background2);
    bg.setY(30);
    bg.setHeight(this.height - 50);
    bg.setX(0);
    bg.setWidth(this.width - 12);
    bg.render();

    scrollArea.setY(30);
    scrollArea.setHeight(this.height - 50);
    scrollArea.setX(this.width - 12);
    scrollArea.setWidth(16);
    scrollArea.setTopColor(scrollBarColor);
    scrollArea.setBottomColor(scrollBarColor2);
    scrollArea.render();

    // Right half
    int top = 0;
    drawScaledString("What is Spoutcraft?", this.width / 2 - 200, top, 0xffffff); top += 10;
    drawScaledString("Spoutcraft is a modification for the", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Minecraft client that plays exactly", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("like the official game. Its goal is", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("to give developers an easy to use", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("platform for building and distributing", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("mods, while providing a rich", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("gameplay experience for users.", this.width / 2 - 200, top, 0x808080); top += 10;

    top += 20;

    drawScaledString("What is Spout?", this.width / 2 - 200, top, 0xffffff); top += 10;
    drawScaledString("Spout is a Bukkit plugin development", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("platform that allows for previously", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("impossible tasks, such as custom items", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("blocks, mobs, animals, and vehicles. ", this.width / 2 - 200, top, 0x808080); top += 10;

    top += 20;

    drawScaledString("Who is SpoutDev?", this.width / 2 - 200, top, 0xffffff); top += 10;
    drawScaledString("SpoutDev is the team behind Spout, ", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("SpoutAPI, Spoutcraft,", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("and Spoutcraft Launcher.", this.width / 2 - 200, top, 0x808080); top += 10;

    top += 20;

    drawScaledString("Contributors", this.width / 2 - 200, top, 0xffffff); top += 10;
    drawScaledString("The Bukkit Team - Bukkit Server API", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("lahwran - Fast Events Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("lahwran - Minimap Logic", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Celtic Minstrel - Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Zeerix - Threading Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Karlthepagan - OptiTick Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Kahr - HD Textures Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Jeckari - Custom Texture Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Rycochet - GUI Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("knowbuddy - GUI Optimizations", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("TomyLobo - Mipmapping Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("Apache Foundation - Code", this.width / 2 - 200, top, 0x808080); top += 10;
    drawScaledString("ThVortex - FontRenderer fixes", this.width / 2 - 200, top, 0x808080); top += 10;

    // Left half
    top = 0;
    drawScaledString("Sponsors", this.width / 2 + 30, top, 0xffffff); top += 10;

    top = 130;

    drawScaledString("Team", this.width / 2 + 30, top, 0xffffff); top += 10;
    drawScaledString("Afforess - Lead Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Wulfspider - Co-Lead & Support", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("alta189 - Co-Lead & Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Top_Cat - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("raphfrk - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("narrowtux - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Olloth - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Rycochet - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("RoyAwesome - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("zml2008 - Developer", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Zidane - Developer", this.width / 2 + 30, top, 0x808080); top += 10;

    top += 20;

    drawScaledString("Contact", this.width / 2 + 30, top, 0xffffff); top += 10;
    drawScaledString("Email: dev@spout.org", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("Website: spout.org", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("#spout on irc.esper.net", this.width / 2 + 30, top, 0x808080); top += 10;

    top += 20;

    drawScaledString("Note", this.width / 2 + 30, top, 0xffffff); top += 10;
    drawScaledString("Spoutcraft, Spout, and related", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("projects are open source. You", this.width / 2 + 30, top, 0x808080); top += 10;
    drawScaledString("can browse the source code at", this.width / 2 + 30, top, 0x808080);  top += 10;
    sourceY = top;
    sourceWidth = this.fontRenderer.getStringWidth("https://github.com/SpoutDev");
    drawScaledString("https://github.com/SpoutDev", this.width / 2 + 30, sourceY, hoveringLink ? 0x65A5D1 : 0x176093); top += 10;

    top += 20;

    int beastNodeX = (this.width / 2 + 30);
    int beastNodeY = getScaledHeight(15);
    if (beastNodeLogo != null) {
      GL11.glPushMatrix();
      GL11.glDisable(GL11.GL_DEPTH_TEST);
      GL11.glEnable(GL11.GL_BLEND);
      GL11.glDepthMask(false);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glTranslatef(beastNodeX, beastNodeY, 0); // Moves texture into place
      SpoutClient.getHandle().renderEngine.bindTexture(beastNodeLogo.getTextureID());
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
      Tessellator tessellator = Tessellator.instance;
      //GL11.glScalef(0.5f, 0.5f, 0.5f);
      tessellator.startDrawingQuads();
      tessellator.addVertexWithUV(0.0D, 33, -90, 0.0D, 0.0D); // Draw corners
      tessellator.addVertexWithUV(147, 33, -90, beastNodeLogo.getWidth(), 0.0D);
      tessellator.addVertexWithUV(147, 0.0D, -90, beastNodeLogo.getWidth(), beastNodeLogo.getHeight());
      tessellator.addVertexWithUV(0.0D, 0.0D, -90, 0.0D, beastNodeLogo.getHeight());
      tessellator.draw();
      GL11.glDepthMask(true);
      GL11.glEnable(GL11.GL_DEPTH_TEST);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glPopMatrix();
    }

    int minecraftBizX = (this.width / 2 + 30);
    int minecraftBizY = getScaledHeight(85);
    if (minecraftBizLogo != null) {
      GL11.glPushMatrix();
      GL11.glDisable(GL11.GL_DEPTH_TEST);
      GL11.glEnable(GL11.GL_BLEND);
      GL11.glDepthMask(false);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glTranslatef(minecraftBizX, minecraftBizY, 0); // Moves texture into place
      SpoutClient.getHandle().renderEngine.bindTexture(minecraftBizLogo.getTextureID());
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
      Tessellator tessellator = Tessellator.instance;
      //GL11.glScalef(0.5f, 0.5f, 0.5f);
      tessellator.startDrawingQuads();
      tessellator.addVertexWithUV(0.0D, 33, -90, 0.0D, 0.0D); // Draw corners
      tessellator.addVertexWithUV(147, 33, -90, minecraftBizLogo.getWidth(), 0.0D);
      tessellator.addVertexWithUV(147, 0.0D, -90, minecraftBizLogo.getWidth(), minecraftBizLogo.getHeight());
      tessellator.addVertexWithUV(0.0D, 0.0D, -90, 0.0D, minecraftBizLogo.getHeight());
      tessellator.draw();
      GL11.glDepthMask(true);
      GL11.glEnable(GL11.GL_DEPTH_TEST);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glPopMatrix();
    }

    // Draw tooltips
    if (isInBoundingRect(beastNodeX, beastNodeY, 33, 147, x, y)) {
      drawTooltip(
        "BeastNode provides high quality Minecraft and web hosting at affordable\n" +
        "prices and is generously sponsoring the Spout project with its hosting\n" +
        "& server needs. Mine, build, craft, and chat with your own high quality\n" +
        "Minecraft server with FREE mumble voice server and web hosting.", x, y);
    } else if (isInBoundingRect(minecraftBizX, minecraftBizY, 33, 147, x, y)) {
      drawTooltip(
        "Your Minecraft community in a new dimension!", x, y);
    }

    GL11.glDisable(2896 /*GL_LIGHTING*/);
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("gui/gui.png"));   
    RenderUtil.drawTexturedModalRectangle(this.width - 14, getInvertedScaledHeight(this.height), 0, 208, 16, 16, 0f);
    GL11.glDisable(2912 /*GL_FOG*/);
    GL11.glDisable(2929 /*GL_DEPTH_TEST*/);
    this.overlayBackground(0, 30, 255, 255);
    this.overlayBackground(this.height - 50, this.height, 255, 255);
    drawCenteredString(this.fontRenderer, "About", this.width / 2, 16, 0xffffff);
    Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("textures/gui/title/mojang.png"));   
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    GL11.glPushMatrix();
    GL11.glTranslatef((0.0325f * this.width), (this.height - 40), 0);
    GL11.glScalef(0.4f, 0.4f, 0.4f);
    this.drawTexturedModalRect(0, 0, 0, 0, 155, 44);
    this.drawTexturedModalRect(155, 0, 0, 45, 155, 44);
    GL11.glPopMatrix();

    if (spoutcraftTexture != null) {
      GL11.glPushMatrix();
      GL11.glDisable(GL11.GL_DEPTH_TEST);
      GL11.glDisable(GL11.GL_BLEND);
      GL11.glDepthMask(false);
      GL11.glEnable(3008 /*GL_ALPHA_TEST*/);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glTranslatef((this.width - 140), (this.height - 45), 0); // Moves texture into place
      SpoutClient.getHandle().renderEngine.bindTexture(spoutcraftTexture.getTextureID());
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
      GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
      Tessellator tessellator = Tessellator.instance;
      tessellator.startDrawingQuads();
      tessellator.addVertexWithUV(0.0D, 32, -90, 0.0D, 0.0D); // Draw corners
      tessellator.addVertexWithUV(128, 32, -90, spoutcraftTexture.getWidth(), 0.0D);
      tessellator.addVertexWithUV(128, 0.0D, -90, spoutcraftTexture.getWidth(), spoutcraftTexture.getHeight());
      tessellator.addVertexWithUV(0.0D, 0.0D, -90, 0.0D, spoutcraftTexture.getHeight());
      tessellator.draw();
      GL11.glDepthMask(true);
      GL11.glEnable(GL11.GL_DEPTH_TEST);
      GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
      GL11.glPopMatrix();
    }

    drawString(this.fontRenderer, "Unknown Version", (int)(this.width * 0.034f), this.height - 20, 0xffffff);
    drawString(this.fontRenderer, "Copyright Mojang AB", (int)(this.width * 0.034f), this.height - 10, 0x808080);

    String version = SpoutClient.getClientVersion();
    drawString(this.fontRenderer, version, (int)(this.width - 45) - fontRenderer.getStringWidth(version) + fontRenderer.getStringWidth("0"), this.height - 20, 0xffffff);
    drawString(this.fontRenderer, "Licensed under LGPLv3", (int)(this.width - 129), this.height - 10, 0x808080);

    ((GuiButton)this.buttonList.get(0)).xPosition = this.width / 2 - 50;
    ((GuiButton)this.buttonList.get(0)).yPosition = this.height - 25;
    ((GuiButton)this.buttonList.get(0)).drawButton(this.mc, x, y);
    //super.drawScreen(x, x, z);

    // Shadow magic
    GL11.glEnable(3042 /*GL_BLEND*/);
    GL11.glBlendFunc(770, 771);
    GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
    GL11.glShadeModel(7425 /*GL_SMOOTH*/);
    GL11.glDisable(3553 /*GL_TEXTURE_2D*/);
    Tessellator var16 = Tessellator.instance;
    byte var19 = 4;
    var16.startDrawingQuads();
    var16.setColorRGBA_I(0, 0);
    var16.addVertexWithUV(0, (double)(30 + var19), 0.0D, 0.0D, 1.0D);
    var16.addVertexWithUV(this.width - 12, (double)(30 + var19), 0.0D, 1.0D, 1.0D);
    var16.setColorRGBA_I(0, 255);
    var16.addVertexWithUV(this.width - 12, 30, 0.0D, 1.0D, 0.0D);
    var16.addVertexWithUV(0, 30, 0.0D, 0.0D, 0.0D);
    var16.draw();
    var16.startDrawingQuads();
    var16.setColorRGBA_I(0, 255);
    var16.addVertexWithUV(0, this.height - 50, 0.0D, 0.0D, 1.0D);
    var16.addVertexWithUV(this.width - 12, this.height - 50, 0.0D, 1.0D, 1.0D);
    var16.setColorRGBA_I(0, 0);
    var16.addVertexWithUV(this.width - 12, (double)(this.height - 50 - var19), 0.0D, 1.0D, 0.0D);
    var16.addVertexWithUV(0, (double)(this.height - 50 - var19), 0.0D, 0.0D, 0.0D);
    var16.draw();

    GL11.glEnable(3008 /*GL_ALPHA_TEST*/);

    GL11.glPopMatrix();
  }

  private void overlayBackground(int var1, int var2, int var3, int var4) {
    Tessellator var5 = Tessellator.instance;
    //ToDo: This is the wrong location for this file.
    Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("gui/background.png"));
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    float var6 = 32.0F;
    var5.startDrawingQuads();
    var5.setColorRGBA_I(4210752, var4);
    var5.addVertexWithUV(0.0D, (double)var2, 0.0D, 0.0D, (double)((float)var2 / var6));
    var5.addVertexWithUV((double)this.width, (double)var2, 0.0D, (double)((float)this.width / var6), (double)((float)var2 / var6));
    var5.setColorRGBA_I(4210752, var3);
    var5.addVertexWithUV((double)this.width, (double)var1, 0.0D, (double)((float)this.width / var6), (double)((float)var1 / var6));
    var5.addVertexWithUV(0.0D, (double)var1, 0.0D, 0.0D, (double)((float)var1 / var6));
    var5.draw();
  }
}
TOP

Related Classes of org.spoutcraft.client.gui.about.GuiAbout

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.