/*
Copyright 2012 Jan Ove Saltvedt
This file is part of KBot.
KBot is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KBot is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with KBot. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* Copyright � 2010 Jan Ove Saltvedt.
* All rights reserved.
*/
package com.kbotpro.randoms;
import com.kbotpro.handlers.AccountsManager;
import com.kbotpro.scriptsystem.events.PaintEventListener;
import com.kbotpro.scriptsystem.input.callbacks.HoldKeyCallback;
import com.kbotpro.scriptsystem.input.jobs.HoldKeyJob;
import com.kbotpro.scriptsystem.runnable.Random;
import com.kbotpro.scriptsystem.various.KTimer;
import com.kbotpro.scriptsystem.wrappers.IComponent;
import com.kbotpro.scriptsystem.wrappers.Interface;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
/**
* Created by endoskeleton.
*/
public class AutoLogin extends Random implements PaintEventListener {
private final int WORLD_PARENT = 910;
private final int LOGIN_PARENT = 905;
private final int LOBBY_PARENT = 906;
int targetWorldNumber = -1;//used for the world select, which I can improve upon later
String targetWorldType;
private Font paintFont = new Font("Times New Roman", Font.BOLD, 32);
private boolean askedForAccount = false;
public void onRepaint(Graphics graphics) {
if (isRunning()) {
Graphics2D g = (Graphics2D) graphics;
Font font = g.getFont();
g.setFont(paintFont);
g.setColor(Color.GREEN);
g.drawString("Logging in!", 40, 40);
g.setFont(font);
}
}
public boolean activate() {
final int state = game.getGameState();
return state >= 2 && state <= 6 && !botEnv.botPanel.botName.getUsername().toLowerCase().contains("null");
}
public synchronized int loop(String username, String password, boolean members) {
switch (game.getGameState()) {
case 2: //Log in
login(username, password, members);
break;
case 4: //This happens in between the login and lobby
return random(300, 500);
case 6: //Inside the lobby
//Error messages, switching worlds to quickly.
Interface lobby = interfaces.getInterface(LOBBY_PARENT);
if (lobby.getComponent(117) != null && lobby.getComponent(117).isVisible()) {
if (!lobby.getComponent(117).getText().contains("YOU HAVE ONLY JUST LEFT") &&
lobby.getComponent(119) != null) {
lobby.getComponent(119).doClick();
}
}
if (lobby.getComponent(68).getText() != null && lobby.getComponent(68).getText().contains("To enjoy members")) {
lobby.getComponent(69).doClick();
return random(300, 500);
}
//selectWorld(false);
IComponent clickToPlay = interfaces.getComponent(LOBBY_PARENT, 170);
if (clickToPlay != null) {
clickToPlay.doClick();
}
break;
case 9: //Logged in
return -1;
default: //Not sure if I should stop the scripts if an unknown state come sup
break;
}
return 1000;
}
void login(String username, String password, boolean members) {
Interface parent = interfaces.getInterface(LOGIN_PARENT);
if (parent == null || !parent.isValid()) {
return;
}
if (parent.getComponent(38).isVisible() && members) {
if (parent.getComponent(38).doClick()) {
while (parent.getComponent(38).isVisible()) {
sleep(10);
}
}
}
if (parent.getComponent(59).isVisible() && !members) {
if (parent.getComponent(59).doClick()) {
while (parent.getComponent(59).isVisible()) {
sleep(10);
}
}
}
parent = interfaces.getInterface(596);
boolean completeDelete = false;
if (parent.getComponent(30).isVisible()) {
String invalid = parent.getComponent(30).getText();
if (invalid != null && invalid.toLowerCase().contains("invalid username")) {
parent.getComponent(36).doClick();
completeDelete = true;
}
}
IComponent userNameBox = parent.getComponent(71);
IComponent passwordBox = parent.getComponent(91);
String usernameString = userNameBox.getText().replace("|", "").trim();
String passwordString = passwordBox.getText().replace("|", "").trim();
if (!usernameString.equals(username) || completeDelete) {
userNameBox.doClick();
if (usernameString.length() > 0) {
backSpace();
}
keyboard.writeText(username);
return;
}
if (passwordString.length() != password.length() || completeDelete) {
passwordBox.doClick();
if (passwordString.length() > 0) {
backSpace();
}
keyboard.writeText(password);
} else {
parent.getComponent(87).doClick();
sleep(random(1000, 2000));
}
}
void backSpace() {
final KTimer t = new KTimer(random(800, 1000));
HoldKeyJob bs = keyboard.createHoldKeyJob(KeyEvent.VK_BACK_SPACE, new HoldKeyCallback() {
public void update(HoldKeyJob holdKeyJob) {
if (t.isDone()) {
holdKeyJob.stopHolding();
}
}
public void onFinished(HoldKeyJob holdKeyJob) {
}
});
bs.start();
bs.join();
while (bs.isAlive()) {
sleep(10);
}
}
void selectWorld(boolean members) {
if (interfaces.componentExists(LOBBY_PARENT, 117) && interfaces.getComponent(LOBBY_PARENT, 117).isVisible()) {
if (!interfaces.getComponent(LOBBY_PARENT, 117).getText().contains("YOU HAVE ONLY JUST LEFT") &&
interfaces.getComponent(LOBBY_PARENT, 119) != null) {
interfaces.getComponent(LOBBY_PARENT, 119).doClick();
}
return;
}
if (interfaces.getComponent(WORLD_PARENT, 0) != null &&
!interfaces.getComponent(WORLD_PARENT, 0).isVisible() && interfaces.componentExists(LOBBY_PARENT, 183)) {
if (interfaces.getComponent(LOBBY_PARENT, 183).doClick()) {
sleep(random(1000, 1500));
}
}
Interface parent = interfaces.getInterface(WORLD_PARENT);
if (parent == null || !parent.isValid()) {
return;
}
if (targetWorldNumber == -1) {
IComponent[] worldActivity = parent.getComponent(71).getChildren();
IComponent[] worldNumber = parent.getComponent(68).getChildren();
IComponent[] worldType = parent.getComponent(73).getChildren();
IComponent[] worldPopulation = parent.getComponent(70).getChildren();
ArrayList<Integer> potentialWorlds = new ArrayList<Integer>();
for (int i = 0; i < worldActivity.length; i++) {
if (!worldActivity[i].getText().toLowerCase().contains("pvp") &&
!worldActivity[i].getText().toLowerCase().contains("bounty") &&
!worldPopulation[i].getText().contains("Offline")) {
if (worldType[i].getText().contains("Members") && members) {
potentialWorlds.add(i);
}
if (!worldType[i].getText().contains("Members") && !members) {
potentialWorlds.add(i);
}
}
}
targetWorldNumber = potentialWorlds.get(random(0, potentialWorlds.size() - 1));
targetWorldType = worldNumber[targetWorldNumber].getText();
}
IComponent targ = parent.getComponent(76).getChildren()[targetWorldNumber];
if (!parent.getComponent(10).getText().contains(targetWorldType)) {
if (parent.getComponent(61).getBounds().contains(targ.getCenter())) {
targ.doClick();
} else {
IComponent bigBox = parent.getComponent(62);
double percent = (targ.getAbsoluteY() / (bigBox.getBounds().getHeight() + bigBox.getAbsoluteY()));
IComponent scrollBar = parent.getComponent(85).getChildren()[0];
Point p = new Point(scrollBar.getAbsoluteX() + random(0, scrollBar.getWidth()),
(int) (scrollBar.getAbsoluteY() + (scrollBar.getHeight() * percent)));
mouse.moveMouse(p, true);
}
} else {
IComponent finish = interfaces.getComponent(LOBBY_PARENT, 179);
if (finish != null) {
finish.doClick();
}
}
}
public synchronized void onStart() {
AccountsManager.Account account = botEnv.botPanel.botName;
if (account == null) {
return;
}
final String username = account.getUsername();
final String password = account.getPassword();
KTimer timeout = new KTimer(600000); //10 minutes
while (!botEnv.randomManager.scriptStopped && activate() && !timeout.isDone()) {
int i = loop(username, password, account.membersAccount);
if (i <= 0) {
break;
}
sleep(i);
}
if (timeout.isDone()) {
botEnv.scriptManager.stopAllScripts();
}
}
@Override
public String getName() {
return "AutoLogin";
}
}