Merge pull request #6 from mrbesen/dev

Dev
This commit is contained in:
MrBesen 2017-11-26 20:08:40 +01:00 committed by GitHub
commit 1b1dff4799
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 196 additions and 53 deletions

View File

@ -37,20 +37,21 @@ public class Clicker implements Runnable{
private final int waittime = 50;//time between mouse teleports and clicks private final int waittime = 50;//time between mouse teleports and clicks
private int mincolordistance = 35; private int mincolordistance = 35;
private Overlay ov = null;
OSType os; private int alt_key;
long started = -1; long started = -1;
private void sleep( int ms) { private void sleep( int ms) {
//update ui //update ui
Main.get().ui.printTime((int) ( (System.currentTimeMillis()-started) / 1000 )); Main.get().ui.printTime((int) ( (System.currentTimeMillis()-started) / 1000 ));
if(skipbattle) if(skipbattle)
return; return;
try { try {
if(ms > 1000) { if(ms > 1000) {
Thread.sleep(1000); Thread.sleep(1000);//split the sleep time.
sleep(ms-1000); sleep(ms-1000);
} else } else
Thread.sleep(ms); Thread.sleep(ms);
@ -93,21 +94,15 @@ public class Clicker implements Runnable{
public void run() { public void run() {
sleep(1000);//chill ma sleep(1000);//chill ma
//determine os
String oss = System.getProperty("os.name").toLowerCase(); String oss = System.getProperty("os.name").toLowerCase();
if(oss.contains("nix") | oss.contains("nux") | oss.contains("aix")) alt_key = ( oss.contains("nix") | oss.contains("nux") | oss.contains("aix") | oss.contains("win") ? KeyEvent.VK_ALT : KeyEvent.VK_META);
os = OSType.Linux; //windows and linux have another alt key than mac, so lets determine the OS type, to determine the key code.
else if(oss.contains("win"))
os = OSType.Windows;
else if(oss.contains("mac"))
os = OSType.OSX;
else
Main.get().ui.info("OS not supported for backfocus: " + oss);
int card = 0; int card = 0;
try { try {
Robot rob = new Robot(); Robot rob = new Robot();
while(should_run) { while(should_run) {
Main.get().ui.info("Starting Battle.");
sleep(500); sleep(500);
clickL(rob, battle);//smash the start button clickL(rob, battle);//smash the start button
sleep(1000); sleep(1000);
@ -115,11 +110,11 @@ public class Clicker implements Runnable{
backfocus(rob); backfocus(rob);
//battle is starting up //battle is starting up
sleep(9000);//wait for the battle to start (loading screen) sleep(9000);//wait for the battle to start (loading screen)
Main.get().ui.info("Battle started.");
inbattle = true; inbattle = true;
float modifier = 1; float modifier = 1;
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
long lastwait = start;//actions like moving mouse and do stuff gets messured and subtracted of the wait's long lastwait = start;//actions like moving mouse and do stuff gets messured and subtracted of the wait's
Main.get().ui.info("Battle begins.");
while( ((System.currentTimeMillis() - start) / 6000) < 41 & should_run & !skipbattle) { while( ((System.currentTimeMillis() - start) / 6000) < 41 & should_run & !skipbattle) {
//check für ok-button //check für ok-button
@ -169,13 +164,13 @@ public class Clicker implements Runnable{
clickL(rob, end);//ok button clickL(rob, end);//ok button
backfocus(rob); backfocus(rob);
Main.get().ui.info("Battle ended."); Main.get().ui.info("Battle ended.");
sleep(9000);//9 sec-loading screen sleep(7000);//7 sec-loading screen
//checken, ob Arena wechsel pop-up //checken, ob Arena wechsel pop-up
while(checkOK(arena_switch, rob,arena_view) & should_run) { while(checkOK(arena_switch, rob,arena_view) & should_run) {
System.out.println("Arena found, clicking"); Main.get().ui.info("Arena found, clicking");
clickL(rob, arena_switch); clickL(rob, arena_switch);
backfocus(rob); backfocus(rob);
sleep(2000); sleep(2000);//wait 2 seconds
} }
} }
} catch (AWTException e) { } catch (AWTException e) {
@ -207,18 +202,14 @@ public class Clicker implements Runnable{
private void backfocus(Robot bot) { private void backfocus(Robot bot) {
if(backfocus) { if(backfocus) {
if(os == OSType.Windows | os == OSType.Linux)
bot.keyPress(KeyEvent.VK_ALT); bot.keyPress(alt_key);
else//osx / unsupported
bot.keyPress(KeyEvent.VK_META);
bot.keyPress(KeyEvent.VK_TAB); bot.keyPress(KeyEvent.VK_TAB);
sleep(waittime); sleep(waittime);
bot.keyRelease(KeyEvent.VK_TAB); bot.keyRelease(KeyEvent.VK_TAB);
if(os == OSType.Windows | os == OSType.Linux)
bot.keyRelease(KeyEvent.VK_ALT); bot.keyRelease(alt_key);
else//osx / unsupported
bot.keyRelease(KeyEvent.VK_META);
} }
} }
@ -286,18 +277,26 @@ public class Clicker implements Runnable{
return (end != null & battle != null); return (end != null & battle != null);
} }
/**
* Perform a Leftclick.
* @param b the Robot to use
* @param a the Position to click
*/
private void clickL(Robot b, Point a) { private void clickL(Robot b, Point a) {
if(!should_run) if(!should_run)
return; return;
Point old = getMouse(); Point old = getMouse();
b.mouseMove(a.x, a.y); b.mouseMove(a.x, a.y);
sleep(50); sleep(waittime);
clickL(b); clickL(b);
sleep(50);
b.mouseMove(old.x, old.y); b.mouseMove(old.x, old.y);
sleep(50); sleep(waittime);
} }
/**
* Perform a Leftclick
* @param b
*/
private void clickL(Robot b) {//40 ms delay private void clickL(Robot b) {//40 ms delay
b.mousePress(InputEvent.BUTTON1_MASK); b.mousePress(InputEvent.BUTTON1_MASK);
sleep(waittime); sleep(waittime);
@ -323,22 +322,22 @@ public class Clicker implements Runnable{
return false; return false;
//long start = System.currentTimeMillis(); //long start = System.currentTimeMillis();
int count = 0; int count = 0;
BufferedImage img = bot.createScreenCapture(new Rectangle(p.x-10, p.y-10, 20, 20));//smile BufferedImage img = bot.createScreenCapture(getRect(p.x, p.y));//smile
for (int x = 0; x < 20; x++) { for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < 20; y++) { for (int y = 0; y < img.getHeight(); y++) {
int color = img.getRGB(x, y); int color = img.getRGB(x, y);
int red = (color & 0x00ff0000) >> 16; int red = (color & 0x00ff0000) >> 16;
int green = (color & 0x0000ff00) >> 8; int green = (color & 0x0000ff00) >> 8;
int blue = color & 0x000000ff; int blue = color & 0x000000ff;
double distance = Math.sqrt(Math.pow((blue - goalcolor.getBlue()), 2) double distance = Math.sqrt(Math.pow((blue - goalcolor.getBlue()), 2)
+ Math.pow((red - goalcolor.getRed()), 2) + Math.pow((green - goalcolor.getGreen()), 2));//calculate the distance between the goalcolor and the test color + Math.pow((red - goalcolor.getRed()), 2) + Math.pow((green - goalcolor.getGreen()), 2));//calculate the distance between the goalcolor and the test color
if (distance < mincolordistance) if (distance < mincolordistance)
count++; count++;
} }
} }
// System.out.println("counts: " + count);//some performance checking System.out.println("counts: " + count);//some performance checking
return count > 70; return count > 4;//engough pixel have the right color
} }
public Point getMouse() { public Point getMouse() {
@ -374,7 +373,7 @@ public class Clicker implements Runnable{
arena_view = c; arena_view = c;
break; break;
} }
if(mincolordistance < minimumdistance) if(mincolordistance < minimumdistance)//enlarging mindistance
mincolordistance = minimumdistance; mincolordistance = minimumdistance;
System.out.println(colornum + ": "+c.getRed() + " " + c.getGreen() + " " + c.getBlue()); System.out.println(colornum + ": "+c.getRed() + " " + c.getGreen() + " " + c.getBlue());
} }
@ -388,10 +387,23 @@ public class Clicker implements Runnable{
paused = b; paused = b;
} }
private enum OSType { public static Rectangle getRect(int x, int y) {
Linux, return new Rectangle(x-2, y-2, 5, 5);
Windows, }
OSX,
unsupported public void toggleOverlay() {
if(ov == null) {
try {
ov = new Overlay();
ov.set(playout, cardslots, end, battle, arena_switch);
ov.init();
} catch(Exception e) {
System.out.println("Catched Exception, while inflateing Overlay: ");
e.printStackTrace();
}
} else {
ov.close();
ov = null;
}
} }
} }

View File

@ -0,0 +1,86 @@
package mrbesen.cr.auto.clicker;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class Overlay {
JFrame frame;
Point spawn;
Point cards[];
Point ok;
Point battle;
Point arenaview;
public Overlay() {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
if(frame != null) {
frame.dispose();
}
}
}, "Shutdownhook-Overlaycloser"));
}
void set(Point spawn, Point[] cards, Point ok, Point battle, Point arenaview) {
this.spawn = spawn;
this.cards = cards;
this.ok = ok;
this.battle = battle;
this.arenaview = arenaview;
}
public void init() {
frame = new JFrame("Bot Overlay");
frame.setUndecorated(true);
frame.setOpacity(0.5f);
int width=0, height=0;
int x=spawn.x,y=spawn.y;
for(Point p : getlist()) {
if(p != null) {
if(p.x < x) {
width += (x-p.x);//umsoviel weiter machen, wie nach links verschoben wird
x = p.x;
}
if(x+width < p.x) {
width += x+width-p.x;
}
if(p.y < y) {
height += (y-p.y);
y = p.y;
}
if(y+height < p.y) {
height += y+height-p.y;
}
}
}
frame.setSize(width, height);
frame.setLocation(x, y);
frame.setVisible(true);
Graphics gra = frame.getGraphics();
gra.setColor(new Color(255, 0, 0));//red
for(Point p : cards) {
if(p != null) {
gra.drawRect(p.x-1, p.y-1, 300, 300);
}
}
System.out.println("Overlay is da!");
}
public void close() {
frame.dispose();
}
private Point[] getlist() {
return new Point[] {spawn,ok,battle,arenaview, cards[0],cards[1],cards[2],cards[3]};
}
}

View File

@ -2,7 +2,6 @@ package mrbesen.cr.auto.clicker;
import java.awt.AWTException; import java.awt.AWTException;
import java.awt.Color; import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Robot; import java.awt.Robot;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Comparator; import java.util.Comparator;
@ -24,14 +23,14 @@ public class PosColSelector extends PosSelector {
try { try {
Robot rob = new Robot(); Robot rob = new Robot();
Point p = ui.bot.getMouse(); Point p = ui.bot.getMouse();
BufferedImage img = rob.createScreenCapture(new Rectangle(p.x-10, p.y-10, 20, 20)); BufferedImage img = rob.createScreenCapture(Clicker.getRect(p.x, p.y));
//calculate avg color; //calculate avg color;
int red = 0; int red = 0;
int green = 0; int green = 0;
int blue = 0; int blue = 0;
int count = 0; int count = 0;
for (int x = 0; x < 20; x++) { for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < 20; y++) { for (int y = 0; y < img.getHeight(); y++) {
int color = img.getRGB(x, y); int color = img.getRGB(x, y);
red += (color & 0x00ff0000) >> 16; red += (color & 0x00ff0000) >> 16;
green += (color & 0x0000ff00) >> 8; green += (color & 0x0000ff00) >> 8;
@ -46,8 +45,8 @@ public class PosColSelector extends PosSelector {
//calculate distances: //calculate distances:
List<Integer> dist = new LinkedList<Integer>(); List<Integer> dist = new LinkedList<Integer>();
for (int x = 0; x < 20; x++) { for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < 20; y++) { for (int y = 0; y < img.getHeight(); y++) {
int color = img.getRGB(x, y); int color = img.getRGB(x, y);
int redf = (color & 0x00ff0000) >> 16; int redf = (color & 0x00ff0000) >> 16;
int greenf = (color & 0x0000ff00) >> 8; int greenf = (color & 0x0000ff00) >> 8;
@ -72,7 +71,7 @@ public class PosColSelector extends PosSelector {
} }
}); });
int miniumdistance = dist.get(150);//at least the first 100 tests should fit int miniumdistance = dist.get((int) (dist.size()*0.3f));//at least the first third tests should fit
// int maximumdistance = dist.get(dist.size()-1); // int maximumdistance = dist.get(dist.size()-1);
System.out.println("minimum distance: " + miniumdistance ); System.out.println("minimum distance: " + miniumdistance );
ui.bot.setColor(c,colornum, miniumdistance); ui.bot.setColor(c,colornum, miniumdistance);

View File

@ -24,6 +24,7 @@ public class PosSelector implements Runnable {
@Override @Override
public void run() { public void run() {
button.setBackground(Color.MAGENTA);
try { try {
for(int i = 5; i > 0; i--) {//countdown for(int i = 5; i > 0; i--) {//countdown
ui.info(i + ""); ui.info(i + "");

View File

@ -42,6 +42,7 @@ public class UI implements ActionListener {
private JMenu file_ = new JMenu("File"); private JMenu file_ = new JMenu("File");
private JMenuItem load = new JMenuItem(); private JMenuItem load = new JMenuItem();
private JMenuItem save = new JMenuItem(); private JMenuItem save = new JMenuItem();
private JMenuItem new_ = new JMenuItem();
private AutoPlayBox autoplay = new AutoPlayBox(); private AutoPlayBox autoplay = new AutoPlayBox();
private JCheckBox doubleplace = new JCheckBox("DoublePlace"); private JCheckBox doubleplace = new JCheckBox("DoublePlace");
@ -62,6 +63,7 @@ public class UI implements ActionListener {
private JButton skip = new JButton("SKIP"); // the button, to skip waiting private JButton skip = new JButton("SKIP"); // the button, to skip waiting
private JButton pause = new JButton("Pause"); private JButton pause = new JButton("Pause");
private JButton exit = new JButton("EXIT"); private JButton exit = new JButton("EXIT");
private JButton overlay = new JButton("Overlay[Experimental]");
private JLabel info = new JLabel("Define positions, to start."); private JLabel info = new JLabel("Define positions, to start.");
private JLabel time = new JLabel("0 s"); private JLabel time = new JLabel("0 s");
@ -89,17 +91,21 @@ public class UI implements ActionListener {
public UI() { public UI() {
Main.get().ui = this; Main.get().ui = this;
//init screen //init screen
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(730, 180); frame.setSize(830,( System.getProperty("os.name").toLowerCase().contains("win") ? 220 : 180));//extra large for windows
save.setText("Save"); save.setText("Save");
save.addActionListener(this); save.addActionListener(this);
load.setText("Load"); load.setText("Load");
load.addActionListener(this); load.addActionListener(this);
new_.setText("New");
new_.addActionListener(this);
file_.add(save); file_.add(save);
file_.add(load); file_.add(load);
file_.add(new_);
menubar.add(file_); menubar.add(file_);
frame.setJMenuBar(menubar); frame.setJMenuBar(menubar);
@ -113,6 +119,7 @@ public class UI implements ActionListener {
start.addActionListener(this); start.addActionListener(this);
pause.addActionListener(this); pause.addActionListener(this);
exit.addActionListener(this); exit.addActionListener(this);
overlay.addActionListener(this);
doubleplace.addActionListener(this); doubleplace.addActionListener(this);
backfocus.addActionListener(this); backfocus.addActionListener(this);
@ -124,6 +131,7 @@ public class UI implements ActionListener {
middle.add(skip); middle.add(skip);
middle.add(pause); middle.add(pause);
middle.add(exit); middle.add(exit);
//middle.add(overlay);//added later
middle.add(autoplay); middle.add(autoplay);
middle.add(doubleplace); middle.add(doubleplace);
middle.add(backfocus); middle.add(backfocus);
@ -143,6 +151,28 @@ public class UI implements ActionListener {
frame.add(root);//create frame frame.add(root);//create frame
frame.setVisible(true); frame.setVisible(true);
//set tooltips
start.setToolTipText("Starts the Bot.");
skip.setToolTipText("Skips the current Action.(Waiting or beeing in a match, only usefull, when the bot miss clicked somewhere)");
pause.setToolTipText("Pauses the \"output\" of the Bot, but the internal states are still updated.");
exit.setToolTipText("Stops the Bot and closes the Window.");
overlay.setToolTipText("Enables a Overlay to visualize where the Bot trys to click.");
autoplay.setToolTipText("Enable or disable auto placement of cards.");
doubleplace.setToolTipText("Everytime the bot wants to play a card, he trys to play two cards at once.");
backfocus.setToolTipText("After each mouseclickaction the bot tryes to give the old window the focus back.");
slider[0].setToolTipText("the time the Bot waits between two crads.");
slider[1].setToolTipText("Give a value, how offset the playout place should be, to look more like a human player to the opponent and the game itself.");
posselctors[0].button.setToolTipText("Set the position for the \"Battle\"-Button.");
posselctors[1].button.setToolTipText("Set the position for the \"ok\"-Button at the end of a match. Be carefull, this also saves the color of the button to auto-detect it.");
posselctors[2].button.setToolTipText("Set the Position of Card 1");
posselctors[3].button.setToolTipText("Set the Position of Card 2");
posselctors[4].button.setToolTipText("Set the Position of Card 3");
posselctors[5].button.setToolTipText("Set the Position of Card 4");
posselctors[6].button.setToolTipText("Set the Position, where a Card should be placed. Leave it empty to use the same position as the \"Battle\" position.");
posselctors[7].button.setToolTipText("Set the position of the Close button, of the menue that po up, when you tap the arena. This one also saves the color of the position to auto detect it.");
} }
@Override @Override
@ -187,6 +217,8 @@ public class UI implements ActionListener {
info("Paused."); info("Paused.");
} }
bot.setPause(!bot.isPaused()); bot.setPause(!bot.isPaused());
} else if(srcb.equals(overlay)) {
bot.toggleOverlay();
} }
} else if(src instanceof JMenuItem) { } else if(src instanceof JMenuItem) {
JMenuItem srcI = (JMenuItem) src; JMenuItem srcI = (JMenuItem) src;
@ -194,6 +226,8 @@ public class UI implements ActionListener {
load(true); load(true);
} else if(srcI.equals(save)) { } else if(srcI.equals(save)) {
save(); save();
} else if(srcI.equals(new_)) {
new_();
} }
} else if(src instanceof JCheckBox) { } else if(src instanceof JCheckBox) {
JCheckBox srcb = (JCheckBox) src; JCheckBox srcb = (JCheckBox) src;
@ -282,6 +316,17 @@ public class UI implements ActionListener {
} }
} }
private void new_() {
int choose = JOptionPane.showConfirmDialog(null, "All of your setting are going to be lost, if you dont save it.", "Settings lost", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
if(choose == 2) {
info("canceled.");
return;
}
bot.stop();
bot = null;
bot = new Clicker();
}
public void refresh() { public void refresh() {
//check if all required positions are set //check if all required positions are set
// & set the colors // & set the colors