diff --git a/.gitignore b/.gitignore index a032d03..2363dc6 100644 --- a/.gitignore +++ b/.gitignore @@ -121,4 +121,5 @@ parabotv2 releases ._* -Test.java \ No newline at end of file +Test.java +*.DS_Store \ No newline at end of file diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 index bc75f96..8d585f9 --- a/pom.xml +++ b/pom.xml @@ -96,6 +96,17 @@ + + maven-resources-plugin + 2.5 + + UTF-8 + + ttf + + + + org.apache.maven.plugins maven-compiler-plugin 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/ui/ServerSelector.java b/src/main/java/org/parabot/core/ui/ServerSelector.java old mode 100644 new mode 100755 index 2731890..46e1802 --- a/src/main/java/org/parabot/core/ui/ServerSelector.java +++ b/src/main/java/org/parabot/core/ui/ServerSelector.java @@ -42,7 +42,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 +66,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/VerboseLoader.java b/src/main/java/org/parabot/core/ui/components/VerboseLoader.java old mode 100644 new mode 100755 index 9ab8c70..5cce1a0 --- 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,291 @@ 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 */ 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() { - /** - * Updates the status message and repaints the panel - * @param message - */ - public static void setState(final String message) { - state = message; - current.repaint(); - } + @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); + } + } - @Override - public void onProgressUpdate(double value) { - progressBar.setValue(value); - this.repaint(); - } + }); - @Override - public void updateDownloadSpeed(double mbPerSecond) { - progressBar.setText(String.format("(%.2fMB/s)", mbPerSecond)); - } + 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()); + } + + 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, 0, this.getWidth(), 0)); + g.draw(new Line2D.Float(0, 0, 0, 120)); + g.draw(new Line2D.Float(0, 120, this.getWidth(), 120)); + g.draw(new Line2D.Float(this.getWidth() - 6, 0, this.getWidth() - 6, 120)); + + 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.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.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(new Font("Times New Roman", Font.PLAIN, 14)); + 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)); + } } 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/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