From 965a0dab203382c02802e0011d47642e6f441dae Mon Sep 17 00:00:00 2001 From: mrbesen Date: Sun, 24 Apr 2022 14:06:27 +0200 Subject: [PATCH] reordered lolautoaccept class --- include/lolautoaccept.h | 76 ++++++++++------- lolautoaccept.pro | 4 + src/lolautoaccept.cpp | 155 +++++++++++----------------------- src/lolautoaccept_accept.cpp | 12 +++ src/lolautoaccept_ban.cpp | 16 ++++ src/lolautoaccept_pick.cpp | 16 ++++ src/lolautoaccept_prepick.cpp | 10 +++ src/mainwindow.cpp | 15 ++-- 8 files changed, 161 insertions(+), 143 deletions(-) create mode 100644 src/lolautoaccept_accept.cpp create mode 100644 src/lolautoaccept_ban.cpp create mode 100644 src/lolautoaccept_pick.cpp create mode 100644 src/lolautoaccept_prepick.cpp diff --git a/include/lolautoaccept.h b/include/lolautoaccept.h index 9e8812c..45c172a 100644 --- a/include/lolautoaccept.h +++ b/include/lolautoaccept.h @@ -8,53 +8,65 @@ #include 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 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(); diff --git a/lolautoaccept.pro b/lolautoaccept.pro index e09ab7c..7825644 100644 --- a/lolautoaccept.pro +++ b/lolautoaccept.pro @@ -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 \ diff --git a/src/lolautoaccept.cpp b/src/lolautoaccept.cpp index 4a57673..6b81832 100644 --- a/src/lolautoaccept.cpp +++ b/src/lolautoaccept.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 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 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)); } } diff --git a/src/lolautoaccept_accept.cpp b/src/lolautoaccept_accept.cpp new file mode 100644 index 0000000..6eecb74 --- /dev/null +++ b/src/lolautoaccept_accept.cpp @@ -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)); +} diff --git a/src/lolautoaccept_ban.cpp b/src/lolautoaccept_ban.cpp new file mode 100644 index 0000000..9931c13 --- /dev/null +++ b/src/lolautoaccept_ban.cpp @@ -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); + } +} diff --git a/src/lolautoaccept_pick.cpp b/src/lolautoaccept_pick.cpp new file mode 100644 index 0000000..9f517c1 --- /dev/null +++ b/src/lolautoaccept_pick.cpp @@ -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); + } +} diff --git a/src/lolautoaccept_prepick.cpp b/src/lolautoaccept_prepick.cpp new file mode 100644 index 0000000..f14fa4e --- /dev/null +++ b/src/lolautoaccept_prepick.cpp @@ -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); +} diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ade65a5..6922c9b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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(); }