forked from MrBesen/lolautoaccept
149 lines
3.4 KiB
C++
149 lines
3.4 KiB
C++
#include "lolautoaccept.h"
|
|
|
|
#include <thread>
|
|
#include <Log.h>
|
|
|
|
#include "util.h"
|
|
|
|
void debugImage(cv::Mat img, const std::string& name) {
|
|
if(img.channels() > 3) {
|
|
std::vector<cv::Mat> channels(4);
|
|
cv::split(img, channels);
|
|
channels.resize(3); // drop alpha channel
|
|
cv::merge(channels, img);
|
|
}
|
|
|
|
time_t t = time(0);
|
|
cv::imwrite("debugimages/" + name + std::to_string(t) + ".png", img);
|
|
}
|
|
|
|
void LolAutoAccept::checkForGame() {
|
|
cv::Mat img;
|
|
screen->take(img);
|
|
|
|
cv::resize(img, img, cv::Size(ScreenShot::DEFAULTWIDTH, ScreenShot::DEFAULTHEIGHT));
|
|
|
|
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;
|
|
}
|
|
|
|
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(!prepick.empty())
|
|
pickFirst(prepick);
|
|
|
|
state = State::PREPICK;
|
|
}
|
|
}
|
|
lastacceptmatch = mat;
|
|
}
|
|
|
|
void LolAutoAccept::performClick(uint32_t nr) {
|
|
inputs.setOffset(screen->getXOffset(), screen->getYOffset());
|
|
inputs.setScale(screen->getXScale(), screen->getYScale());
|
|
|
|
auto p = inputs.get(nr);
|
|
Log::info << "click " << nr << " @ " << p.x << " " << p.y;
|
|
|
|
sim.mouseMoveTo(p.x, p.y);
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(170));
|
|
sim.mouseClick(XIS::LEFT_MOUSE_BUTTON);
|
|
|
|
// move mouse away
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(170));
|
|
p = inputs.get(0);
|
|
sim.mouseMoveTo(p.x, p.y);
|
|
}
|
|
|
|
void LolAutoAccept::enterSearch(const std::string& text) {
|
|
performClick(2); // click searchbox
|
|
|
|
Log::debug << "enter text: " << text;
|
|
|
|
sim.keySequence(text);
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(750));
|
|
}
|
|
|
|
void LolAutoAccept::pickFirst(const std::string& search) {
|
|
enterSearch(search);
|
|
|
|
performClick(3); // first champion
|
|
}
|
|
|
|
LolAutoAccept::LolAutoAccept() : acceptmatcher("imgs/Accept.png"), arrowmatcher("imgs/arrowdown.png"), sim(XInputSimulator::getInstance()) {
|
|
// click positions in 1280x720 scale
|
|
inputs.addPoint({0, 0}); // zero zero
|
|
inputs.addPoint({645, 560}); // accept game
|
|
inputs.addPoint({775, 105}); // search box
|
|
inputs.addPoint({380, 160}); // first champ
|
|
}
|
|
|
|
void LolAutoAccept::setPrePick(const std::string& prePick) {
|
|
prepick = prePick;
|
|
}
|
|
|
|
void LolAutoAccept::setBan(const std::string& ban) {
|
|
this->ban = ban;
|
|
}
|
|
|
|
void LolAutoAccept::setPick(const std::string& pick) {
|
|
this->pick = pick;
|
|
}
|
|
|
|
void LolAutoAccept::run() {
|
|
// get window
|
|
auto wins = ScreenShot::getWindows("League of Legends");
|
|
if(wins.size() != 1) {
|
|
Log::fatal << "invalid count of windows found: " << wins.size();
|
|
return;
|
|
}
|
|
|
|
screen = (wins.at(0)); // just take the first
|
|
|
|
// testing: whole screen:
|
|
// screen = new ScreenShot();
|
|
|
|
//delete other screens
|
|
for(uint32_t i = 1; i < wins.size(); ++i) {
|
|
ScreenShot* ss = wins.at(i);
|
|
delete ss;
|
|
}
|
|
|
|
lastacceptmatch = {false};
|
|
while(true) {
|
|
switch(state) {
|
|
case State::LOBBY:
|
|
checkForGame();
|
|
break;
|
|
default: break;
|
|
}
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(800));
|
|
}
|
|
|
|
delete wins.at(0);
|
|
} |