diff --git a/.gitignore b/.gitignore
index a032d03..d784c81 100644
--- a/.gitignore
+++ b/.gitignore
@@ -121,4 +121,5 @@ parabotv2
releases
._*
-Test.java
\ No newline at end of file
+Test.java
+*.DS_Store
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..05e482a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,36 @@
+language: java
+
+jdk:
+- oraclejdk7
+
+before_install:
+ - chmod +x ./.travis/artifact-upload.sh
+ - chmod +x ./.travis/maven-build.sh
+
+script: ./.travis/maven-build.sh
+
+notifications:
+ slack:
+ secure: ciAOsdv9lf/IbAwyzeR/z2nlBSevmBHBqca6tf0Yh2DIyAx/uUo1ojon0W7Kv6tCECGhSTdfQAnZ+nFjjqaRs+Jq4svd9WKYrFuZyOWmT31iSJ/nvPymRvevSsgwpSKr0nJS9dxePKto/T3ozW29kx88eaJQH17zOaX2rfuIje4=
+ webhooks:
+ urls:
+ - https://dockbit.com/webhooks/7PrMKazLtLw5hhpXvakVKWoq
+ on_success: always
+ on_failure: always
+ on_start: never
+
+env:
+ global:
+ - secure: UG+b1tEgc8xv9x4r//2OAIK1RrYv6n209KTTFMMwcnAa7DI8HaP8nljRa5/VhDhuKHdlVrYH/tI90v7UVBs0GDVNwK5V17Io0fMm3FUGZekSthTCqqno5wAGa9r6a6mMLtSaSmIFeIKi0+0d2ZwplRuhj/dtEYjjBBj+kK8g4nE=
+ - secure: St/fecUDInFBCRriYqgp2F8PU9/SooorgxD9Mrs+b0EsC7AbtSsQXvdIv2Lp6xzdQ0VSXPcLIhULPOYrmBKnGQ/NjXTIZXxnroyQxxnI6xyEWIZwiHRY/bKRJDRbQTxD9NL32szKiDSwnw7pu6llF4D64UqQvziq4Gm6VohU75M=
+ - secure: bD15GVZWowiknbfLavh8CxSh0GsnF5kT4kZ6ggCuUDGyj0mzqf7dNRnchQIKkCG0WRYyTrFN4pEiygeywWsipEeAVv9Xhx3cuUZmzeQaR5KCWabSwJ8gK6jZd1YhcWmM9vrdPHobZr65MP0y/8mu/Fovgky9dY7KDf4G3SebNrM=
+
+addons:
+ artifacts:
+ paths: ./target/final/
+ s3_region: "us-west-1"
+
+cache:
+ directories:
+ - .autoconf
+ - $HOME/.m2
diff --git a/.travis/artifact-upload.sh b/.travis/artifact-upload.sh
new file mode 100644
index 0000000..6c1b4f4
--- /dev/null
+++ b/.travis/artifact-upload.sh
@@ -0,0 +1,8 @@
+#! /bin/bash
+
+local_file="$(ls $TRAVIS_BUILD_DIR/target/final/Parabot-V*.jar | head -n 1 | xargs -n 1 basename)"
+local_path="$(ls $TRAVIS_BUILD_DIR/target/final/Parabot-V*.jar | head -n 1)"
+target_url="ftp://$FTP_HOST/$local_file"
+
+echo "Uploading $local_file to $target_url"
+curl -us $FTP_USERNAME:$FTP_PASSWORD -T "$local_path" "$target_url"
\ No newline at end of file
diff --git a/.travis/maven-build.sh b/.travis/maven-build.sh
new file mode 100755
index 0000000..957ccf6
--- /dev/null
+++ b/.travis/maven-build.sh
@@ -0,0 +1,7 @@
+#! /bin/bash
+
+if [ "$TRAVIS_BRANCH" == "master" ]; then
+ mvn -U package
+else
+ mvn -Dversion="-RC-$TRAVIS_BUILD_ID" -U package
+fi
\ No newline at end of file
diff --git a/README.md b/README.md
index d39fe36..ef23a16 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
+[](https://travis-ci.org/Parabot/Parabot)
+
# Parabot
-Parabot V2.4.
+Parabot V2.5.
#### Website
diff --git a/deploy/deploy.bat b/deploy/deploy.bat
index 5ad3b36..e1f4c4f 100644
--- a/deploy/deploy.bat
+++ b/deploy/deploy.bat
@@ -1,4 +1,5 @@
-mvn install:install-file -DgroupId=${project.groupId} -DartifactId=${project.artifactId} -Dversion=${project.version} -Dpackaging=jar -Dfile=../target/${project.build.finalName}-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository
+mvn install:install-file -DgroupId=${project.groupId} -DartifactId=${project.artifactId} -Dversion=${project.version} -Dpackaging=jar -Dfile=../target/final/${project.build.finalName}-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository
:: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.4.1.1 -Dpackaging=jar -Dfile=../target/Parabot-V2.4.1.1-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository
:: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.4.3 -Dpackaging=jar -Dfile=../target/Parabot-V2.4.3-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository
+:: mvn install:install-file -DgroupId=org.parabot -DartifactId=client -Dversion=2.5 -Dpackaging=jar -Dfile=../target/final/Parabot-V2.5-jar-with-dependencies.jar -DlocalRepositoryPath=../../Maven-Repository
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
index 1bf4a9f..b790f36
--- a/pom.xml
+++ b/pom.xml
@@ -6,12 +6,13 @@
org.parabot
client
- 2.4.5
+ 2.5.1
jar
1.7
+
Parabot client
@@ -80,7 +81,7 @@
- Parabot-V${version}
+ Parabot-V${version}${build.version}
src/main/resources
@@ -89,18 +90,29 @@
deploy
true
-
-
-
-
-
-
- deploy.bat
-
+
+ deploy.bat
+ package.bat
+ clean.bat
+
+
+
+
+
+ maven-resources-plugin
+ 2.5
+
+ UTF-8
+
+ ttf
+
+
+
+
org.apache.maven.plugins
maven-compiler-plugin
@@ -114,7 +126,7 @@
org.apache.maven.plugins
maven-assembly-plugin
- 2.4.1
+ ${version}
jar-with-dependencies
@@ -124,6 +136,8 @@
org.parabot.Landing
+ ${project.build.directory}/final/
+ false
@@ -135,7 +149,6 @@
-
diff --git a/src/main/java/org/parabot/core/Configuration.java b/src/main/java/org/parabot/core/Configuration.java
index 9003784..5ae8cdc 100644
--- a/src/main/java/org/parabot/core/Configuration.java
+++ b/src/main/java/org/parabot/core/Configuration.java
@@ -26,4 +26,7 @@ public class Configuration {
public static final String BUGSNAG_API = "d79752cf94dd4beb24c3d312a8609f53";
public static final Version BOT_VERSION = ProjectProperties.getProjectVersion();
+
+ public static final String BOT_TITLE = "Parabot";
+ public static final String BOT_SLOGAN = "The best RuneScape private server bot";
}
diff --git a/src/main/java/org/parabot/core/Context.java b/src/main/java/org/parabot/core/Context.java
index c895f1d..8cfd7b7 100644
--- a/src/main/java/org/parabot/core/Context.java
+++ b/src/main/java/org/parabot/core/Context.java
@@ -163,6 +163,7 @@ public class Context {
* Loads the game
*/
public void load() {
+ BotUI.getInstance().getJMenuBar().remove(2);
Core.verbose("Parsing server jar...");
serverProvider.init();
serverProvider.parseJar();
diff --git a/src/main/java/org/parabot/core/Directories.java b/src/main/java/org/parabot/core/Directories.java
index 8b04584..d18ae07 100644
--- a/src/main/java/org/parabot/core/Directories.java
+++ b/src/main/java/org/parabot/core/Directories.java
@@ -40,6 +40,7 @@ public class Directories {
cached.put("Settings", new File(cached.get("Root"), "/Parabot/settings/"));
cached.put("Servers", new File(cached.get("Root"), "/Parabot/servers/"));
cached.put("Cache", new File(cached.get("Root"), "/Parabot/cache/"));
+ cached.put("Screenshots", new File(cached.get("Root"), "/Parabot/screenshots/"));
Core.verbose("Directories cached.");
clearCache(259200);
@@ -192,6 +193,16 @@ public class Directories {
return cached.get("Home");
}
+
+ /**
+ * Returns the screenshot folder.
+ *
+ * @return
+ */
+ public static File getScreenshotDir() {
+ return cached.get("Screenshots");
+ }
+
/**
* Validates all directories and makes them if necessary
*/
diff --git a/src/main/java/org/parabot/core/classpath/ClassPath.java b/src/main/java/org/parabot/core/classpath/ClassPath.java
index 45ade74..ddd9881 100644
--- a/src/main/java/org/parabot/core/classpath/ClassPath.java
+++ b/src/main/java/org/parabot/core/classpath/ClassPath.java
@@ -196,7 +196,7 @@ public class ClassPath {
* @throws IOException
*/
protected void loadClass(InputStream in) throws IOException {
- ClassReader cr = new ClassReader(in);
+ ClassReader cr = new ClassReader(in);
ClassNode cn = new ClassNode();
RemappingClassAdapter rca = new RemappingClassAdapter(cn,classRemapper);
RedirectClassAdapter redir = new RedirectClassAdapter(rca);
diff --git a/src/main/java/org/parabot/core/ui/BotUI.java b/src/main/java/org/parabot/core/ui/BotUI.java
index 060b17a..532e52b 100644
--- a/src/main/java/org/parabot/core/ui/BotUI.java
+++ b/src/main/java/org/parabot/core/ui/BotUI.java
@@ -1,17 +1,23 @@
package org.parabot.core.ui;
import org.parabot.core.Context;
+import org.parabot.core.Directories;
import org.parabot.core.ui.components.GamePanel;
import org.parabot.core.ui.components.VerboseLoader;
import org.parabot.core.ui.images.Images;
import org.parabot.core.ui.utils.SwingUtil;
import org.parabot.environment.OperatingSystem;
+import org.parabot.environment.api.utils.StringUtils;
import org.parabot.environment.scripts.Script;
import org.parabot.environment.scripts.randoms.Random;
+import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
/**
@@ -25,7 +31,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
private static BotUI instance;
private static JDialog dialog;
- private JMenuItem run, pause, stop;
+ private JMenuItem run, pause, stop, cacheClear;
private boolean runScript, pauseScript;
public BotUI(String username, String password) {
@@ -38,7 +44,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
setTitle("Parabot");
setResizable(false);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
createMenu();
setLayout(new BorderLayout());
@@ -64,11 +70,13 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
return instance;
}
+
private void createMenu() {
JMenuBar menuBar = new JMenuBar();
JMenu file = new JMenu("File");
JMenu scripts = new JMenu("Script");
+ JMenu features = new JMenu("Features");
JMenuItem screenshot = new JMenuItem("Create screenshot");
JMenuItem proxy = new JMenuItem("Network");
@@ -94,6 +102,9 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
stop.setEnabled(false);
stop.setIcon(new ImageIcon(Images.getResource("/storage/images/stop.png")));
+ cacheClear = new JMenuItem("Clear cache");
+ cacheClear.setIcon(new ImageIcon(Images.getResource("/storage/images/trash.png")));
+
screenshot.addActionListener(this);
proxy.addActionListener(this);
randoms.addActionListener(this);
@@ -101,6 +112,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
logger.addActionListener(this);
explorer.addActionListener(this);
exit.addActionListener(this);
+ cacheClear.addActionListener(this);
run.addActionListener(this);
pause.addActionListener(this);
@@ -118,8 +130,12 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
scripts.add(pause);
scripts.add(stop);
+ features.add(cacheClear);
+
menuBar.add(file);
menuBar.add(scripts);
+ menuBar.add(features);
+
setJMenuBar(menuBar);
}
@@ -130,7 +146,33 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
switch (command) {
case "Create screenshot":
- JOptionPane.showMessageDialog(this, "We are still working on this...");
+ try {
+ Robot robot = new Robot();
+ Rectangle parabotScreen = new Rectangle((int) getLocation().getX(), (int) getLocation().getY(), getWidth(), getHeight());
+ BufferedImage image = robot.createScreenCapture(parabotScreen);
+ String randString = StringUtils.randomString(10);
+ boolean search = true;
+ boolean duplicate = false;
+ while (search == true) {
+ for (File f : Directories.getScreenshotDir().listFiles()) {
+ if (f.getAbsoluteFile().getName().contains(randString)) {
+ duplicate = true;
+ break;
+ }
+ }
+ if (!duplicate) {
+ search = false;
+ } else {
+ randString = StringUtils.randomString(10);
+ duplicate = false;
+ }
+ }
+ File file = new File(Directories.getScreenshotDir().getPath() + "/" + randString + ".png");
+ ImageIO.write(image, "png", file);
+
+ } catch (IOException | AWTException k) {
+ k.printStackTrace();
+ }
break;
case "Exit":
System.exit(0);
@@ -173,7 +215,7 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
BotUI.getInstance().revalidate();
if (!Logger.getInstance().isClearable()) {
Logger.getInstance().setClearable();
- } else if(Logger.getInstance().isClearable() && !Logger.getInstance().isVisible()) {
+ } else if (Logger.getInstance().isClearable() && !Logger.getInstance().isVisible()) {
Logger.clearLogger();
Logger.addMessage("Logger started", false);
}
@@ -181,6 +223,9 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
case "Disable dialog":
BotDialog.getInstance().setVisible(!dialog.isVisible());
break;
+ case "Clear cache":
+ Directories.clearCache();
+ break;
default:
System.out.println("Invalid command: " + command);
}
@@ -274,4 +319,5 @@ public class BotUI extends JFrame implements ActionListener, ComponentListener,
@Override
public void windowOpened(WindowEvent arg0) {
}
-}
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/parabot/core/ui/ReflectUI.java b/src/main/java/org/parabot/core/ui/ReflectUI.java
index 2b26873..351ca66 100644
--- a/src/main/java/org/parabot/core/ui/ReflectUI.java
+++ b/src/main/java/org/parabot/core/ui/ReflectUI.java
@@ -1,198 +1,263 @@
package org.parabot.core.ui;
-import java.awt.Dimension;
-import java.util.HashMap;
-
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JEditorPane;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTree;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreePath;
-
import org.parabot.core.Context;
import org.parabot.core.asm.ASMClassLoader;
import org.parabot.core.classpath.ClassPath;
import org.parabot.core.reflect.RefClass;
import org.parabot.core.reflect.RefField;
+import javax.swing.*;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeNode;
+import javax.swing.tree.TreePath;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Enumeration;
+import java.util.HashMap;
+
/**
- *
* A Reflection explorer
- *
+ *
* @author Everel
- *
*/
public class ReflectUI extends JFrame {
- private static final long serialVersionUID = 98565034137367257L;
- private DefaultMutableTreeNode root;
- private DefaultTreeModel model;
- private JEditorPane basicInfoPane;
- private JEditorPane selectionInfoPane;
-
- private Object instance;
+ private static final long serialVersionUID = 98565034137367257L;
+ private JTree tree;
+ private DefaultMutableTreeNode root;
+ private DefaultTreeModel model;
+ private JEditorPane basicInfoPane;
+ private JEditorPane selectionInfoPane;
- private HashMap classes;
- private HashMap fields;
+ private Object instance;
- public ReflectUI() {
- this.root = new DefaultMutableTreeNode("Classes");
- this.model = new DefaultTreeModel(root);
- this.basicInfoPane = new JEditorPane();
- this.selectionInfoPane = new JEditorPane();
- this.classes = new HashMap<>();
- this.fields = new HashMap<>();
- this.instance = Context.getInstance().getClient();
+ private HashMap classes;
+ private HashMap fields;
- fillModel();
+ public ReflectUI() {
+ this.root = new DefaultMutableTreeNode("Classes");
+ this.model = new DefaultTreeModel(root);
+ this.basicInfoPane = new JEditorPane();
+ this.selectionInfoPane = new JEditorPane();
+ this.classes = new HashMap<>();
+ this.fields = new HashMap<>();
+ this.instance = Context.getInstance().getClient();
- setTitle("Reflection explorer");
- setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+ fillModel();
- JPanel content = new JPanel();
- content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
+ setTitle("Reflection explorer");
+ setDefaultCloseOperation(DISPOSE_ON_CLOSE);
- JPanel exploreContent = new JPanel();
- exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS));
-
- JPanel infoContent = new JPanel();
- infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS));
+ JPanel content = new JPanel();
+ content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
- JTree tree = new JTree();
- tree.setRootVisible(true);
- tree.setShowsRootHandles(true);
- tree.setModel(model);
- tree.addTreeSelectionListener(new TreeSelectionListener() {
+ JPanel exploreContent = new JPanel();
+ exploreContent.setLayout(new BoxLayout(exploreContent, BoxLayout.X_AXIS));
- @Override
- public void valueChanged(TreeSelectionEvent event) {
- TreePath path = event.getPath();
- Object[] pathElements = path.getPath();
- Object element = pathElements[pathElements.length-1];
- if(pathElements.length == 2) {
- // class
- setClassInfo(classes.get(element));
- }
- if(pathElements.length == 3) {
- // field
- setFieldInfo(fields.get(element));
- }
- }
-
- });
+ JPanel infoContent = new JPanel();
+ infoContent.setLayout(new BoxLayout(infoContent, BoxLayout.Y_AXIS));
- JScrollPane scrollTreePane = new JScrollPane(tree);
- scrollTreePane.setPreferredSize(new Dimension(400, 300));
-
- basicInfoPane.setContentType("text/html");
- basicInfoPane.setEditable(false);
+ JPanel searchContent = new JPanel();
+ searchContent.setLayout(new BoxLayout(searchContent, BoxLayout.X_AXIS));
- selectionInfoPane.setContentType("text/html");
- selectionInfoPane.setEditable(false);
-
- JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane);
- scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90));
+ final JTextField searchFunction = new JTextField(10);
+ searchFunction.setHorizontalAlignment(JTextField.CENTER);
+ searchFunction.setSize(30, 30);
+ searchFunction.setColumns(1);
+ searchFunction.setPreferredSize(new Dimension(30, 30));
- JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane);
- scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200));
-
- infoContent.add(scrollBasicInfoPane);
- infoContent.add(Box.createRigidArea(new Dimension(0, 10)));
- infoContent.add(scrollSelectInfoPane);
+ final JButton searchButton = new JButton("Search");
+ searchFunction.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ searchButton.getActionListeners()[0].actionPerformed(e);
+ }
+ });
- exploreContent.add(scrollTreePane);
- exploreContent.add(Box.createRigidArea(new Dimension(10, 0)));
- exploreContent.add(infoContent);
+ searchButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ RefField result = null;
+ String search = searchFunction.getText();
+ for (RefField f : fields.values()) {
+ if (f != null && (f.asObject()) != null) {
+ String value;
+ if ((value = f.asObject().toString()).equalsIgnoreCase(search)) {
+ result = f;
+ } else if (value.toLowerCase().startsWith(search.toLowerCase())) {
+ result = f;
+ } else if (value.toLowerCase().endsWith(search.toLowerCase())) {
+ result = f;
+ }
+ }
+ }
+ if (result != null) {
+ setFieldInfo(result);
+ }
+ }
+ });
- content.add(exploreContent);
- JScrollPane contentPane = new JScrollPane(content);
- Dimension prefSize = content.getPreferredSize();
- contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
- setContentPane(contentPane);
- pack();
- setLocationRelativeTo(null);
- setVisible(true);
- }
+ final JButton adjustClasses = new JButton("Expand");
+ adjustClasses.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Enumeration> topLevelNodes
+ = ((TreeNode) tree.getModel().getRoot()).children();
+ while (topLevelNodes.hasMoreElements()) {
+ DefaultMutableTreeNode node
+ = (DefaultMutableTreeNode) topLevelNodes.nextElement();
+ TreePath treePath = new TreePath(node.getPath());
+ if (adjustClasses.getText().equalsIgnoreCase("expand")) {
+ tree.expandPath(treePath);
+ } else {
+ tree.collapsePath(treePath);
+ }
+ }
- private void fillModel() {
- Context context = Context.getInstance();
- ClassPath classPath = context.getClassPath();
- ASMClassLoader classLoader = context.getASMClassLoader();
- for (String className : classPath.classNames) {
- try {
- DefaultMutableTreeNode classNode = new DefaultMutableTreeNode(
- "Class: " + className);
- DefaultMutableTreeNode fieldNode;
+ adjustClasses.setText(adjustClasses.getText().equalsIgnoreCase("expand") ? "Collapse" : "Expand");
+ }
+ });
- Class> clazz = classLoader.loadClass(className);
+ searchContent.add(adjustClasses);
+ searchContent.add(searchFunction);
+ searchContent.setMaximumSize(new Dimension(500, (int) searchContent.getPreferredSize().getHeight()));
+ searchContent.add(searchButton);
- RefClass refClass = new RefClass(clazz);
- if(refClass.instanceOf(this.instance)) {
- refClass.setInstance(this.instance);
- }
-
- for (RefField field : refClass.getFields()) {
- fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
- classNode.add(fieldNode);
- fields.put(fieldNode, field);
- }
- classes.put(classNode, refClass);
- root.add(classNode);
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
- }
-
- private void fillBasicInfoPane() {
- Context context = Context.getInstance();
- ClassPath classPath = context.getClassPath();
-
- StringBuilder builder = new StringBuilder();
-
- builder.append("Classes: ").append(classPath.classNames.size()).append("
");
- builder.append("Using instance: ").append(instance.toString()).append("
");
-
- basicInfoPane.setText(builder.toString());
- }
-
- private void setFieldInfo(RefField refField) {
- StringBuilder builder = new StringBuilder();
- RefClass refClass = refField.getOwner();
- builder.append("").append(refClass.getClassName()).append(".").append(refField.getName()).append("
");
- builder.append("Class: ").append(refClass.getClassName()).append("
");
- builder.append("Value: ").append(refField.asObject()).append("
");
- builder.append("Type: ").append(refField.getASMType().getClassName()).append("
");
- builder.append("Static: ").append(refField.isStatic() ? "yes" : "no").append("
");
- builder.append("Array: ").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("
");
- selectionInfoPane.setText(builder.toString());
-
- fillBasicInfoPane();
- }
-
- private void setClassInfo(RefClass refClass) {
- StringBuilder builder = new StringBuilder();
- builder.append("").append(refClass.getClassName()).append("
");
- if(refClass.getClassName().contains(".")) {
- builder.append("Package: ").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("
");
- }
- builder.append("Abstract: ").append(refClass.isAbstract() ? "yes" : "no").append("
");
- builder.append("Interface: ").append(refClass.isInterface() ? "yes" : "no").append("
");
- builder.append("Superclass: ").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("
");
- builder.append("Fields: ").append(refClass.getFields().length).append("
");
- builder.append("Methods: ").append(refClass.getMethods().length).append("
");
- builder.append("Constructors: ").append(refClass.getConstructors().length).append("
");
- selectionInfoPane.setText(builder.toString());
-
- fillBasicInfoPane();
- }
+ tree = new JTree();
+ tree.setRootVisible(true);
+ tree.setShowsRootHandles(true);
+ tree.setModel(model);
+ tree.addTreeSelectionListener(new TreeSelectionListener() {
-}
+ @Override
+ public void valueChanged(TreeSelectionEvent event) {
+ TreePath path = event.getPath();
+ Object[] pathElements = path.getPath();
+ Object element = pathElements[pathElements.length - 1];
+ if (pathElements.length == 2) {
+ setClassInfo(classes.get(element));
+ } else if (pathElements.length == 3) {
+ RefField field = fields.get(element);
+ setFieldInfo(field);
+ DefaultMutableTreeNode el = (DefaultMutableTreeNode) element;
+ el.setUserObject("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
+ }
+ }
+
+ });
+
+ JScrollPane scrollTreePane = new JScrollPane(tree);
+ scrollTreePane.setPreferredSize(new Dimension(400, 300));
+
+ basicInfoPane.setContentType("text/html");
+ basicInfoPane.setEditable(false);
+
+ selectionInfoPane.setContentType("text/html");
+ selectionInfoPane.setEditable(false);
+
+ JScrollPane scrollBasicInfoPane = new JScrollPane(basicInfoPane);
+ scrollBasicInfoPane.setPreferredSize(new Dimension(400, 90));
+
+ JScrollPane scrollSelectInfoPane = new JScrollPane(selectionInfoPane);
+ scrollSelectInfoPane.setPreferredSize(new Dimension(400, 200));
+
+ infoContent.add(scrollBasicInfoPane);
+ infoContent.add(Box.createRigidArea(new Dimension(0, 10)));
+ infoContent.add(scrollSelectInfoPane);
+
+ exploreContent.add(scrollTreePane);
+ exploreContent.add(Box.createRigidArea(new Dimension(10, 0)));
+ exploreContent.add(infoContent);
+
+ content.add(exploreContent);
+ content.add(searchContent);
+
+ JScrollPane contentPane = new JScrollPane(content);
+ Dimension prefSize = content.getPreferredSize();
+ contentPane.setPreferredSize(new Dimension(prefSize.width + contentPane.getVerticalScrollBar().getPreferredSize().width, prefSize.height + contentPane.getHorizontalScrollBar().getPreferredSize().height));
+ setContentPane(contentPane);
+ pack();
+ setLocationRelativeTo(null);
+ setVisible(true);
+ }
+
+ private void fillModel() {
+ Context context = Context.getInstance();
+ ClassPath classPath = context.getClassPath();
+ ASMClassLoader classLoader = context.getASMClassLoader();
+ for (String className : classPath.classNames) {
+ try {
+ DefaultMutableTreeNode classNode = new DefaultMutableTreeNode(
+ "Class: " + className);
+ DefaultMutableTreeNode fieldNode;
+
+ Class> clazz = classLoader.loadClass(className);
+
+ RefClass refClass = new RefClass(clazz);
+ if (refClass.instanceOf(this.instance)) {
+ refClass.setInstance(this.instance);
+ }
+
+ for (RefField field : refClass.getFields()) {
+ fieldNode = new DefaultMutableTreeNode("Field: " + field.getName() + " [type: " + field.getASMType() + "] [value: " + field.asObject() + "]");
+ classNode.add(fieldNode);
+ fields.put(fieldNode, field);
+ }
+ classes.put(classNode, refClass);
+
+ root.add(classNode);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ }
+
+ private void fillBasicInfoPane() {
+ Context context = Context.getInstance();
+ ClassPath classPath = context.getClassPath();
+
+ StringBuilder builder = new StringBuilder();
+
+ builder.append("Classes: ").append(classPath.classNames.size()).append("
");
+ builder.append("Using instance: ").append(instance.toString()).append("
");
+
+ basicInfoPane.setText(builder.toString());
+ }
+
+ private void setFieldInfo(RefField refField) {
+ StringBuilder builder = new StringBuilder();
+ RefClass refClass = refField.getOwner();
+ builder.append("").append(refClass.getClassName()).append(".").append(refField.getName()).append("
");
+ builder.append("Class: ").append(refClass.getClassName()).append("
");
+ builder.append("Value: ").append(refField.asObject()).append("
");
+ builder.append("Type: ").append(refField.getASMType().getClassName()).append("
");
+ builder.append("Static: ").append(refField.isStatic() ? "yes" : "no").append("
");
+ builder.append("Array: ").append(refField.isArray() ? refField.getArrayDimensions() + " dimension(s)" : "no").append("
");
+ selectionInfoPane.setText(builder.toString());
+
+ fillBasicInfoPane();
+ }
+
+ private void setClassInfo(RefClass refClass) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("").append(refClass.getClassName()).append("
");
+ if (refClass.getClassName().contains(".")) {
+ builder.append("Package: ").append(refClass.getClassName().substring(0, refClass.getClassName().lastIndexOf("."))).append("
");
+ }
+ builder.append("Abstract: ").append(refClass.isAbstract() ? "yes" : "no").append("
");
+ builder.append("Interface: ").append(refClass.isInterface() ? "yes" : "no").append("
");
+ builder.append("Superclass: ").append(refClass.hasSuperclass() ? refClass.getSuperclass().getClassName() : "no").append("
");
+ builder.append("Fields: ").append(refClass.getFields().length).append("
");
+ builder.append("Methods: ").append(refClass.getMethods().length).append("
");
+ builder.append("Constructors: ").append(refClass.getConstructors().length).append("
");
+ selectionInfoPane.setText(builder.toString());
+
+ fillBasicInfoPane();
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/parabot/core/ui/ServerSelector.java b/src/main/java/org/parabot/core/ui/ServerSelector.java
old mode 100644
new mode 100755
index 2731890..3bbaacd
--- a/src/main/java/org/parabot/core/ui/ServerSelector.java
+++ b/src/main/java/org/parabot/core/ui/ServerSelector.java
@@ -31,7 +31,6 @@ public class ServerSelector extends JPanel {
}
public ServerSelector() {
-
Queue widgets = getServers();
if (initServer != null) {
if (runServer(widgets)) {
@@ -42,7 +41,7 @@ public class ServerSelector extends JPanel {
setLayout(new BorderLayout());
- setPreferredSize(new Dimension(600, 400));
+ setPreferredSize(new Dimension(600, 350));
JPanel interior = new JPanel(null);
@@ -66,8 +65,7 @@ public class ServerSelector extends JPanel {
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrlInterior
.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
-
- add(scrlInterior, BorderLayout.CENTER);
+ add(scrlInterior);
}
diff --git a/src/main/java/org/parabot/core/ui/components/ServerComponent.java b/src/main/java/org/parabot/core/ui/components/ServerComponent.java
index ee38480..7fa9c83 100644
--- a/src/main/java/org/parabot/core/ui/components/ServerComponent.java
+++ b/src/main/java/org/parabot/core/ui/components/ServerComponent.java
@@ -13,6 +13,7 @@ import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
import org.parabot.core.desc.ServerDescription;
+import org.parabot.core.ui.fonts.Fonts;
import org.parabot.environment.Environment;
/**
@@ -61,13 +62,13 @@ public class ServerComponent extends JPanel implements MouseListener,
g2d.setColor(bgColor);
g2d.fillRect(0, 0, w, h);
g.setColor(Color.black);
- Font title = new Font("Arial", Font.BOLD, 16);
+ Font title = Fonts.getResource("leelawadee.ttf", 16);
g.setFont(title);
String serverName = desc.getServerName();
int sw = g.getFontMetrics().stringWidth(serverName);
g.drawString(serverName, (w / 2) - (sw / 2), 30);
- Font normal = new Font("Arial", Font.PLAIN, 12);
+ Font normal = Fonts.getResource("leelawadee.ttf");
g.setFont(normal);
FontMetrics fm = g.getFontMetrics();
String author = "Author: " + desc.getAuthor();
diff --git a/src/main/java/org/parabot/core/ui/components/VerboseLoader.java b/src/main/java/org/parabot/core/ui/components/VerboseLoader.java
old mode 100644
new mode 100755
index 9ab8c70..9d9e102
--- a/src/main/java/org/parabot/core/ui/components/VerboseLoader.java
+++ b/src/main/java/org/parabot/core/ui/components/VerboseLoader.java
@@ -1,250 +1,286 @@
package org.parabot.core.ui.components;
+import org.parabot.core.Configuration;
import org.parabot.core.Core;
import org.parabot.core.forum.AccountManager;
import org.parabot.core.forum.AccountManagerAccess;
import org.parabot.core.io.ProgressListener;
import org.parabot.core.ui.ServerSelector;
import org.parabot.core.ui.images.Images;
+import org.parabot.core.ui.fonts.Fonts;
import org.parabot.core.ui.utils.UILog;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
+import java.awt.image.RescaleOp;
/**
* An informative JPanel which tells the user what bot is doing
- *
- * @author Everel
*
+ * @author Everel, EmmaStone
*/
public class VerboseLoader extends JPanel implements ProgressListener {
- private static final long serialVersionUID = 7412412644921803896L;
- private static VerboseLoader current;
- private static String state = "Initializing loader...";
-
- public static final int STATE_AUTHENTICATION = 0;
- public static final int STATE_LOADING = 1;
- public static final int STATE_SERVER_SELECT = 2;
- private int currentState;
-
- private static AccountManager manager;
-
- private FontMetrics fontMetrics;
- private BufferedImage background;
- private ProgressBar progressBar;
- private JPanel loginPanel;
-
- public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() {
+ private static final long serialVersionUID = 7412412644921803896L;
+ private static VerboseLoader current;
+ private static String state = "Initializing loader...";
- @Override
- public final void setManager(AccountManager manager) {
- VerboseLoader.manager = manager;
- }
+ private static final int STATE_AUTHENTICATION = 0;
+ public static final int STATE_LOADING = 1;
+ private static final int STATE_SERVER_SELECT = 2;
+ private int currentState;
- };
+ private static AccountManager manager;
- private VerboseLoader(String username, String password) {
- if(current != null) {
- throw new IllegalStateException("MainScreenComponent already made.");
- }
- current = this;
- this.background = Images.getResource("/storage/images/background.png");
- this.progressBar = new ProgressBar(400, 20);
- setLayout(new GridBagLayout());
- setSize(775, 510);
- setPreferredSize(new Dimension(775, 510));
- setDoubleBuffered(true);
- setOpaque(false);
-
- if(username != null && password != null) {
- if(Core.inDebugMode() || manager.login(username, password, false)) {
- currentState = STATE_SERVER_SELECT;
- }
- }
-
- if(currentState == STATE_AUTHENTICATION) {
- addLoginPanel();
- } else if(currentState == STATE_SERVER_SELECT) {
- addServerPanel();
- }
- }
-
- public void addServerPanel() {
- JPanel servers = ServerSelector.getInstance();
- add(servers, new GridBagConstraints());
- }
-
- public void addLoginPanel() {
- loginPanel = new JPanel();
- loginPanel.setOpaque(false);
-
- loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
-
- Font labelFont = new Font("Times New Roman", Font.PLAIN, 11);
-
- JLabel usernameLabel = new JLabel("Username");
- usernameLabel.setFont(labelFont);
- usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
- usernameLabel.setForeground(Color.white);
-
- final JTextField userInput = new JTextField(25);
- final JTextField passInput = new JPasswordField(25);
- userInput.addActionListener(new ActionListener() {
+ private FontMetrics fontMetrics;
+ private BufferedImage background, banner, loginBox;
+ private ProgressBar progressBar;
+ private JPanel loginPanel;
- @Override
- public void actionPerformed(ActionEvent e) {
- passInput.requestFocus();
- }
-
- });
- userInput.setFont(labelFont);
- userInput.setAlignmentX(Box.CENTER_ALIGNMENT);
- userInput.setMaximumSize(userInput.getPreferredSize());
-
- final JButton login = new JButton("Login");
-
- passInput.setAlignmentX(Box.CENTER_ALIGNMENT);
- passInput.setMaximumSize(userInput.getPreferredSize());
+ public static final AccountManagerAccess MANAGER_FETCHER = new AccountManagerAccess() {
+
+ @Override
+ public final void setManager(AccountManager manager) {
+ VerboseLoader.manager = manager;
+ }
+
+ };
+
+ private VerboseLoader(String username, String password) {
+ if (current != null) {
+ throw new IllegalStateException("MainScreenComponent already made.");
+ }
+ current = this;
+ this.background = Images.getResource("/storage/images/background.png");
+ this.banner = Images.getResource("/storage/images/logo.png");
+ this.loginBox = Images.getResource("/storage/images/login.png");
+ this.progressBar = new ProgressBar(400, 20);
+ setLayout(new GridBagLayout());
+ setSize(775, 510);
+ setPreferredSize(new Dimension(775, 510));
+ setDoubleBuffered(true);
+ setOpaque(false);
+
+ if (username != null && password != null) {
+ if (Core.inDebugMode() || manager.login(username, password, false)) {
+ currentState = STATE_SERVER_SELECT;
+ }
+ }
+
+ if (currentState == STATE_AUTHENTICATION) {
+ addLoginPanel();
+ } else if (currentState == STATE_SERVER_SELECT) {
+ addServerPanel();
+ }
+ }
+
+ public void addServerPanel() {
+ JPanel servers = ServerSelector.getInstance();
+ GridBagLayout bagLayout = (GridBagLayout) getLayout();
+ GridBagConstraints c = new GridBagConstraints();
+
+ c.weightx = 1;
+ c.weighty = 1;
+ c.gridx = 0;
+ c.gridy = 0;
+ c.anchor = GridBagConstraints.SOUTH;
+ c.insets = new Insets(0, 0, 25, 0);
+
+ bagLayout.setConstraints(servers, c);
+ add(servers);
+ }
+
+ public void addLoginPanel() {
+ loginPanel = new JPanel();
+ loginPanel.setOpaque(false);
+
+ loginPanel.setLayout(new BoxLayout(loginPanel, BoxLayout.Y_AXIS));
+
+ Font labelFont = Fonts.getResource("leelawadee.ttf");
+
+ JLabel usernameLabel = new JLabel("Username");
+ usernameLabel.setFont(labelFont);
+ usernameLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
+ usernameLabel.setForeground(Color.white);
+
+ final JTextField userInput = new JTextField(20);
+ final JTextField passInput = new JPasswordField(20);
+ userInput.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ passInput.requestFocus();
+ }
+
+ });
+ userInput.setFont(labelFont);
+ userInput.setAlignmentX(Box.CENTER_ALIGNMENT);
+ userInput.setMaximumSize(userInput.getPreferredSize());
+
+ final JButton login = new JButton("Login");
+
+ passInput.setAlignmentX(Box.CENTER_ALIGNMENT);
+ passInput.setMaximumSize(userInput.getPreferredSize());
passInput.setPreferredSize(new Dimension(userInput.getWidth(), 20));
passInput.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- login.doClick();
- }
-
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ login.doClick();
+ }
+
});
-
- JLabel passwordLabel = new JLabel("Password");
- passwordLabel.setFont(labelFont);
- passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
- passwordLabel.setForeground(Color.white);
-
-
- login.setAlignmentX(Box.CENTER_ALIGNMENT);
- login.setOpaque(false);
-
- login.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent e) {
- if(manager.login(userInput.getText(), passInput.getText(), false)) {
- switchState(STATE_SERVER_SELECT);
- } else {
- Core.verbose("Failed to log in.");
- UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE);
- }
- }
-
- });
-
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- loginPanel.add(usernameLabel);
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- loginPanel.add(userInput);
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- loginPanel.add(passwordLabel);
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- loginPanel.add(passInput);
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
- loginPanel.add(login);
- loginPanel.add(Box.createRigidArea(new Dimension(0, 5)));
-
- add(loginPanel, new GridBagConstraints());
- }
+ JLabel passwordLabel = new JLabel("Password");
+ passwordLabel.setFont(labelFont);
+ passwordLabel.setAlignmentX(Box.CENTER_ALIGNMENT);
+ passwordLabel.setForeground(Color.white);
- public void switchState(int state) {
- removeAll();
- if(state == STATE_AUTHENTICATION) {
- addLoginPanel();
- } else if(state == STATE_SERVER_SELECT) {
- addServerPanel();
- }
- this.currentState = state;
- revalidate();
- }
- /**
- * Paints on this panel
- */
- @Override
- public void paintComponent(Graphics graphics) {
- super.paintComponent(graphics);
-
-
- Graphics2D g = (Graphics2D) graphics;
- g.setRenderingHint(
- RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
-
- g.drawImage(background, 0, 0, null);
-
- if (fontMetrics == null) {
- fontMetrics = g.getFontMetrics();
- }
-
- if(currentState == STATE_AUTHENTICATION) {
- g.setColor(new Color(74, 74, 72, 100));
- g.fillRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());
- g.setColor(Color.black);
- g.drawRect(loginPanel.getX() - 10, loginPanel.getY(), loginPanel.getWidth() + 20, loginPanel.getHeight());
- }
-
- g.setColor(Color.white);
-
- if(currentState == STATE_LOADING) {
- progressBar.draw(g, (getWidth() / 2) - 200, 220);
- g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
- int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2);
- g.drawString(state, x, 200);
- }
-
-
- g.setFont(new Font("Times New Roman", Font.PLAIN, 12));
- final String version = "v2.1";
- g.drawString(version,
- getWidth() - g.getFontMetrics().stringWidth(version) - 10,
- getHeight() - 12);
- }
+ login.setAlignmentX(Box.CENTER_ALIGNMENT);
+ login.setOpaque(false);
- /**
- * Gets instance of this panel
- * @return instance of this panel
- */
- public static VerboseLoader get(String username, String password) {
- return current == null ? new VerboseLoader(username, password) : current;
- }
-
- /**
- * Gets instance of this panel
- * @return instance of this panel
- */
- public static VerboseLoader get() {
- return current == null ? new VerboseLoader(null, null) : current;
- }
-
+ login.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (manager.login(userInput.getText(), passInput.getText(), false)) {
+ switchState(STATE_SERVER_SELECT);
+ } else {
+ Core.verbose("Failed to log in.");
+ UILog.log("Error", "Incorrect username or password. Have you tried logging into http://bdn.parabot.org/account/", JOptionPane.ERROR_MESSAGE);
+ }
+ }
- /**
- * Updates the status message and repaints the panel
- * @param message
- */
- public static void setState(final String message) {
- state = message;
- current.repaint();
- }
+ });
- @Override
- public void onProgressUpdate(double value) {
- progressBar.setValue(value);
- this.repaint();
- }
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 8)));
+ loginPanel.add(usernameLabel);
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 4)));
+ loginPanel.add(userInput);
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 4)));
+ loginPanel.add(passwordLabel);
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 4)));
+ loginPanel.add(passInput);
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 2)));
+ loginPanel.add(login);
+ loginPanel.add(Box.createRigidArea(new Dimension(0, 4)));
- @Override
- public void updateDownloadSpeed(double mbPerSecond) {
- progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond));
- }
+ add(loginPanel, new GridBagConstraints());
+ }
-}
+ public void switchState(int state) {
+ removeAll();
+ if (state == STATE_AUTHENTICATION) {
+ addLoginPanel();
+ } else if (state == STATE_SERVER_SELECT) {
+ addServerPanel();
+ }
+ this.currentState = state;
+ revalidate();
+ }
+
+ /**
+ * Paints on this panel
+ */
+ @Override
+ public void paintComponent(Graphics graphics) {
+ super.paintComponent(graphics);
+
+
+ Graphics2D g = (Graphics2D) graphics;
+ g.setRenderingHint(
+ RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
+ g.drawImage(background, 0, 0, null);
+ float[] scales = {1f, 1f, 1f, 0.9f};
+ float[] offsets = new float[4];
+ RescaleOp rop = new RescaleOp(scales, offsets, null);
+ g.drawImage(banner, rop, 0, 0);
+
+ g.setStroke(new BasicStroke(5));
+ g.setPaint(Color.WHITE);
+
+ g.draw(new Line2D.Float(0, 1, this.getWidth(), 1)); //TOP
+ g.draw(new Line2D.Float(0, 0, 0, 120)); //LEFT
+ g.draw(new Line2D.Float(0, 120, this.getWidth(), 120)); //BOTTOM
+ g.draw(new Line2D.Float(this.getWidth() - 6, 0, this.getWidth() - 6, 120)); //RIGHT
+
+ g.setColor(Color.white);
+
+ g.setFont(Fonts.getResource("leelawadee.ttf", 30));
+ g.getFont().deriveFont(Font.BOLD);
+ g.drawString(Configuration.BOT_TITLE, 20, 50);
+
+ g.setFont(Fonts.getResource("leelawadee.ttf", 15));
+ g.getFont().deriveFont(Font.ITALIC);
+ g.drawString(Configuration.BOT_SLOGAN, 20, 85);
+
+ if (fontMetrics == null) {
+ fontMetrics = g.getFontMetrics();
+ }
+
+ if (currentState == STATE_AUTHENTICATION) {
+ g.drawImage(loginBox, loginPanel.getX() - 30, loginPanel.getY() - 22, null);
+ }
+
+ g.setColor(Color.white);
+
+ if (currentState == STATE_LOADING) {
+ progressBar.draw(g, (getWidth() / 2) - 200, 220);
+ g.setFont(Fonts.getResource("leelawadee.ttf"));
+ int x = (getWidth() / 2) - (fontMetrics.stringWidth(state) / 2);
+ g.drawString(state, x, 200);
+ }
+
+
+ g.setFont(Fonts.getResource("leelawadee.ttf"));
+ final String version = Configuration.BOT_VERSION.get();
+ g.drawString(version,
+ getWidth() - g.getFontMetrics().stringWidth(version) - 10,
+ getHeight() - 12);
+ }
+
+ /**
+ * Gets instance of this panel
+ *
+ * @return instance of this panel
+ */
+ public static VerboseLoader get(String username, String password) {
+ return current == null ? new VerboseLoader(username, password) : current;
+ }
+
+ /**
+ * Gets instance of this panel
+ *
+ * @return instance of this panel
+ */
+ public static VerboseLoader get() {
+ return current == null ? new VerboseLoader(null, null) : current;
+ }
+
+
+ /**
+ * Updates the status message and repaints the panel
+ *
+ * @param message
+ */
+ public static void setState(final String message) {
+ state = message;
+ current.repaint();
+ }
+
+ @Override
+ public void onProgressUpdate(double value) {
+ progressBar.setValue(value);
+ this.repaint();
+ }
+
+ @Override
+ public void updateDownloadSpeed(double mbPerSecond) {
+ progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/parabot/core/ui/fonts/Fonts.java b/src/main/java/org/parabot/core/ui/fonts/Fonts.java
new file mode 100644
index 0000000..378c654
--- /dev/null
+++ b/src/main/java/org/parabot/core/ui/fonts/Fonts.java
@@ -0,0 +1,38 @@
+package org.parabot.core.ui.fonts;
+
+import java.awt.*;
+import java.util.ArrayList;
+
+/**
+ * @author Capslock
+ */
+public class Fonts {
+ private static final java.util.List FONT_CACHE = new ArrayList<>();
+
+ /**
+ * Calls the getResource with the default size of 12
+ *
+ * @param resource
+ * @return
+ */
+ public static Font getResource(final String resource) {
+ return getResource(resource, 12f);
+ }
+
+ public static Font getResource(final String fileName, float size) {
+ ParabotFont parabotFont = null;
+
+ for (ParabotFont font : FONT_CACHE) {
+ if (font.getLocation().equalsIgnoreCase(fileName) && font.getSize() == size) {
+ parabotFont = font;
+ }
+ }
+
+ if (parabotFont == null) {
+ parabotFont = new ParabotFont(fileName, size);
+ FONT_CACHE.add(parabotFont);
+ }
+
+ return parabotFont.getFont();
+ }
+}
diff --git a/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java b/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java
new file mode 100644
index 0000000..ebd3d5d
--- /dev/null
+++ b/src/main/java/org/parabot/core/ui/fonts/ParabotFont.java
@@ -0,0 +1,55 @@
+package org.parabot.core.ui.fonts;
+
+import java.awt.*;
+import java.io.IOException;
+
+/**
+ * @author Capslock
+ */
+public class ParabotFont {
+
+ private String location;
+ private Font font;
+
+ public ParabotFont(String location, float size) {
+ if (!location.toLowerCase().startsWith("/storage/fonts/")) {
+ location = "/storage/fonts/" + location;
+ }
+ this.location = location;
+
+ try {
+ this.font = createFont(size);
+ } catch (FontFormatException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private Font createFont(float size) throws IOException, FontFormatException {
+ return Font.createFont(Font.TRUETYPE_FONT, Fonts.class.getResourceAsStream(this.location)).deriveFont(size);
+ }
+
+ public float getSize() {
+ return font.getSize();
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public Font getFont() {
+ return font;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj != null) {
+ if (obj instanceof ParabotFont) {
+ ParabotFont otherFont = (ParabotFont) obj;
+ if (otherFont.getSize() == this.getSize()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/org/parabot/core/ui/images/trash.png b/src/main/java/org/parabot/core/ui/images/trash.png
new file mode 100644
index 0000000..53867b6
Binary files /dev/null and b/src/main/java/org/parabot/core/ui/images/trash.png differ
diff --git a/src/main/resources/storage/app.properties b/src/main/resources/storage/app.properties
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/fonts/leelawadee.ttf b/src/main/resources/storage/fonts/leelawadee.ttf
new file mode 100644
index 0000000..8d5e4b5
Binary files /dev/null and b/src/main/resources/storage/fonts/leelawadee.ttf differ
diff --git a/src/main/resources/storage/images/add.png b/src/main/resources/storage/images/add.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/background.png b/src/main/resources/storage/images/background.png
index fd302e3..34f1df9 100644
Binary files a/src/main/resources/storage/images/background.png and b/src/main/resources/storage/images/background.png differ
diff --git a/src/main/resources/storage/images/category/agility.png b/src/main/resources/storage/images/category/agility.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/combat.png b/src/main/resources/storage/images/category/combat.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/cooking.png b/src/main/resources/storage/images/category/cooking.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/crafting.png b/src/main/resources/storage/images/category/crafting.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/dungeoneering.png b/src/main/resources/storage/images/category/dungeoneering.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/farming.png b/src/main/resources/storage/images/category/farming.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/firemaking.png b/src/main/resources/storage/images/category/firemaking.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/fishing.png b/src/main/resources/storage/images/category/fishing.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/fletching.png b/src/main/resources/storage/images/category/fletching.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/herblore.png b/src/main/resources/storage/images/category/herblore.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/hunter.png b/src/main/resources/storage/images/category/hunter.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/magic.png b/src/main/resources/storage/images/category/magic.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/minigames.png b/src/main/resources/storage/images/category/minigames.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/mining.png b/src/main/resources/storage/images/category/mining.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/moneymaking.png b/src/main/resources/storage/images/category/moneymaking.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/other.png b/src/main/resources/storage/images/category/other.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/prayer.png b/src/main/resources/storage/images/category/prayer.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/runecrafting.png b/src/main/resources/storage/images/category/runecrafting.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/script.png b/src/main/resources/storage/images/category/script.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/slayer.png b/src/main/resources/storage/images/category/slayer.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/smithing.png b/src/main/resources/storage/images/category/smithing.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/thieving.png b/src/main/resources/storage/images/category/thieving.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/utility.png b/src/main/resources/storage/images/category/utility.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/category/woodcutting.png b/src/main/resources/storage/images/category/woodcutting.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/close.png b/src/main/resources/storage/images/close.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/close_red.png b/src/main/resources/storage/images/close_red.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/icon.png b/src/main/resources/storage/images/icon.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/login.png b/src/main/resources/storage/images/login.png
new file mode 100644
index 0000000..ef5014e
Binary files /dev/null and b/src/main/resources/storage/images/login.png differ
diff --git a/src/main/resources/storage/images/logo.png b/src/main/resources/storage/images/logo.png
new file mode 100644
index 0000000..fe40317
Binary files /dev/null and b/src/main/resources/storage/images/logo.png differ
diff --git a/src/main/resources/storage/images/para.png b/src/main/resources/storage/images/para.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/pause.png b/src/main/resources/storage/images/pause.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/run.png b/src/main/resources/storage/images/run.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/stop.png b/src/main/resources/storage/images/stop.png
old mode 100644
new mode 100755
diff --git a/src/main/resources/storage/images/trash.png b/src/main/resources/storage/images/trash.png
new file mode 100644
index 0000000..53867b6
Binary files /dev/null and b/src/main/resources/storage/images/trash.png differ