forked from yaonizui/WechatJumping.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
WechatJumpingV2.js
161 lines (159 loc) · 8.63 KB
/
WechatJumpingV2.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
auto();
requestScreenCapture(); //请求截图
var window = floaty.window(
<frame h="70">
<button id="action" text="记点" bg="#00000000"/>
<img src="http://img04.sogoucdn.com/app/a/100520146/3678c8dd879c8ba1a9d785f153a59964" />
</frame>
);
window.setPosition(-1000, -1000); //建立悬浮窗并隐藏
console.show(); //显示控制台
setInterval(() => { /*操作ui*/
awc = 10; //比色误差
function capturescreen() {
while (true) {
if (ajt = captureScreen()) {
return ajt;
break;
}
}
} //获取截图,返回图片对象
function qs(a, b, c) {
return images.pixel(a, b, c);
} //取色函数简化为qs(),方便后面调用,也可以写成qs=images.pixel;
function abs(a7, a8) {
if (Math.abs(colors.red(a7) - colors.red(a8)) < awc && Math.abs(colors.green(a7) - colors.green(a8)) < awc && Math.abs(colors.blue(a7) - colors.blue(a8)) < awc) {
return true;
} else {
return false;
}
} //比色函数,比色误差为第10行定义的
var vid = 1.23; //点击按屏时间系数
function akzt() {
new java.lang.Thread(function() {
packageName("com.stardust.scriptdroid").className("android.widget.EditText").setText("1.13");
}).start();
vid = console.rawInput("点击确定开始执行,拖到左下角,自己写系数,系数越大飞得越远", "");
} //重新输入时间系数并开始的控制台,默认输入系数1.13,vid由1.23变为1.13
function akzt2() {
new java.lang.Thread(function() {
packageName("com.stardust.scriptdroid").className("android.widget.EditText").setText("暂停");
kz = console.rawInput("点击确定暂停脚本", "");
}).start();
} //执行中暂停脚本的控制台
function zrw(a) {
var pos = findColor(a, "#383653", { //在图片a里找这个颜色
region: [100, 510, 979, 1090], //屏幕区域范围
threshold: 4 //4线程找色
});
if (!pos) { //如果没找到返回null,不再往下执行
return null;
}
pos.x += -3; //执行到这里说明找到了,x加-3得到人头棋子顶部的中心位置坐标
pos.y += 185; //找的颜色是人头棋子的头顶坐标y加185得到人头棋子脚部坐标
return pos; //返回人头棋子的坐标
} //以上是找人物坐标函数块
function zdd0(tp, tmp) { //找下个位置图块的顶点位置
var y1 = 0; //用来记录向下扫描找到的第一个顶点的y坐标
var pxt1 = 100; //
var pxt2 = 510; //这是在屏幕中心轴左边扫描的x的范围,顶点有可能出现在这个范围
if (tmp < 540) {
pxt1 = 570;
pxt2 = 980;
} //tmp是找到的人物的x坐标,如果人物在左边,那么下个图块顶点肯定就在右边冲定义x范围
for (var y0 = 510; y0 < 980; y0 += 10) { //粗略扫描,y起始和y结尾,每行扫描完如果没扫到顶点往下进十继续扫
var ys = qs(tp, 1, y0); //取背景颜色
for (var x0 = pxt1; x0 < pxt2; x0 += 10) { //x也是粗略扫描,每次加10
if (abs(ys, qs(tp, x0, y0))) { //和背景颜色比色,颜色一样什么都不做
} else { //颜色不一样,说明这是顶点
y1 = y0; //用y1记录这个粗略顶点y坐标
y0 = 1090; //
x0 = pxt2; //给x,y赋超过范围值结束for循环
} //比色结束
} //y0行x扫描结束
} //整个顶点粗扫描结束
if (y1 == 0) {
return false;
} //如果粗略坐标是零,说明没找到顶点的y值,说明顶点不存在,返回错误值
var as3 = 0; //
var as4 = 0; //记录多个顶点x的左右边界
for (y0 = y1; y0 > 510; y0--) { //从粗顶点y坐标y1向上细扫
var as1 = 0; //
var as2 = 0; //临时左右边界x值
var ok = 0; //一行中背景色的个数
for (x0 = pxt1; x0 < pxt2; x0++) { //x范围的扫描
if (abs(ys, qs(tp, x0, y0))) { //比色,背景色就是粗扫y1的背景色,游戏特性原因细扫背景颜色变化可以忽略,不用重新获取背景颜色
/*颜色是背景色*/
if (as1 != 0 && as2 == 0) { //as1不为0被赋值过又是背景色说明这是x左边界+1,记录
as2 = x0;
x0 = pxt2; //x赋值结束继续扫
}
ok++; //背景色个数加1
} else { //不是背景色,也就是说明是顶点色
if (as1 == 0) {
as1 = x0;
} //第一次扫到非背景色是x左边界,并记录
} //一次比色判断完
} //一行比色判断完
if (ok == 410) {
y0 = 510;
} else {
as3 = as1;
as4 = as2; //如果这不是y边界,把x边界的的记录值赋值给as3,as4
} //如果这一行背景色410个,说明这行全是背景色,图块不在这行,那么赋y值最大值结束for循环,执行到了这行,说明上一行就是精确顶点,两顶点x不再重新赋值
}
var as = parseInt((as3 + as4 - 1) / 2); //由精确顶点两x计算平均值得到精确x唯一值
return as; //返回精确顶点x坐标
} //找顶点坐标结束
kz = 1; //脚本运行暂停控制值
while (true) { //死循环
x = 0;
xk = 0;
if (kz != 0) {
akzt();
kz = 0;
akzt2(); //暂停控制
} //x坐标0,xk坐标相同次数
while (true) { //死循环找人物棋子
sleep(100); //手机休息一下不要太卡
tp = capturescreen(); //获取截图
rwzb = zrw(tp); //找人物棋子坐标
if (rwzb != null) {
if (x != rwzb.x) { //找到x不同赋给x
x = rwzb.x;
} else {
xk++; //和上次找到的x一样就计数
if (xk > 1) {
break;
} //连续超过1次一样说明棋子不动了,棋子就是在这个位置进行下一次跳,跳出找人物棋子死循环
}
} //不为null才继续不然出错
} //找人物棋子坐标结束
rwzb.y += 3; //之后又发现的y坐标误差,加上去的
window.setPosition(rwzb.x - 169, rwzb.y - 226); //把悬浮窗人物棋子脚部169,226移到人物坐标棋子脚部,可以直观显示方便调试
ddzb = zdd0(tp, rwzb.x) + 5; //找下个图块顶点x坐标,5是后来调试发现的误差加上去的
dcx = 563; //对称中心x
dcy = 981; //对称中心y,人物棋子所在方块中心坐标和下个方块中心坐标是对称的,对称点就是这个,多次调试测出
qx = ddzb; //qx赋值为顶点坐标
qy = parseInt(dcy - Math.abs((qx - dcx) / 1.725)); //根据图块中心x和对称点坐标计算出图块中心y//左右两条不同的路径是互相垂直并且对称,2d转3d,根据x和固定比例算出x:y=1:1的y的屏幕坐标值(1.725是测量两个图块中心点的连线x/y算出来的,我也忘了);
window.setPosition(qx - 169, qy - 226) //把悬浮窗脚部移到图块中心,方便观察结果进行进一步调试
x = Math.abs(qx - rwzb.x); //计算出x的距离
y = parseInt((rwzb.y - qy) * (1.725)); //计算出x比例下的y的距离
time = Math.sqrt((x * x) + (y * y)) * vid; //计算出x比例下的距离并乘以时间系数得到精确的点击按压时间
time2 = x * 1.66; //假如每次都能跳到中心完美点,可以只用x乘另一个时间系数得到精确按压时间,实践证明这不可能。所以这句可有可无
var pressX = random(500, 1000);
var pressY = random(800, 1600);
pressCompat(pressX, pressY, time); //随便找一点可以操作的点进行精确时间点击
sleep(100);
window.setPosition(-1000, -1000);
var ran = random(1000, 1500);
sleep(ran); //延时越长越稳定//点击完延时0.x秒,隐藏悬浮窗,避免挡截图
} //死循环,永不结束
}, 1000); //感觉这个1000没什么用,反正就知道只要是有悬浮窗的,代码放setInterval里就能和悬浮窗同时运行
function pressCompat(x, y, duration){
if(device.sdkInt >= 24){
press(x, y, duration);
}else{
Swipe(x, y, x, y, duration);
}
}