Created
April 25, 2012 21:35
-
-
Save TheBatScripts/2493660 to your computer and use it in GitHub Desktop.
dtmfinder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.awt.Color; | |
| import java.awt.Component; | |
| import java.awt.Container; | |
| import java.awt.Dimension; | |
| import java.awt.Font; | |
| import java.awt.Graphics; | |
| import java.awt.GridBagConstraints; | |
| import java.awt.GridBagLayout; | |
| import java.awt.Insets; | |
| import java.awt.Point; | |
| import java.awt.Rectangle; | |
| import java.awt.Toolkit; | |
| import java.awt.datatransfer.Clipboard; | |
| import java.awt.datatransfer.StringSelection; | |
| import java.awt.event.ActionEvent; | |
| import java.awt.event.ActionListener; | |
| import java.awt.event.MouseEvent; | |
| import java.awt.event.MouseListener; | |
| import java.awt.event.WindowAdapter; | |
| import java.awt.event.WindowEvent; | |
| import java.util.ArrayList; | |
| import javax.swing.JButton; | |
| import javax.swing.JFrame; | |
| import javax.swing.JLabel; | |
| import javax.swing.JTextField; | |
| import javax.swing.border.Border; | |
| import javax.swing.border.LineBorder; | |
| import org.runedream.api.Script; | |
| import org.runedream.api.ScriptManifest; | |
| import org.runedream.api.methods.Game; | |
| @ScriptManifest(authors = { "battleguard" }, name = "DTM builder", version = 1.0, description = "getColors", keywords = {}, language = { | |
| true, true, true, true }) | |
| public class getColors extends Script implements MouseListener { | |
| private static boolean flash = false; | |
| public boolean onStart() { | |
| java.awt.EventQueue.invokeLater(new Runnable() { | |
| public void run() { | |
| new GUI(); | |
| } | |
| }); | |
| return true; | |
| } | |
| public int loop() { | |
| flash = !flash; | |
| return 1000; | |
| } | |
| private ArrayList<Rectangle> DTMloc = new ArrayList<Rectangle>(); | |
| public void findDTMS(final int tol) { | |
| DTMloc.clear(); | |
| final Point minPoint = new Point(800, 600); | |
| final Point maxPoint = new Point(0, 0); | |
| for(int i = 0; i < colorB.size(); i++) { | |
| if(colorB.get(i).loc.x < minPoint.x) minPoint.x = colorB.get(i).loc.x; | |
| if(colorB.get(i).loc.x > maxPoint.x) maxPoint.x = colorB.get(i).loc.x; | |
| if(colorB.get(i).loc.y < minPoint.y) minPoint.y = colorB.get(i).loc.y; | |
| if(colorB.get(i).loc.y > maxPoint.y) maxPoint.y = colorB.get(i).loc.y; | |
| } | |
| Rectangle box = new Rectangle(minPoint.x, minPoint.y, (maxPoint.x - minPoint.x) + 1, (maxPoint.y - minPoint.y) + 1); | |
| // Check every point on screen for first color in the colorB array | |
| for(int x = 0; x < Game.getCanvasSize().width; x++) { | |
| for(int y = 0; y < Game.getCanvasSize().getHeight(); y++) { | |
| if(checkColor(Game.getColorAt(x, y), colorB.get(0).rgb, tol)) { | |
| final Rectangle curbox = new Rectangle(x - (colorB.get(0).loc.x - box.x), y - (colorB.get(0).loc.y - box.y), box.width, box.height); | |
| // Make sure we dont find multiple instances of same DTM | |
| if(!DTMloc.isEmpty()) { | |
| boolean found = false; | |
| for(int i = 0; i < DTMloc.size(); i++) { | |
| if(curbox.intersects(DTMloc.get(i))) found = true; | |
| } | |
| if(found) break; | |
| } | |
| if(checkColorPoints(new Point(x, y), tol)) { | |
| DTMloc.add(curbox); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| * | |
| * @param locM : location of point that matches the first color in the array list colorB | |
| * @return true if all colors match | |
| */ | |
| private boolean checkColorPoints(Point locM, int Tol) { | |
| try { | |
| final Point locI = colorB.get(0).loc; | |
| for(int i = 0; i < colorB.size(); i++) { | |
| final Color initialColor = colorB.get(i).rgb; | |
| final Point initialColorPoint = colorB.get(i).loc; | |
| final int xshift = initialColorPoint.x - locI.x; | |
| final int yshift = initialColorPoint.y - locI.y; | |
| final Point pointToCheck = new Point(locM.x + xshift, locM.y + yshift); | |
| final Color colorToCheck = Game.getColorAt(pointToCheck); | |
| if(!checkColor(initialColor, colorToCheck, Tol)) return false; | |
| } | |
| return true; | |
| } catch (Exception e) { | |
| return false; | |
| } | |
| } | |
| private boolean checkColor(final Color c, final Color c2, final int Tol) { | |
| return (checkColor(c.getRed(), c2.getRed(), Tol) | |
| && checkColor(c.getGreen(), c2.getGreen(), Tol) && checkColor(c.getBlue(), | |
| c2.getBlue(), Tol)); | |
| } | |
| private boolean checkColor(final int RGB, final int Val, final int Tol) { | |
| return Math.abs(RGB - Val) < Tol; | |
| } | |
| @Override | |
| public void onRepaint(Graphics g) { | |
| if(curBox == null) return; | |
| g.setColor(Color.BLACK); | |
| g.fillRect(10, 350, 200, 45); | |
| g.setColor(Color.WHITE); | |
| g.drawString("x:" + curBox.loc.x +"y: " + curBox.loc.y, 20, 370); | |
| g.drawString("r:" + curBox.rgb.getRed() +" g: " +curBox.rgb.getGreen() + " b: " + curBox.rgb.getBlue(), 20, 390); | |
| g.setColor(curBox.rgb); | |
| g.fillRect(10, 400, 50, 50); | |
| for(int x = 0; x < colors.length; x++) { | |
| for(int y = 0; y < colors.length; y++) { | |
| ColorBox c = colors[x][y]; | |
| g.setColor(c.rgb); | |
| g.fillRect(c.box.x, c.box.y, c.box.width, c.box.height); | |
| } | |
| } | |
| g.setColor(Color.RED); | |
| g.drawRect(colors[0][0].loc.x -1, colors[0][0].loc.y -1, 14, 14); | |
| if(flash) { | |
| g.fillRect(curBox.box.x, curBox.box.y, curBox.box.width, curBox.box.height); | |
| g.fillRect(curBox.loc.x, curBox.loc.y, 1, 1); | |
| if(!colorB.isEmpty()) { | |
| for(int i = 1; i < colorB.size(); i++) { | |
| g.drawLine(colorB.get(0).loc.x, colorB.get(0).loc.y, colorB.get(i).loc.x, colorB.get(i).loc.y); | |
| } | |
| } | |
| } | |
| if(!DTMloc.isEmpty()) { | |
| drawDTMSquares(g, Color.GREEN.brighter()); | |
| } | |
| } | |
| public void drawDTMSquares(Graphics g, final Color c) { | |
| g.setColor(c); | |
| for(int i = 0; i < DTMloc.size(); i++) { | |
| Rectangle dtm = DTMloc.get(i); | |
| g.drawRect(dtm.x, dtm.y, dtm.width, dtm.height); | |
| g.drawString("dtm" + i, dtm.x + dtm.width - 30, dtm.y + dtm.height + 10); | |
| } | |
| } | |
| private static Point loc = new Point(0, 0); | |
| public class ColorBox { | |
| private Color rgb; | |
| private Point loc; | |
| private Rectangle box; | |
| public ColorBox(Color color, Point loc, Rectangle rectangle) { | |
| this.rgb = color; | |
| this.loc = loc; | |
| this.box = rectangle; | |
| } | |
| public boolean checkBox(final Point cursor) { | |
| return box.contains(cursor); | |
| } | |
| } | |
| final Rectangle drawbox = new Rectangle(280, 330, 130, 130); | |
| ColorBox[][] colors = new ColorBox[13][13]; | |
| ColorBox curBox; | |
| Color[][] gameScache = null; | |
| @Override | |
| public void mouseClicked(MouseEvent e) { | |
| loc = e.getPoint(); | |
| if(drawbox.contains(loc)) { | |
| for(int y = 0; y < colors.length; y++) { | |
| for(int x = 0; x < colors.length; x++) { | |
| if(colors[x][y].checkBox(loc)) { | |
| loc = colors[x][y].loc; | |
| break; | |
| } | |
| } | |
| } | |
| } else { | |
| gameScache = Game.getColors(); | |
| } | |
| updateDrawBox(); | |
| } | |
| //13x13 | |
| public void updateDrawBox() { | |
| for(int y = 0; y < colors.length; y++) { | |
| for(int x = 0; x < colors.length; x++) { | |
| final Point curpoint = new Point(loc.x + x - 6, loc.y + y - 6); | |
| //final Color curcolor = Game.getColorAt(curpoint); | |
| final Color curcolor = gameScache[curpoint.x][curpoint.y]; | |
| final Rectangle currectangle = new Rectangle(280 + (x*10), 330 + (y*10), 10, 10); | |
| colors[x][y] = new ColorBox(curcolor, curpoint, currectangle); | |
| } | |
| } | |
| curBox = colors[6][6]; | |
| } | |
| private ArrayList<JTextField> pointT = new ArrayList<JTextField>(); | |
| private ArrayList<JTextField> colorT = new ArrayList<JTextField>(); | |
| private ArrayList<JButton> selectB = new ArrayList<JButton>(); | |
| private ArrayList<JButton> removeB = new ArrayList<JButton>(); | |
| private ArrayList<ColorBox> colorB = new ArrayList<ColorBox>(); | |
| public class GUI extends JFrame { | |
| private static final long serialVersionUID = 1L; | |
| private final JLabel headerL = new JLabel("Point & Color Grabber ", JLabel.CENTER); | |
| private JLabel tolL = new JLabel("Color Tolerance", JLabel.RIGHT); | |
| private final JButton addB = new JButton("Add Current Color"); | |
| private final JButton clearB = new JButton("Clear All"); | |
| private final JButton copyB = new JButton("Copy all to clipboard"); | |
| private final JButton findB = new JButton("Find DTMS"); | |
| private JTextField tolT = new JTextField("20"); | |
| private final Font normalFont = new Font("Book antiqua", Font.PLAIN, 16); | |
| // GUI COMPONENTS | |
| GridBagConstraints c; | |
| Container pane; | |
| // HELPER METHODS | |
| // Make fonts look nice | |
| void setFonts(Font font, Component... comps) { | |
| for (Component curcomp : comps) { | |
| curcomp.setFont(font); | |
| } | |
| } | |
| // add borders to components | |
| void addBorder(JLabel... lbls) { | |
| final Border border = LineBorder.createGrayLineBorder(); | |
| for (JLabel lbl : lbls) { | |
| lbl.setBorder(border); | |
| } | |
| } | |
| // easy placement of panels | |
| void addToGrid(Component comp, int gridx, int gridy, int gridwidth, | |
| double weightx) { | |
| c.gridx = gridx; | |
| c.gridy = gridy; | |
| c.gridwidth = gridwidth; | |
| c.weightx = weightx; | |
| pane.add(comp, c); | |
| } | |
| // easy placement of panels | |
| void getSelected() { | |
| for(int i = 0; i < pointT.size(); i++) { | |
| } | |
| } | |
| void makeGUI() { | |
| pane.removeAll(); | |
| pane.setPreferredSize(new Dimension(400, 160 + (selectB.size() * 70))); | |
| addToGrid(headerL, 0, 0, 3, 1.0); | |
| addToGrid(addB, 0, 1, 1, .5); | |
| addToGrid(clearB, 1, 1, 2, .5); | |
| addToGrid(findB, 0, 2, 1, 0.5); | |
| addToGrid(tolL, 1, 2, 1, 0.40); | |
| addToGrid(tolT, 2, 2, 1, 0.60); | |
| addToGrid(copyB, 0, 3, 3, 1.0); | |
| for(int i = 0; i < selectB.size(); i++) { | |
| selectB.get(i).setText("Select Point " + i); | |
| removeB.get(i).setText("Remove Point " + i); | |
| pointT.get(i).setText("Point p" + i + "= new Point(" + colorB.get(i).loc.x + ", " + colorB.get(i).loc.y + ");"); | |
| colorT.get(i).setText("Color c" + i + " = new Color( " + colorB.get(i).rgb.getRed() + ", " + colorB.get(i).rgb.getGreen() + ", " + colorB.get(i).rgb.getBlue() + ");"); | |
| addToGrid(selectB.get(i), 0, (4+ (i*2)), 1, 0.5); | |
| addToGrid(pointT.get(i), 1, (4+ (i*2)), 2, 0.5); | |
| addToGrid(removeB.get(i), 0, (5+ (i*2)), 1, 0.5); | |
| addToGrid(colorT.get(i), 1, (5+ (i*2)), 2, 0.5); | |
| } | |
| getContentPane().add(pane); | |
| pack(); | |
| setVisible(true); | |
| } | |
| public GUI() { | |
| super("Points and Color Grabber"); | |
| addBorder(headerL); | |
| setFonts(normalFont, headerL); | |
| pane = new Container(); | |
| pane.setLayout(new GridBagLayout()); | |
| c = new GridBagConstraints(); | |
| c.fill = GridBagConstraints.HORIZONTAL; | |
| c.ipady = c.ipadx = 3; | |
| c.insets = new Insets(5, 5, 5, 5); | |
| setLocationRelativeTo(getOwner()); | |
| makeGUI(); | |
| addWindowListener(new WindowAdapter() { | |
| public void windowClosing(WindowEvent e) { | |
| dispose(); | |
| } | |
| }); | |
| clearB.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| DTMloc.clear(); | |
| selectB.clear(); | |
| removeB.clear(); | |
| pointT.clear(); | |
| colorT.clear(); | |
| colorB.clear(); | |
| makeGUI(); | |
| } | |
| }); | |
| findB.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| findDTMS(Integer.parseInt(tolT.getText())); | |
| } | |
| }); | |
| copyB.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| String pointS = "Point[] DTM_PTS = {"; | |
| String colorS = "Color[] DTM_RGB = {"; | |
| for(int i = 0; i < pointT.size(); i++) { | |
| pointS += " new Point( " + colorB.get(i).loc.x + ", " + colorB.get(i).loc.y + "),"; | |
| colorS += " new Color( " + colorB.get(i).rgb.getRed() + ", " + colorB.get(i).rgb.getGreen() + ", " + colorB.get(i).rgb.getBlue() + "),"; | |
| } | |
| pointS = pointS.substring(0, pointS.length() - 1); | |
| colorS = colorS.substring(0, colorS.length() - 1); | |
| pointS += "};"; | |
| colorS += "};"; | |
| String finalS = pointS + "\n" + colorS + "\nDTM dtm1 = new DTM(DTM_PTS, DTM_RGB);"; | |
| Toolkit toolkit = Toolkit.getDefaultToolkit(); | |
| Clipboard clipboard = toolkit.getSystemClipboard(); | |
| StringSelection strSel = new StringSelection(finalS); | |
| clipboard.setContents(strSel, null); | |
| } | |
| }); | |
| addB.addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| colorB.add(curBox); | |
| selectB.add(new JButton()); | |
| removeB.add(new JButton()); | |
| pointT.add(new JTextField()); | |
| colorT.add(new JTextField()); | |
| selectB.get(selectB.size() - 1).addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| for(int i = 0; i < selectB.size(); i++) { | |
| if(e.getSource().equals(selectB.get(i))) { | |
| loc = colorB.get(i).loc; | |
| updateDrawBox(); | |
| } | |
| } | |
| } | |
| }); | |
| removeB.get(removeB.size() - 1).addActionListener(new ActionListener() { | |
| @Override | |
| public void actionPerformed(ActionEvent e) { | |
| for(int i = 0; i < removeB.size(); i++) { | |
| if(e.getSource().equals(removeB.get(i))) { | |
| colorB.remove(i); | |
| selectB.remove(i); | |
| removeB.remove(i); | |
| pointT.remove(i); | |
| colorT.remove(i); | |
| makeGUI(); | |
| } | |
| } | |
| } | |
| }); | |
| makeGUI(); | |
| } | |
| }); | |
| } | |
| } | |
| @Override | |
| public void mouseEntered(MouseEvent e) {} | |
| @Override | |
| public void mouseExited(MouseEvent e) {} | |
| @Override | |
| public void mousePressed(MouseEvent e) {} | |
| @Override | |
| public void mouseReleased(MouseEvent e) {} | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment