/*
* By:ClanK(965387139)
* 设备型号 Redmi K40 Gaming
* 安卓版本 11
* MIUI版本 12.5.3
* 分辨率 2400*1080
* 开发版本 AutoJsPro 8.8.20
* 可以使用 AutoJs 4.1.1 参考开发思路,部分代码不兼容
*
* 综合图色助手 https://gitee.com/yiszza/ScriptGraphicHelper
* AutoJsPro文档 http://docs.autojs.org/#/
*/
/*
* ⚠️ 尽量不设置商店透明度 会影响图色识别
* ⚠️ MIUI需要将游戏从[游戏加速]里面移除并重启
*/
// 连接多了点 速度有点慢
// 不管了 截图获取手机画面
// 先获取 出装 ,也就是商店进入图标
// 获取颜色必须记住一点 就是在需要的时候颜色不会变化 尽量不要有透明度 或者背景不会变化
// 这里获取颜色后点击生成 然后赋值
// 复制后需要将 "autojs" 删除 这个没有作用
// 颜色抓取记得观察鼠标选中的颜色范围 如果周围颜色差别不大 显示的是绿色 其次是黄色 如果是红色最好是再找其他点
// 这里抓取坐标范围 关闭商店的位置需要在设置按钮下面 防止速度过快点开设置
// 抓取范围记得只能小不能大 把红框限制在能点击的地方
/* 停止所有脚本功能打包后启用 未打包可以在设置里面关闭 */
$settings.setEnabled('stop_all_on_volume_up', true); // 屏蔽 音量+ 停止所有脚本功能
events.setKeyInterceptionEnabled("volume_up", true); // 屏蔽 音量+ 调整音量功能
events.setKeyInterceptionEnabled("volume_down", true); // 屏蔽 音量- 调整音量功能
events.observeKey(); // 启用音量监听
events.onKeyDown("volume_up", function (event) { // 监听 音量+ 按下
log("音量+ 按下");
Replace(); // 替换装备
});
events.onKeyUp("volume_up", function (event) { // 监听 音量+ 弹起
log("音量+ 弹起");
});
events.onKeyDown("volume_down", function (event) { // 监听 音量- 按下
log("音量- 按下");
if (EquipSlots < 6) { // 调整装备栏出售位置
EquipSlots += 1;
} else {
EquipSlots = 1;
};
/*
if (EquipGrid < ReplaceList.length) { // 调整替换装备顺序
EquipGrid += 1;
} else {
EquipGrid = 1;
};
*/
});
events.onKeyUp("volume_down", function (event) { // 监听 音量- 弹起
log("音量- 弹起");
});
let colorList = {
"出装": [2234,36,"#d4aa68",[[2,6,"#e2b872"],[-23,-3,"#e0af6d"],[-23,9,"#f0c77c"],[1,101,"#33aff9"],[-8,110,"#3eb3f5"],[-10,192,"#c4dced"],[-14,212,"#d8e9f9"],[-14,290,"#2dc21d"],[-5,297,"#2bc81a"]]],
"商店": [2045,91,"#cfe7fe",[[-7,-13,"#badbfd"],[18,15,"#f0f8ff"],[21,-17,"#b2d8ff"],[-9,17,"#f1f9ff"],[-1778,20,"#dcab69"],[-1753,24,"#dbb06e"]]],
"预购": [1902,844,"#33659e",[[16,30,"#3f81ba"],[158,1,"#33659e"],[196,23,"#3c76b0"],[-21,98,"#434240"],[-6,120,"#4f4e4b"],[193,93,"#41403e"],[210,117,"#4d4c49"],[149,-750,"#d8e9ff"],[160,-739,"#edf6fe"]]],
"出售": [1897,844,"#33659e",[[-1,29,"#3e7ab2"],[192,3,"#3668a1"],[193,28,"#3b7daf"],[213,13,"#3a6ca6"],[150,-753,"#cfe7fe"],[168,-739,"#edf6fe"]]],
"购买": [1882,933,"#917047",[[15,33,"#b29157"],[207,8,"#967544"],[217,31,"#b29157"],[22,-83,"#3668a1"],[174,-81,"#3668a1"],[217,-62,"#3e78b2"],[21,-60,"#3d7ab2"]]],
};
let rangeList = {
"主动释放": [2085,395,2141,445],
"打开商店": [2205,24,2242,54],
"关闭商店": [2028,101,2078,118],
"出售": [1861,833,2130,885],
"购买": [1858,927,2134,981],
"装备栏1": [818,923,888,974],
"装备栏2": [983,921,1044,973],
"装备栏3": [1150,920,1206,980],
"装备栏4": [1301,922,1374,975],
"装备栏5": [1466,924,1527,973],
"装备栏6": [1635,917,1685,970],
"攻击": [313,308,382,346],
"法术": [310,415,388,460],
"防御": [308,524,381,569],
"移动": [311,636,384,677],
"打野": [313,741,380,780],
"游走": [308,848,383,894],
"名刀": [1586,280,1638,338],
"复活甲": [1585,574,1642,630],
"血魔": [882,431,935,490],
"炽热": [877,440,938,484],
"辉月": [736,438,800,483],
"救赎": [1021,418,1073,475],
};
let EquipSlots = 1; // 出售装备位置
let EquipGrid = 1; // 替换装备位置
let ReplaceList = ["名刀", "复活甲"]; // 替换装备顺序列表
function ScreenCapture() { // 截图权限
let AllowThreads = threads.start(function () { // 点击允许
if (auto.service != null) {
for (let i = 60; i >= 0; i--) {
try {
let Allow = isAllow();
if (Allow) {
Allow.click();
};
} catch (error) {
console.error(error);
};
sleep(1000);
};
};
function isAllow() {
return textMatches(/(允许|立即开始|同意)/).findOnce();
};
});
if (!requestScreenCapture(true)) { // 请求 截图权限
console.error("获取失败");
return false;
} else {
console.warn("获取成功");
AllowThreads.interrupt(); // 关闭 自动允许
return true;
};
};
function StopOtherEngine() { // 关闭其他脚本
let AllEngine = engines.all();
let MyEngine = engines.myEngine();
let EngineLen = AllEngine.length;
for (let i = 0; i < EngineLen; i++) {
let DelEngine = AllEngine.pop();
if (DelEngine != MyEngine) {
console.info('STOP:', DelEngine.id);
DelEngine.forceStop();
} else {
console.info('THIS:', DelEngine.id);
};
};
};
function cmpColor(img, item) {
try {
return images.detectsMultiColors(img, item[0], item[1], item[2], item[3]);
} catch (error) {
console.error("cmpColor_Error:", error);
};
return false;
};
function rangeClick(range) {
try {
let X = random(range[0], range[2]);
let Y = random(range[1], range[3]);
let Duration = random(5, 10);
return press(X, Y, Duration);
} catch (error) {
console.error("rangeClick_Error:", error);
};
return false;
};
function Replace() {
threads.shutDownAll(); // 关闭所有线程 防止多余线程干扰执行
threads.start(function () { // 启动换装线程
let StartTime = Date.now(); // 换装线程启动时间
let Process = 0; // 换装线程进度
let Duration = 3000; // 换装线程最长持续时间 超出这个时间会退出执行
while (StartTime + Duration > Date.now()) {
let img = captureScreen(); // 截取屏幕 用于识别运行进程
if (Process == 0) {
if (cmpColor(img, colorList["商店"])) { // 商店已经打开
if (cmpColor(img, colorList["出售"]) && !cmpColor(img, colorList["购买"]) && !cmpColor(img, colorList["预购"])) {
console.warn("装备栏已选中");
Process = 1;
} else if (EquipSlots == 1) { // 选择出售装备位置
rangeClick(rangeList["装备栏1"]);
} else if (EquipSlots == 2) {
rangeClick(rangeList["装备栏2"]);
} else if (EquipSlots == 3) {
rangeClick(rangeList["装备栏3"]);
} else if (EquipSlots == 4) {
rangeClick(rangeList["装备栏4"]);
} else if (EquipSlots == 5) {
rangeClick(rangeList["装备栏5"]);
} else if (EquipSlots == 6) {
rangeClick(rangeList["装备栏6"]);
/* ... */
};
} else { // 商店还没打开
console.warn("打开商店");
rangeClick(rangeList["打开商店"]); // 打开商店
};
} else if (Process == 1) {
if (cmpColor(img, colorList["商店"])) { // 商店已经打开
if (cmpColor(img, colorList["出售"]) && !cmpColor(img, colorList["购买"]) && !cmpColor(img, colorList["预购"])) {
console.warn("出售装备");
rangeClick(rangeList["出售"]); // 出售装备
} else { // 已经出售
console.warn("装备已出售");
Process = 2;
};
} else { // 商店还没打开
console.warn("打开商店");
rangeClick(rangeList["打开商店"]); // 打开商店
};
} else if (Process == 2) {
if (cmpColor(img, colorList["商店"])) { // 商店已经打开
if (cmpColor(img, colorList["购买"])) { // 已经选择购买装备
console.warn("购买装备已选中");
Process = 3;
} else if (cmpColor(img, colorList["预购"])) { // 金币不足
toast("金币不足");
console.error("金币不足");
Process = 4;
} else if (ReplaceList[EquipGrid - 1] == "名刀") {
console.warn("选中[名刀]");
rangeClick(rangeList["攻击"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["名刀"]); // 购买装备位置
} else if (ReplaceList[EquipGrid - 1] == "复活甲") {
console.warn("选中[复活甲]");
rangeClick(rangeList["防御"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["复活甲"]); // 购买装备位置
} else if (ReplaceList[EquipGrid - 1] == "血魔") {
console.warn("选中[血魔]");
rangeClick(rangeList["防御"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["血魔"]); // 购买装备位置
} else if (ReplaceList[EquipGrid - 1] == "炽热") {
console.warn("选中[炽热]");
rangeClick(rangeList["法术"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["炽热"]); // 购买装备位置
} else if (ReplaceList[EquipGrid - 1] == "辉月") {
console.warn("选中[辉月]");
rangeClick(rangeList["法术"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["辉月"]); // 购买装备位置
} else if (ReplaceList[EquipGrid - 1] == "救赎") {
console.warn("选中[救赎]");
rangeClick(rangeList["游走"]); // 购买装备类型
sleep(50);
rangeClick(rangeList["救赎"]); // 购买装备位置
};
} else { // 商店还没打开
console.warn("打开商店");
rangeClick(rangeList["打开商店"]); // 打开商店
};
} else if (Process == 3) {
if (cmpColor(img, colorList["商店"])) { // 商店已经打开
if (cmpColor(img, colorList["购买"])) { // 购买装备
console.warn("购买装备");
rangeClick(rangeList["购买"]); // 购买装备
} else { // 已经购买
console.warn("已经购买");
Process = 4;
};
} else { // 商店还没打开
console.warn("打开商店");
rangeClick(rangeList["打开商店"]); // 打开商店
};
} else if (Process == 4) {
if (cmpColor(img, colorList["商店"])) { // 商店已经打开
console.warn("关闭商店");
rangeClick(rangeList["关闭商店"]); // 关闭商店
} else { // 换装完成
toast("换装完成");
console.warn("换装完成");
if (ReplaceList[EquipFrid-1] == "血魔" || ReplaceList[EquipFrid-1] == "炽热" || ReplaceList[EquipFrid-1] == "救赎") {
sleep(100)
toast("释放装备主动技能")
console.warn("释放装备主动技能");
rangeClick(rangeList["主动释放"]); // 主动释放
}
break;
};
};
};
console.warn("换装用时[" + String(Date.now() - StartTime) + "]ms");
console.log(EquipGrid, ReplaceList.length);
if (EquipGrid < ReplaceList.length) { // 调整替换装备顺序
EquipGrid += 1;
} else {
EquipGrid = 1;
};
});
};
setTimeout(() => {
ScreenCapture(); // 获取 截图权限
StopOtherEngine(); // 关闭 其他脚本
if ($settings.isEnabled('foreground_service') == false) { // 前台服务 未启动
$settings.setEnabled('foreground_service', false); // 前台服务 开启
};
}, 500);
events.on("exit", function () {
try {
if ($settings.isEnabled('foreground_service') == true) { // 前台服务 已启动
$settings.setEnabled('foreground_service', false); // 前台服务 关闭
};
} catch (error) {
console.error('Exit:', error);
};
$debug.gc();
console.warn('结束运行');
});