2017-03-09 16:08:47 +01:00
package mrbesen.cr.auto.clicker ;
2017-05-09 10:32:08 +02:00
import java.awt.Color ;
2017-03-09 16:08:47 +01:00
import java.awt.event.ActionEvent ;
import java.awt.event.ActionListener ;
import java.io.File ;
import java.io.FileWriter ;
import java.io.IOException ;
2017-04-04 14:51:28 +02:00
import java.math.BigDecimal ;
2017-03-09 16:08:47 +01:00
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 ;
2017-04-07 09:21:52 +02:00
import com.sun.istack.internal.Nullable ;
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
public class UI implements ActionListener {
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
private boolean isSelectionRunning = false ; //true if an selection Thread is working,
private JFrame frame = new JFrame ( " Clash Royale Bot · by MrBesen " ) ; ;
private JPanel root = new JPanel ( ) ;
private JPanel top = new JPanel ( ) ;
private JPanel bottom = new JPanel ( ) ;
2017-04-04 14:51:28 +02:00
//JPanel slider = new JPanel();
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
private JMenuBar menubar = new JMenuBar ( ) ;
private JMenu file_ = new JMenu ( " File " ) ;
private JMenuItem load = new JMenuItem ( ) ;
private JMenuItem save = new JMenuItem ( ) ;
private AutoPlayBox autoplay = new AutoPlayBox ( ) ;
private JCheckBox doubleplace = new JCheckBox ( " DoublePlace " ) ;
2017-05-28 20:48:26 +02:00
private JCheckBox backfocus = new JCheckBox ( " BackFocus " ) ;
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
private PosSelector [ ] posselctors = {
2017-03-09 16:08:47 +01:00
new PosSelector ( this , " Battle " , true , 4 ) ,
2017-05-09 10:32:08 +02:00
new PosColSelector ( this , " End Battle " , true , 5 , 0 ) ,
2017-03-09 16:08:47 +01:00
new PosSelector ( this , " Card1 " , false , 0 ) ,
new PosSelector ( this , " Card2 " , false , 1 ) ,
new PosSelector ( this , " Card3 " , false , 2 ) ,
new PosSelector ( this , " Card4 " , false , 3 ) ,
2017-04-27 23:27:18 +02:00
new PosSelector ( this , " Playout " , false , 6 ) ,
2017-05-09 10:32:08 +02:00
new PosColSelector ( this , " Arena View " , false , 7 , 1 )
2017-03-09 16:08:47 +01:00
} ;
2017-04-07 09:21:52 +02:00
private JButton start = new JButton ( " START " ) ;
2017-05-28 19:59:09 +02:00
private JButton skip = new JButton ( " SKIP " ) ; // the button, to skip waiting
private JButton pause = new JButton ( " Pause " ) ;
2017-04-07 09:21:52 +02:00
private JButton exit = new JButton ( " EXIT " ) ;
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
private JLabel info = new JLabel ( " Define positions, to start. " ) ;
2017-03-09 16:08:47 +01:00
2017-04-07 09:21:52 +02:00
private Slider [ ] slider = {
new Slider ( " Waittime: " , " s " , 1 , 300 , 180 , - 1 , null , new Updater ( ) {
@Override
public void update ( int nummber ) {
bot . setWait ( nummber ) ;
}
} , false ) ,
new Slider ( " Radius of Placement: " , " px " , 0 , 40 , 15 , 0 , null , new Updater ( ) {
@Override
public void update ( int nummber ) {
bot . setRandmones ( nummber ) ;
}
} , false )
2017-04-04 14:51:28 +02:00
} ;
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
Clicker bot = new Clicker ( ) ;
2017-04-07 09:21:52 +02:00
private File file = new File ( " .profile " ) ;
2017-03-09 16:08:47 +01:00
public UI ( ) {
Main . get ( ) . ui = this ;
//init screen
frame . setDefaultCloseOperation ( JFrame . DO_NOTHING_ON_CLOSE ) ;
2017-05-09 10:32:08 +02:00
frame . setSize ( 730 , 180 ) ;
2017-03-09 16:08:47 +01:00
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 ) ;
2017-04-04 14:51:28 +02:00
doubleplace . setSelected ( true ) ;
2017-04-01 21:22:13 +02:00
doubleplace . setEnabled ( false ) ;
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
skip . addActionListener ( this ) ;
start . addActionListener ( this ) ;
2017-05-28 20:02:55 +02:00
pause . addActionListener ( this ) ;
2017-03-09 16:08:47 +01:00
exit . addActionListener ( this ) ;
doubleplace . addActionListener ( this ) ;
2017-05-28 20:48:26 +02:00
backfocus . addActionListener ( this ) ;
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
for ( PosSelector poss : posselctors ) {
top . add ( poss . button ) ;
}
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
bottom . add ( start ) ;
bottom . add ( skip ) ;
2017-05-28 20:02:55 +02:00
bottom . add ( pause ) ;
2017-03-09 16:08:47 +01:00
bottom . add ( exit ) ;
bottom . add ( autoplay ) ;
bottom . add ( doubleplace ) ;
2017-05-28 20:48:26 +02:00
bottom . add ( backfocus ) ;
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
root . add ( top ) ;
root . add ( bottom ) ;
2017-04-07 09:21:52 +02:00
2017-05-28 20:48:26 +02:00
root . add ( info ) ;
2017-04-04 14:51:28 +02:00
for ( Slider s : slider ) {
root . add ( s ) ;
}
2017-04-07 09:21:52 +02:00
2017-03-09 16:08:47 +01:00
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 ) ) {
2017-04-07 09:21:52 +02:00
if ( ! isSelectionRunning )
new Thread ( poss , " PositionSelector " ) . start ( ) ;
2017-03-09 16:08:47 +01:00
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 ) ;
2017-05-28 19:59:09 +02:00
} else if ( srcb . equals ( pause ) ) {
if ( bot . isPaused ( ) ) { //the bot is going to be unpaused
pause . setText ( " Pause " ) ;
info ( " Unpaused. " ) ;
} else { //the bot is going to be paused.
pause . setText ( " Unpause " ) ;
info ( " Paused. " ) ;
}
bot . setPause ( ! bot . isPaused ( ) ) ;
2017-03-09 16:08:47 +01:00
}
} 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 ;
2017-04-07 09:21:52 +02:00
if ( srcb . equals ( doubleplace ) ) {
2017-03-09 16:08:47 +01:00
bot . setDoublePlay ( srcb . isSelected ( ) ) ;
if ( srcb . isSelected ( ) ) { //*2
2017-04-04 14:51:28 +02:00
slider [ 0 ] . setValue ( slider [ 0 ] . getValue ( ) * 2 ) ;
2017-03-09 16:08:47 +01:00
} else { // /2
2017-04-04 14:51:28 +02:00
slider [ 0 ] . setValue ( slider [ 0 ] . getValue ( ) / 2 ) ;
2017-03-09 16:08:47 +01:00
}
2017-05-28 20:48:26 +02:00
} else if ( srcb . equals ( backfocus ) ) {
bot . toggleBackfocus ( ) ;
2017-03-09 16:08:47 +01:00
}
}
}
private void load ( boolean info ) {
if ( file . exists ( ) ) {
try {
Scanner s = new Scanner ( file ) ;
while ( s . hasNextLine ( ) ) {
2017-05-09 10:32:08 +02:00
String split [ ] = s . nextLine ( ) . split ( " " ) ;
2017-04-01 21:22:13 +02:00
if ( ! split [ 1 ] . equals ( " null " ) ) {
int num = Integer . parseInt ( split [ 0 ] ) ;
2017-04-07 09:21:52 +02:00
if ( num > 100 ) { //special settings (slider / checkboxes)
2017-04-01 21:22:13 +02:00
if ( num = = 101 ) { //truppenwait
int wait = Integer . parseInt ( split [ 1 ] ) ;
2017-04-04 14:51:28 +02:00
slider [ 0 ] . setValue ( wait ) ;
2017-04-01 21:22:13 +02:00
} else if ( num = = 102 ) { // double playout
boolean dp = Boolean . parseBoolean ( split [ 1 ] ) ;
2017-04-07 09:21:52 +02:00
if ( dp )
autoplay . setSelected ( true ) ;
2017-04-01 21:22:13 +02:00
doubleplace . setSelected ( dp ) ;
2017-04-07 09:21:52 +02:00
bot . setDoublePlay ( dp ) ;
} else if ( num = = 103 ) {
slider [ 1 ] . setValue ( Integer . parseInt ( split [ 1 ] ) ) ;
2017-05-09 10:32:08 +02:00
} else if ( num = = 104 ) {
Color c = new Color ( Integer . parseInt ( split [ 1 ] ) , Integer . parseInt ( split [ 2 ] ) , Integer . parseInt ( split [ 3 ] ) ) ;
2017-05-26 09:28:53 +02:00
bot . setColor ( c , 1 , 35 ) ;
2017-05-09 10:32:08 +02:00
} else if ( num = = 105 ) {
Color c = new Color ( Integer . parseInt ( split [ 1 ] ) , Integer . parseInt ( split [ 2 ] ) , Integer . parseInt ( split [ 3 ] ) ) ;
2017-05-26 09:28:53 +02:00
bot . setColor ( c , 0 , 35 ) ;
2017-04-01 21:22:13 +02:00
}
2017-04-07 09:21:52 +02:00
} else //standard Point Obj.
2017-04-01 21:22:13 +02:00
bot . set ( new Point ( split [ 1 ] ) , num ) ;
}
2017-03-09 16:08:47 +01:00
}
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 ) ;
2017-05-09 10:32:08 +02:00
fw . write ( bot . serialize ( ) + " \ n101 " + slider [ 0 ] . getValue ( ) + " \ n102 " + doubleplace . isSelected ( ) + " \ n103 " + slider [ 1 ] . getValue ( ) ) ;
2017-03-09 16:08:47 +01:00
fw . flush ( ) ;
fw . close ( ) ;
info ( " saved! " ) ;
} catch ( IOException e ) {
e . printStackTrace ( ) ;
info ( " Error. " ) ;
}
}
public void refresh ( ) {
2017-05-28 20:48:26 +02:00
//check if all required positions are set
// & set the colors
boolean allset = true ;
2017-03-09 16:08:47 +01:00
for ( PosSelector poss : posselctors ) {
if ( bot . isSet ( poss . num ) )
poss . green ( ) ;
2017-05-28 20:48:26 +02:00
else {
2017-03-09 16:08:47 +01:00
poss . red ( ) ;
2017-05-28 20:48:26 +02:00
if ( poss . isRequired ( ) )
allset = false ;
}
2017-03-09 16:08:47 +01:00
}
2017-05-28 20:48:26 +02:00
if ( allset )
start . setEnabled ( true ) ;
2017-03-09 16:08:47 +01:00
}
public void info ( String a ) {
info . setText ( a ) ;
}
2017-04-04 14:51:28 +02:00
2017-04-07 09:21:52 +02:00
public void setPositionDone ( ) {
isSelectionRunning = false ;
2017-05-28 20:48:26 +02:00
2017-04-07 09:21:52 +02:00
}
public interface Updater {
public void update ( int nummber ) ;
}
public class AutoPlayBox extends JCheckBox implements ActionListener { //AutoPlayCheck Box (Extra Object because some updateing problems occour)
private static final long serialVersionUID = 8957130982898848436L ;
public AutoPlayBox ( ) {
super ( " AutoPlay " ) ;
addActionListener ( this ) ;
}
@Override
public void setSelected ( boolean b ) {
super . setSelected ( b ) ;
update ( b ) ;
}
public void update ( boolean b ) {
doubleplace . setEnabled ( b ) ;
slider [ 0 ] . setEnabled ( b ) ;
slider [ 1 ] . setEnabled ( b ) ;
bot . setAutoPlay ( b ) ;
}
@Override
public void actionPerformed ( ActionEvent e ) {
update ( this . isSelected ( ) ) ;
}
}
2017-04-04 14:51:28 +02:00
public class Slider extends JPanel implements ChangeListener {
private static final long serialVersionUID = 1L ;
private JSlider slider ;
private JLabel label ;
2017-04-07 09:21:52 +02:00
2017-04-04 14:51:28 +02:00
private ChangeListener listener ;
2017-04-07 09:21:52 +02:00
private Updater updater ;
2017-04-04 14:51:28 +02:00
private String prefix = " " , sufix = " " ;
private int offset ;
/ * *
* @param prefix the text of the Label
* @param sufix thge text of the Label
* @param minvalue start vlaue
* @param maxvalue last value
* @param startvalue inital value
* @param komma 10 ^ x offset for komma digits
* /
2017-04-07 09:21:52 +02:00
public Slider ( String prefix , String sufix , int minvalue , int maxvalue , int startvalue , int komma , @Nullable ChangeListener cl , @Nullable Updater upd , boolean enabled ) { //ChangeListener or Updater could be Null!
2017-04-04 14:51:28 +02:00
slider = new JSlider ( minvalue , maxvalue , startvalue ) ;
slider . addChangeListener ( this ) ;
if ( prefix ! = null )
this . prefix = prefix ;
if ( sufix ! = null ) {
this . sufix = sufix ;
}
offset = komma ;
label = new JLabel ( getLabelText ( ) ) ;
add ( slider ) ;
add ( label ) ;
listener = cl ;
2017-04-07 09:21:52 +02:00
updater = upd ;
2017-04-04 14:51:28 +02:00
slider . setEnabled ( enabled ) ;
}
public int getValue ( ) {
return slider . getValue ( ) ;
}
2017-04-07 09:21:52 +02:00
2017-04-04 14:51:28 +02:00
public void setValue ( int val ) {
slider . setValue ( val ) ;
}
private String getLabelText ( ) {
if ( offset > = 0 )
return prefix + ( slider . getValue ( ) * ( int ) Math . pow ( 10 , offset ) ) + sufix ;
return prefix + ( BigDecimal . valueOf ( Math . pow ( 10 , offset ) ) . multiply ( BigDecimal . valueOf ( slider . getValue ( ) ) ) ) + sufix ;
}
@Override
public void setEnabled ( boolean enabled ) {
slider . setEnabled ( enabled ) ;
}
@Override
public void stateChanged ( ChangeEvent e ) {
label . setText ( getLabelText ( ) ) ; //update info
2017-04-07 09:21:52 +02:00
if ( listener ! = null )
listener . stateChanged ( e ) ; //forward Event
if ( updater ! = null )
updater . update ( slider . getValue ( ) ) ;
2017-04-04 14:51:28 +02:00
}
}
2017-03-09 16:08:47 +01:00
}