reordered lolautoaccept class
This commit is contained in:
parent
f32c436c18
commit
965a0dab20
|
@ -8,53 +8,65 @@
|
|||
#include <thread>
|
||||
|
||||
class LolAutoAccept {
|
||||
private:
|
||||
protected:
|
||||
struct Stage {
|
||||
Stage(const std::string& matchertmpl);
|
||||
virtual ~Stage();
|
||||
|
||||
Matcher matcher;
|
||||
std::string champ; // not every stage has a champ
|
||||
bool enabled = false;
|
||||
virtual void action(LolAutoAccept& lolaa) = 0;
|
||||
bool process(LolAutoAccept& lolaa, cv::Mat& img);
|
||||
};
|
||||
|
||||
struct AcceptStage : public Stage {
|
||||
AcceptStage();
|
||||
virtual void action(LolAutoAccept& lolaa) override;
|
||||
};
|
||||
|
||||
struct PrePickStage : public Stage {
|
||||
PrePickStage();
|
||||
virtual void action(LolAutoAccept& lolaa) override;
|
||||
};
|
||||
|
||||
struct BanStage : public Stage {
|
||||
BanStage();
|
||||
virtual void action(LolAutoAccept& lolaa) override;
|
||||
};
|
||||
|
||||
struct PickStage : public Stage {
|
||||
PickStage();
|
||||
virtual void action(LolAutoAccept& lolaa) override;
|
||||
};
|
||||
|
||||
ScreenShot* screen = nullptr;
|
||||
Matcher acceptmatcher;
|
||||
Matcher arrowmatcher;
|
||||
Matcher banmatcher;
|
||||
Matcher::Match lastacceptmatch;
|
||||
|
||||
std::vector<Stage*> stages;
|
||||
XInputSimulator& sim;
|
||||
|
||||
ScaleableInputs inputs;
|
||||
|
||||
std::string prepick;
|
||||
std::string ban;
|
||||
std::string pick;
|
||||
bool autoacceptenabled = false;
|
||||
bool prepickenabled = false;
|
||||
bool banenabled = false;
|
||||
bool pickenabled = false;
|
||||
|
||||
bool shouldrun = false;
|
||||
std::thread lolaathread;
|
||||
|
||||
enum class State {
|
||||
LOBBY,
|
||||
PREPICK,
|
||||
BAN,
|
||||
PICK,
|
||||
GAME
|
||||
};
|
||||
|
||||
State state = State::LOBBY;
|
||||
|
||||
void checkForGame();
|
||||
void checkForBan();
|
||||
void performClick(uint32_t nr, bool movemouseaway = true);
|
||||
void enterSearch(const std::string& text);
|
||||
void pickFirst(const std::string& search);
|
||||
public:
|
||||
enum class State {
|
||||
LOBBY = 0,
|
||||
PREPICK = 1,
|
||||
BAN = 2,
|
||||
PICK = 3,
|
||||
GAME = 4
|
||||
};
|
||||
|
||||
LolAutoAccept();
|
||||
~LolAutoAccept();
|
||||
|
||||
void setPrePick(const std::string& prePick);
|
||||
void setBan(const std::string& ban);
|
||||
void setPick(const std::string& pick);
|
||||
void setAutoAcceptEnabled(bool b);
|
||||
void setPrePickEnabled(bool b);
|
||||
void setBanEnabled(bool b);
|
||||
void setPickEnabled(bool b);
|
||||
void setChamp(const std::string& champ, State s);
|
||||
void setEnabled(bool b, State s);
|
||||
|
||||
bool init(); // returns true on success
|
||||
void run();
|
||||
|
|
|
@ -29,6 +29,10 @@ SOURCES += \
|
|||
src/fakescreen.cpp \
|
||||
src/files.cpp \
|
||||
src/json.cpp \
|
||||
src/lolautoaccept_accept.cpp \
|
||||
src/lolautoaccept_ban.cpp \
|
||||
src/lolautoaccept_pick.cpp \
|
||||
src/lolautoaccept_prepick.cpp \
|
||||
src/lolautoaccept.cpp \
|
||||
src/main.cpp \
|
||||
src/mainwindow.cpp \
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
#include "util.h"
|
||||
#include "fakescreen.h"
|
||||
|
||||
// set to 1 to use the test screenshot feature
|
||||
#define TESTSCREEN 0
|
||||
|
||||
void debugImage(cv::Mat img, const std::string& name) {
|
||||
if(img.channels() > 3) {
|
||||
std::vector<cv::Mat> channels(4);
|
||||
|
@ -18,74 +21,18 @@ void debugImage(cv::Mat img, const std::string& name) {
|
|||
cv::imwrite("debugimages/" + name + std::to_string(t) + ".png", img);
|
||||
}
|
||||
|
||||
void LolAutoAccept::checkForGame() {
|
||||
cv::Mat img;
|
||||
screen->take(img);
|
||||
LolAutoAccept::Stage::Stage(const std::string& matchertmpl) : matcher(matchertmpl) {}
|
||||
LolAutoAccept::Stage::~Stage() {}
|
||||
|
||||
cv::resize(img, img, cv::Size(ScreenShot::DEFAULTWIDTH, ScreenShot::DEFAULTHEIGHT));
|
||||
|
||||
// debugImage(img, "resized");
|
||||
|
||||
Matcher::Match mat = acceptmatcher.match(img);
|
||||
|
||||
if(mat.doesMatch) {
|
||||
Log::info << "matched";
|
||||
cv::rectangle(img, cv::Point(mat.x, mat.y), cv::Point( mat.x + mat.width , mat.y + mat.height ), cv::Scalar(0, 0, 255, 0), 2);
|
||||
debugImage(img);
|
||||
|
||||
if(lastacceptmatch.doesMatch) {
|
||||
Log::info << "second match";
|
||||
|
||||
if(lastacceptmatch != mat) {
|
||||
Log::warn << "not same match!";
|
||||
lastacceptmatch.doesMatch = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if(autoacceptenabled)
|
||||
performClick(1); // accept Game
|
||||
|
||||
// security sleep
|
||||
std::this_thread::sleep_for(std::chrono::seconds(3));
|
||||
} else {
|
||||
Log::info << "first match";
|
||||
}
|
||||
} else {
|
||||
// check if next stage is here
|
||||
Matcher::Match mat = arrowmatcher.match(img);
|
||||
if(mat.doesMatch) {
|
||||
Log::info << "Pre pick state";
|
||||
|
||||
if(prepickenabled && !prepick.empty())
|
||||
pickFirst(prepick);
|
||||
|
||||
state = State::PREPICK;
|
||||
bool LolAutoAccept::Stage::process(LolAutoAccept& lolaa, cv::Mat& img) {
|
||||
if(enabled) {
|
||||
auto match = matcher.match(img);
|
||||
if(match.doesMatch) {
|
||||
action(lolaa);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
lastacceptmatch = mat;
|
||||
}
|
||||
|
||||
void LolAutoAccept::checkForBan() {
|
||||
cv::Mat img;
|
||||
screen->take(img);
|
||||
|
||||
cv::resize(img, img, cv::Size(ScreenShot::DEFAULTWIDTH, ScreenShot::DEFAULTHEIGHT));
|
||||
|
||||
Matcher::Match mat = banmatcher.match(img);
|
||||
if(mat.doesMatch) {
|
||||
Log::info << "Ban state";
|
||||
|
||||
if(banenabled && !ban.empty()) {
|
||||
pickFirst(ban);
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(800));
|
||||
|
||||
// click "ban"
|
||||
performClick(4);
|
||||
}
|
||||
|
||||
state = State::BAN;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LolAutoAccept::performClick(uint32_t nr, bool movemouseaway) {
|
||||
|
@ -123,7 +70,7 @@ void LolAutoAccept::pickFirst(const std::string& search) {
|
|||
performClick(3, false); // first champion
|
||||
}
|
||||
|
||||
LolAutoAccept::LolAutoAccept() : acceptmatcher("imgs/Accept.png"), arrowmatcher("imgs/arrowdown.png"), banmatcher("imgs/ban.png"), sim(XInputSimulator::getInstance()) {
|
||||
LolAutoAccept::LolAutoAccept() : sim(XInputSimulator::getInstance()) {
|
||||
// click positions in 1280x720 scale
|
||||
inputs.addPoint({0, 0}); // zero zero
|
||||
inputs.addPoint({645, 560}); // accept game
|
||||
|
@ -131,52 +78,46 @@ LolAutoAccept::LolAutoAccept() : acceptmatcher("imgs/Accept.png"), arrowmatcher(
|
|||
inputs.addPoint({380, 160}); // first champ
|
||||
inputs.addPoint({638, 608}); // pick/ban champ
|
||||
|
||||
acceptmatcher.setOffset(539, 529);
|
||||
arrowmatcher.setOffset(615, 617);
|
||||
banmatcher.setOffset(1232, 90);
|
||||
stages.reserve(4);
|
||||
stages.push_back(new AcceptStage());
|
||||
stages.push_back(new PrePickStage());
|
||||
stages.push_back(new BanStage());
|
||||
stages.push_back(new PickStage());
|
||||
}
|
||||
|
||||
LolAutoAccept::~LolAutoAccept() {
|
||||
stopJoinThread();
|
||||
|
||||
for(auto s : stages) {
|
||||
delete s;
|
||||
}
|
||||
|
||||
delete screen;
|
||||
screen = nullptr;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setPrePick(const std::string& prePick) {
|
||||
prepick = prePick;
|
||||
void LolAutoAccept::setChamp(const std::string& champ, State s) {
|
||||
if(s == State::LOBBY || s >= State::GAME) {
|
||||
Log::warn << "setChamp() called on invalid State";
|
||||
}
|
||||
|
||||
stages.at((int) s)->champ = champ;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setBan(const std::string& ban) {
|
||||
this->ban = ban;
|
||||
}
|
||||
void LolAutoAccept::setEnabled(bool b, State s) {
|
||||
if(s >= State::GAME) {
|
||||
Log::warn << "setEnabled() called on invalid State";
|
||||
}
|
||||
|
||||
void LolAutoAccept::setPick(const std::string& pick) {
|
||||
this->pick = pick;
|
||||
stages.at((int) s)->enabled = b;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setAutoAcceptEnabled(bool b) {
|
||||
autoacceptenabled = b;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setPrePickEnabled(bool b) {
|
||||
prepickenabled = b;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setBanEnabled(bool b) {
|
||||
banenabled = b;
|
||||
}
|
||||
|
||||
void LolAutoAccept::setPickEnabled(bool b) {
|
||||
pickenabled = b;
|
||||
}
|
||||
|
||||
|
||||
bool LolAutoAccept::init() {
|
||||
if(screen)
|
||||
return true;
|
||||
|
||||
// get window
|
||||
#if TESTSCREEN == 0
|
||||
auto wins = ScreenShot::getWindows("League of Legends");
|
||||
if(wins.size() != 1) {
|
||||
Log::fatal << "invalid count of windows found: " << wins.size();
|
||||
|
@ -187,9 +128,11 @@ bool LolAutoAccept::init() {
|
|||
}
|
||||
|
||||
screen = (wins.at(0)); // just take the first
|
||||
#else
|
||||
|
||||
// testing whole screen, but take a part of it, so it behaves like a focused screenshot
|
||||
// screen = new FakeScreen(1, 683, 1280, 720);
|
||||
screen = new FakeScreen(1, 683, 1280, 720);
|
||||
#endif
|
||||
|
||||
// testing: whole screen:
|
||||
// screen = new ScreenShot();
|
||||
|
@ -207,7 +150,6 @@ void LolAutoAccept::run() {
|
|||
|
||||
void LolAutoAccept::stop() {
|
||||
shouldrun = false;
|
||||
state = State::LOBBY;
|
||||
}
|
||||
|
||||
void LolAutoAccept::stopJoinThread() {
|
||||
|
@ -219,24 +161,29 @@ void LolAutoAccept::stopJoinThread() {
|
|||
}
|
||||
|
||||
void LolAutoAccept::innerRun() {
|
||||
lastacceptmatch = {false};
|
||||
shouldrun = true;
|
||||
|
||||
while(shouldrun) {
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
switch(state) {
|
||||
case State::LOBBY:
|
||||
checkForGame();
|
||||
break;
|
||||
case State::PREPICK:
|
||||
checkForBan();
|
||||
default: break;
|
||||
|
||||
cv::Mat img;
|
||||
screen->take(img);
|
||||
cv::resize(img, img, cv::Size(ScreenShot::DEFAULTWIDTH, ScreenShot::DEFAULTHEIGHT));
|
||||
|
||||
for(size_t i = 0; i < stages.size(); ++i) {
|
||||
Log::trace << "processing stage" << i;
|
||||
Stage* stage = stages.at(i);
|
||||
if(stage->process(*this, img)) {
|
||||
Log::debug << "stage successful: " << i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
auto end = std::chrono::high_resolution_clock::now();
|
||||
std::chrono::duration<double> dur = (end-start);
|
||||
if(dur.count() > 1e-5)
|
||||
Log::info << "iteration took: " << (dur.count() * 1000 ) << " ms";
|
||||
Log::info << "iteration took: " << (dur.count() * 1000) << " ms";
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(800));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
#include "lolautoaccept.h"
|
||||
|
||||
LolAutoAccept::AcceptStage::AcceptStage() : Stage("imgs/Accept.png") {
|
||||
matcher.setOffset(539, 529);
|
||||
}
|
||||
|
||||
void LolAutoAccept::AcceptStage::action(LolAutoAccept& lolaa) {
|
||||
lolaa.performClick(1); // accept Game
|
||||
|
||||
// security sleep
|
||||
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#include "lolautoaccept.h"
|
||||
|
||||
LolAutoAccept::BanStage::BanStage() : Stage("imgs/ban.png") {
|
||||
matcher.setOffset(1232, 90);
|
||||
}
|
||||
|
||||
void LolAutoAccept::BanStage::action(LolAutoAccept& lolaa) {
|
||||
if(!champ.empty()) {
|
||||
lolaa.pickFirst(champ);
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(800));
|
||||
|
||||
// click "ban"
|
||||
lolaa.performClick(4);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#include "lolautoaccept.h"
|
||||
|
||||
LolAutoAccept::PickStage::PickStage() : Stage("imgs/pick.png") {
|
||||
matcher.setOffset(538, 587);
|
||||
}
|
||||
|
||||
void LolAutoAccept::PickStage::action(LolAutoAccept& lolaa) {
|
||||
if(!champ.empty()) {
|
||||
lolaa.pickFirst(champ);
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(800));
|
||||
|
||||
// click "accept"
|
||||
lolaa.performClick(4);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#include "lolautoaccept.h"
|
||||
|
||||
LolAutoAccept::PrePickStage::PrePickStage() : Stage("imgs/arrowdown.png") {
|
||||
matcher.setOffset(615, 617);
|
||||
}
|
||||
|
||||
void LolAutoAccept::PrePickStage::action(LolAutoAccept& lolaa) {
|
||||
if(!champ.empty())
|
||||
lolaa.pickFirst(champ);
|
||||
}
|
|
@ -19,6 +19,7 @@ MainWindow::MainWindow(LolAutoAccept& lolaa, QWidget *parent) : QMainWindow(pare
|
|||
|
||||
const Config::RootConfig& rc = conf.getConfig();
|
||||
ui->enableAll->setChecked(rc.enabledAutoAccept);
|
||||
lolaa.setEnabled(rc.enabledAutoAccept, LolAutoAccept::State::LOBBY);
|
||||
applySetting(rc.prepick, ui->prepickstage);
|
||||
applySetting(rc.ban, ui->banstage);
|
||||
applySetting(rc.pick, ui->pickstage);
|
||||
|
@ -56,42 +57,42 @@ void MainWindow::toggleMainswitch(bool state) {
|
|||
void MainWindow::aatoggled(bool state) {
|
||||
Log::info << "enableAll checkbox toggled " << state;
|
||||
|
||||
lolaa.setAutoAcceptEnabled(state);
|
||||
lolaa.setEnabled(state, LolAutoAccept::State::LOBBY);
|
||||
conf.getConfig().enabledAutoAccept = state;
|
||||
}
|
||||
|
||||
void MainWindow::pptoggled(bool state) {
|
||||
Log::info << "enablePrePick checkbox toggled " << state;
|
||||
lolaa.setPrePickEnabled(state);
|
||||
lolaa.setEnabled(state, LolAutoAccept::State::PREPICK);
|
||||
conf.getConfig().prepick.enabled = state;
|
||||
}
|
||||
|
||||
void MainWindow::ppedited(const QString& b) {
|
||||
Log::info << "prepick edited: " << b.toStdString();
|
||||
lolaa.setPrePick(b.toStdString());
|
||||
lolaa.setChamp(b.toStdString(), LolAutoAccept::State::PREPICK);
|
||||
conf.getConfig().prepick.champ = b.toStdString();
|
||||
}
|
||||
|
||||
void MainWindow::bantoggled(bool state) {
|
||||
Log::info << "enableBan checkbox toggled " << state;
|
||||
lolaa.setBanEnabled(state);
|
||||
lolaa.setEnabled(state, LolAutoAccept::State::BAN);
|
||||
conf.getConfig().ban.enabled = state;
|
||||
}
|
||||
|
||||
void MainWindow::banedited(const QString& b) {
|
||||
Log::info << "ban edited: " << b.toStdString();
|
||||
lolaa.setBan(b.toStdString());
|
||||
lolaa.setChamp(b.toStdString(), LolAutoAccept::State::BAN);
|
||||
conf.getConfig().ban.champ = b.toStdString();
|
||||
}
|
||||
|
||||
void MainWindow::picktoggled(bool state) {
|
||||
Log::info << "enablePick checkbox toggled " << state;
|
||||
lolaa.setPickEnabled(state);
|
||||
lolaa.setEnabled(state, LolAutoAccept::State::PICK);
|
||||
conf.getConfig().pick.enabled = state;
|
||||
}
|
||||
|
||||
void MainWindow::pickedited(const QString& b) {
|
||||
Log::info << "pick edited: " << b.toStdString();
|
||||
lolaa.setPick(b.toStdString());
|
||||
lolaa.setChamp(b.toStdString(), LolAutoAccept::State::PICK);
|
||||
conf.getConfig().pick.champ = b.toStdString();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue