reordered lolautoaccept class

This commit is contained in:
mrbesen 2022-04-24 14:06:27 +02:00
parent f32c436c18
commit 965a0dab20
Signed by: MrBesen
GPG Key ID: 596B2350DCD67504
8 changed files with 161 additions and 143 deletions

View File

@ -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();

View File

@ -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 \

View File

@ -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));
}
}

View File

@ -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));
}

16
src/lolautoaccept_ban.cpp Normal file
View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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();
}