commit
a2ed881f40
@ -0,0 +1,4 @@ |
||||
/bin/ |
||||
export.jardesc |
||||
.project |
||||
.classpath |
@ -0,0 +1,215 @@ |
||||
package mrbesen.cr.auto.clicker; |
||||
|
||||
import java.awt.AWTException; |
||||
import java.awt.MouseInfo; |
||||
import java.awt.Robot; |
||||
import java.awt.event.InputEvent; |
||||
|
||||
public class Clicker implements Runnable{ |
||||
|
||||
private boolean running = false; |
||||
private boolean should_run = false; |
||||
private boolean inbattle = false; |
||||
private boolean skipbattle = false; |
||||
private Thread thread; |
||||
|
||||
private Point battle; |
||||
private Point end; |
||||
|
||||
private Point[] cardslots = new Point[4]; |
||||
private Point playout; |
||||
private boolean autoplay; |
||||
private boolean doubleplayout =false; |
||||
private int truppenwait = 2; |
||||
|
||||
public Clicker() { |
||||
} |
||||
|
||||
private void sleep( int ms) { |
||||
try { |
||||
Thread.sleep(ms); |
||||
} catch (InterruptedException e) {//when skip is applyed
|
||||
; |
||||
} |
||||
} |
||||
|
||||
public void start() { |
||||
should_run = true; |
||||
if(!running) { |
||||
running = true; |
||||
thread = new Thread(this, "BOT"); |
||||
thread.start(); |
||||
} |
||||
} |
||||
|
||||
public void stop() { |
||||
should_run = false; |
||||
while(running) { |
||||
thread.interrupt();//stop that shit (its maybe sleeping)
|
||||
} |
||||
} |
||||
|
||||
public void skip() { |
||||
if(isRunning()) |
||||
if(inbattle) |
||||
skipbattle = true; |
||||
|
||||
thread.interrupt(); |
||||
} |
||||
|
||||
public boolean isRunning() { |
||||
return running; |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
sleep(1000);//chill ma
|
||||
int card = 0; |
||||
try { |
||||
Robot rob = new Robot(); |
||||
while(should_run) { |
||||
clickL(rob, battle);//start knopf
|
||||
sleep(1000); |
||||
if(!should_run) |
||||
break; |
||||
clickL(rob, battle);//start knopf bestätigen
|
||||
//battle running
|
||||
sleep(9000);//wait for the battle to start (loading screen)
|
||||
Main.get().ui.info("Battle started."); |
||||
inbattle = true; |
||||
int modifier = 1; |
||||
long start = System.currentTimeMillis(); |
||||
long lastwait = start;//das delay der runde mit ein rechnen
|
||||
while( ((System.currentTimeMillis() - start) / 6000) < 41 & should_run & !skipbattle) { |
||||
if(((System.currentTimeMillis() - start) / 60000f) > 2) //speed up! (nach her durch 2 teilen)
|
||||
modifier = 2; |
||||
//try to play a round
|
||||
if(autoplay) { |
||||
playout(card, rob); |
||||
card = (card +1) % 4;//next
|
||||
if(doubleplayout) { |
||||
sleep(750); |
||||
playout(card, rob); |
||||
card = (card +1) % 4;//next
|
||||
} |
||||
} |
||||
// eingestellter wert (0.1 sec) ggf. durch 2 teilen vergangene zeit abziehen (zeit fürs setztem der letzten truppen)
|
||||
sleep((int) (((truppenwait * 100) / modifier) - (System.currentTimeMillis()- lastwait)));//chillen
|
||||
lastwait = System.currentTimeMillis(); |
||||
} |
||||
skipbattle = false; |
||||
inbattle = false; |
||||
Main.get().ui.info("Battle ended."); |
||||
|
||||
if(!should_run) |
||||
break; |
||||
clickL(rob, end);//ok knopf
|
||||
if(!should_run) |
||||
break; |
||||
sleep(10000);//10 sec-lade screen
|
||||
} |
||||
} catch (AWTException e) { |
||||
e.printStackTrace(); |
||||
} |
||||
running = false; |
||||
} |
||||
|
||||
private void playout(int card, Robot rob) { |
||||
if(cardslots[card] != null) {//card is selectable
|
||||
clickL(rob, cardslots[card]);//click on the card slot
|
||||
sleep(450); |
||||
if(playout != null)//a specified playout spot
|
||||
clickL(rob, playout);//click on the playout location
|
||||
else |
||||
clickL(rob, battle);//non specified playout spot
|
||||
} |
||||
} |
||||
|
||||
public void set(Point a, int num) { |
||||
if(num < 4) |
||||
cardslots[num] = a; |
||||
else if(num == 5) { |
||||
end = a; |
||||
Main.get().ui.refresh(); |
||||
} else if(num == 4) { |
||||
battle = a; |
||||
Main.get().ui.refresh(); |
||||
} else if(num == 6) |
||||
playout = a; |
||||
} |
||||
|
||||
public boolean isSet(int num) { |
||||
if(num < 0 ) throw new IllegalArgumentException("num >= 0 !"); |
||||
|
||||
return get(num) != null; |
||||
} |
||||
|
||||
private Point get(int num) { |
||||
if(num < 4) |
||||
return cardslots[num]; |
||||
else if(num == 5) |
||||
return end ; |
||||
else if(num == 4) |
||||
return battle; |
||||
else if(num == 6) |
||||
return playout; |
||||
|
||||
return null; |
||||
} |
||||
|
||||
public void setWait(int i) { |
||||
truppenwait = i; |
||||
} |
||||
|
||||
public void setDoublePlay(boolean a) { |
||||
doubleplayout = a; |
||||
} |
||||
|
||||
public void setAutoPlay(boolean a) { |
||||
autoplay = a; |
||||
} |
||||
|
||||
public boolean bothset() { |
||||
return (end != null & battle != null); |
||||
} |
||||
|
||||
private void clickL(Robot b, Point a) { |
||||
Point old = getMouse(); |
||||
b.mouseMove(a.x, a.y); |
||||
sleep(50); |
||||
clickL(b); |
||||
sleep(50); |
||||
b.mouseMove(old.x, old.y); |
||||
sleep(50); |
||||
} |
||||
|
||||
private void clickL(Robot b) {//40 ms delay
|
||||
b.mousePress(InputEvent.BUTTON1_MASK); |
||||
sleep(40); |
||||
b.mouseRelease(InputEvent.BUTTON1_MASK); |
||||
sleep(10); |
||||
} |
||||
|
||||
private int getMousex() { |
||||
return MouseInfo.getPointerInfo().getLocation().x; |
||||
} |
||||
private int getMousey() { |
||||
return MouseInfo.getPointerInfo().getLocation().y; |
||||
} |
||||
|
||||
public Point getMouse() { |
||||
return new Point(getMousex(), getMousey()); |
||||
} |
||||
|
||||
public String serialize() { |
||||
String out = ""; |
||||
for(int i = 0; i < 7; i++) { |
||||
Point p = get(i); |
||||
String ps = "null"; |
||||
if(p != null) |
||||
ps = p.serialize(); |
||||
out += i + " " + ps + "\n"; |
||||
} |
||||
return out.substring(0, out.length()-1); |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
package mrbesen.cr.auto.clicker; |
||||
|
||||
public class Main { |
||||
|
||||
private static Main main; |
||||
public UI ui; |
||||
|
||||
public static void main(String[] args) { |
||||
new Main(); |
||||
} |
||||
|
||||
public Main() { |
||||
main = this; |
||||
new UI(); |
||||
} |
||||
|
||||
public static Main get() { |
||||
return main; |
||||
} |
||||
} |
@ -0,0 +1,20 @@ |
||||
package mrbesen.cr.auto.clicker; |
||||
|
||||
public class Point { |
||||
|
||||
int x = 0, y = 0; |
||||
|
||||
public String serialize() { |
||||
return (x +"x"+y); |
||||
} |
||||
|
||||
public Point(String deserialize) { |
||||
String[] split = deserialize.split("x",2); |
||||
x = Integer.parseInt(split[0]); |
||||
y = Integer.parseInt(split[1]); |
||||
} |
||||
|
||||
public Point(int x, int y) { |
||||
this.x = x; this.y = y; |
||||
} |
||||
} |
@ -0,0 +1,44 @@ |
||||
package mrbesen.cr.auto.clicker; |
||||
|
||||
import java.awt.Color; |
||||
|
||||
import javax.swing.JButton; |
||||
|
||||
public class PosSelector implements Runnable { |
||||
|
||||
JButton button; |
||||
int num; |
||||
UI ui; |
||||
private boolean required; |
||||
|
||||
public PosSelector(UI ui, String text, boolean required, int num) { |
||||
this.ui = ui; this.required = required;this.num = num; |
||||
button = new JButton(text); |
||||
button.addActionListener(ui); |
||||
red(); |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
try { |
||||
for(int i = 5; i > 0; i--) {//countdown
|
||||
ui.info(i + ""); |
||||
Thread.sleep(1000); |
||||
} |
||||
} catch(InterruptedException e) {;} |
||||
ui.bot.set(ui.bot.getMouse(), num);//get and save the position
|
||||
ui.info("Position saved!"); |
||||
green(); |
||||
} |
||||
|
||||
public void green() { |
||||
button.setBackground(Color.GREEN); |
||||
} |
||||
|
||||
public void red() { |
||||
if(required) |
||||
button.setBackground(Color.RED); |
||||
else |
||||
button.setBackground(Color.ORANGE); |
||||
} |
||||
} |
@ -0,0 +1,237 @@ |
||||
package mrbesen.cr.auto.clicker; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.io.File; |
||||
import java.io.FileWriter; |
||||
import java.io.IOException; |
||||
import java.util.Scanner; |
||||
|
||||
import javax.swing.JButton; |
||||
import javax.swing.JCheckBox; |
||||
import javax.swing.JFrame; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JMenu; |
||||
import javax.swing.JMenuBar; |
||||
import javax.swing.JMenuItem; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JSlider; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
public class UI implements ActionListener, ChangeListener{ |
||||
|
||||
JFrame frame = new JFrame("Clash Royale Bot · by MrBesen");; |
||||
|
||||
JPanel root = new JPanel(); |
||||
JPanel top = new JPanel(); |
||||
JPanel bottom = new JPanel(); |
||||
JPanel slider = new JPanel(); |
||||
|
||||
JMenuBar menubar = new JMenuBar(); |
||||
JMenu file_ = new JMenu("File"); |
||||
JMenuItem load = new JMenuItem(); |
||||
JMenuItem save = new JMenuItem(); |
||||
|
||||
JCheckBox autoplay = new JCheckBox("AutoPlay"); |
||||
JCheckBox doubleplace = new JCheckBox("DoublePlace"); |
||||
|
||||
PosSelector[] posselctors = { |
||||
new PosSelector(this, "Battle",true, 4), |
||||
new PosSelector(this, "End Battle",true, 5), |
||||
new PosSelector(this, "Card1",false, 0), |
||||
new PosSelector(this, "Card2",false, 1), |
||||
new PosSelector(this, "Card3",false, 2), |
||||
new PosSelector(this, "Card4", false, 3), |
||||
new PosSelector(this, "Playout", false, 6) |
||||
}; |
||||
|
||||
JButton skip = new JButton("SKIP"); // the button, to skip waiting
|
||||
JButton start = new JButton("START"); |
||||
JButton exit = new JButton("EXIT"); |
||||
|
||||
JLabel info = new JLabel("Define positions, to start."); |
||||
|
||||
JSlider truppenwait = new JSlider(JSlider.HORIZONTAL, 1, 200, 180); |
||||
JLabel wait = new JLabel("18.0"); |
||||
|
||||
Clicker bot = new Clicker(); |
||||
|
||||
File file = new File(".profile"); |
||||
|
||||
public UI() { |
||||
Main.get().ui = this; |
||||
//init screen
|
||||
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); |
||||
frame.setSize(620, 140); |
||||
|
||||
save.setText("Save"); |
||||
save.addActionListener(this); |
||||
load.setText("Load"); |
||||
load.addActionListener(this); |
||||
|
||||
file_.add(save); |
||||
file_.add(load); |
||||
menubar.add(file_); |
||||
frame.setJMenuBar(menubar); |
||||
|
||||
skip.setEnabled(false); |
||||
start.setEnabled(false); |
||||
|
||||
doubleplace.setSelected(true); |
||||
|
||||
skip.addActionListener(this); |
||||
start.addActionListener(this); |
||||
exit.addActionListener(this); |
||||
autoplay.addActionListener(this); |
||||
doubleplace.addActionListener(this); |
||||
truppenwait.addChangeListener(this); |
||||
|
||||
for(PosSelector poss : posselctors) { |
||||
top.add(poss.button); |
||||
} |
||||
|
||||
bottom.add(start); |
||||
bottom.add(skip); |
||||
bottom.add(exit); |
||||
bottom.add(autoplay); |
||||
bottom.add(doubleplace); |
||||
bottom.add(info); |
||||
|
||||
slider.add(truppenwait); |
||||
slider.add(wait); |
||||
|
||||
root.add(top); |
||||
root.add(bottom); |
||||
root.add(slider); |
||||
|
||||
frame.add(root); |
||||
|
||||
frame.setVisible(true); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
Object src = e.getSource(); |
||||
if(src instanceof JButton) { |
||||
JButton srcb = (JButton) src; |
||||
|
||||
//check for the Posselectors
|
||||
for(PosSelector poss : posselctors) { |
||||
if(poss.button.equals(srcb)) { |
||||
new Thread(poss, "PositionSelector").start(); |
||||
break; |
||||
} |
||||
} |
||||
|
||||
if(srcb.equals(start)) { |
||||
if(bot.isRunning()) {//stop!
|
||||
bot.stop(); |
||||
srcb.setText("START"); |
||||
skip.setEnabled(false); |
||||
info("Stoped!"); |
||||
} else { |
||||
bot.start();//start!
|
||||
srcb.setText("STOP"); |
||||
skip.setEnabled(true); |
||||
info("Started!"); |
||||
} |
||||
} else if(srcb.equals(skip)) |
||||
bot.skip(); |
||||
else if(srcb.equals(exit)) { |
||||
bot.stop(); |
||||
frame.setVisible(false); |
||||
System.exit(0); |
||||
} |
||||
} else if(src instanceof JMenuItem) { |
||||
JMenuItem srcI = (JMenuItem) src; |
||||
if(srcI.equals(load)) { |
||||
load(true); |
||||
} else if(srcI.equals(save)) { |
||||
save(); |
||||
} |
||||
} else if(src instanceof JCheckBox) { |
||||
JCheckBox srcb = (JCheckBox) src; |
||||
if(srcb.equals(autoplay)) |
||||
bot.setAutoPlay(srcb.isSelected()); |
||||
else if(srcb.equals(doubleplace)) { |
||||
bot.setDoublePlay(srcb.isSelected()); |
||||
if(srcb.isSelected()) {//*2
|
||||
truppenwait.setValue(truppenwait.getValue()*2); |
||||
} else {// /2
|
||||
truppenwait.setValue(truppenwait.getValue()/2); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
Object o = e.getSource(); |
||||
if(o instanceof JSlider) { |
||||
JSlider slider = (JSlider) o; |
||||
if(slider.equals(truppenwait)) { |
||||
bot.setWait(slider.getValue()); |
||||
wait.setText(""+(slider.getValue()/10f)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void load(boolean info) { |
||||
if(file.exists()) { |
||||
try { |
||||
Scanner s = new Scanner(file); |
||||
while(s.hasNextLine()) { |
||||
String split[] = s.nextLine().split(" ",2); |
||||
if(!split[1].equals("null")) |
||||
bot.set(new Point(split[1]), Integer.parseInt(split[0])); |
||||
} |
||||
s.close(); |
||||
refresh(); |
||||
if(info) |
||||
info("loaded!"); |
||||
} catch(IOException | NumberFormatException e) { |
||||
e.printStackTrace(); |
||||
if(info) |
||||
info("Error."); |
||||
} |
||||
} else |
||||
if(info) |
||||
info("no profile found."); |
||||
} |
||||
|
||||
private void save() { |
||||
try { |
||||
if(!file.exists()) |
||||
file.createNewFile(); |
||||
|
||||
FileWriter fw = new FileWriter(file); |
||||
fw.write(bot.serialize()); |
||||
fw.flush(); |
||||
fw.close(); |
||||
|
||||
info("saved!"); |
||||
} catch(IOException e) { |
||||
e.printStackTrace(); |
||||
info("Error."); |
||||
} |
||||
} |
||||
|
||||
public void refresh() { |
||||
if(bot.bothset()) |
||||
start.setEnabled(true); |
||||
|
||||
for(PosSelector poss : posselctors) { |
||||
if(bot.isSet(poss.num)) |
||||
poss.green(); |
||||
else |
||||
poss.red(); |
||||
} |
||||
} |
||||
|
||||
public void info(String a) { |
||||
info.setText(a); |
||||
} |
||||
|
||||
|
||||
} |
Loading…
Reference in new issue