对《工艺战舰》简单外挂的部分探究(一)
作者:互联网
- 首先
本人才疏学浅,代码有问题的地方太多了。实际上整个代码只是简单做一个堪用的东西而已。
- 第二
不要问为什么做外挂,只是一时兴起罢了。由于这个游戏肝度越来越高,所以使用外挂成为了非常有必要的一个手段。
- 第三
工艺战舰拆包里的第一个CS文件:
“嘿,破解者,你看到了我,所以我也看到了你,你好哦#(滑稽)。你尽管拆,拆出来有趣的东西算我输#(滑稽)。拆完了记得给我们关上。哦对了,这里有很多辣眼睛的暴力代码。请见谅”
拆包的工作也在做了,只不过太冗杂了,不想做。2021.02的游戏版本的代码也是有的。
- 第四
由于做的工程主要分为按键精灵的部分,以及Fiddler抓包相关的部分,所以会分成两篇文章来写。这一篇是按键精灵部分
目录
按键精灵(VBS)自用库
之所以选用按键精灵,是因为其作为一个国产编写Q语言(按键精灵自己的语言,VBS改)的IDE,没有VS/VSCode/VB等等那么重量级,不需要配置一大堆运行环境,但是却可以实现他人代码的即插即用,不用编译(因为它本质就是VBS改)。也正是因为是国人开发的软件,其自带把英文源码转为中文自然语言的能力,更加适合不会写代码的人自己修改代码以适配自己的电脑。
需求
游戏的自动点击脚本,基本上就是检查颜色、等到正确的颜色出现后,点击某个位置。另外按键精灵貌似没有拖动屏幕滑动的功能,因此增加鼠标拖动滑动功能。
- 找到颜色后,点击屏幕
1.1. 找颜色
1.2. 等待出现颜色
1.3. 点击一次,或点击到变色 - 报错
需要在控制台输出明显的错误提示
实现
找到颜色后点击(WaitUntilClick)
要实现这个目标,初步预测参数为:点击位置、颜色点,即
Function WaitUntilClick(ClickPoint, ColorPoints)
后有些情况下点击后不会发生颜色变化,或者不方便进行颜色变化检测,如点击后背景颜色从0x000000变为0xffffff,也有可能是从0x00ffff变成0xffff00,并且在点击前也在自行变化,因此只能进行一次点击而不判断点击后的效果。
同时如果长时间不能检测到颜色会导致程序卡死在这一步,因此需要加入TTL(Time to Live),超时即会返回错误并结束该方法。
最后希望在Console输出现在正在进行哪一步颜色判断,因此加入名字。
最后该方法的参数如下:
Function WaitUntilClick(ClickPoint, ColorPoints, isChangeColor, name, TTL)
//等到屏幕指定点出现指定颜色值后点击屏幕指定点
//使用抓抓的放大镜功能,ctrl+alt+1~9可以选择屏幕上的点坐标与颜色。
//ClickPoint: 一个包含了点击点x,y的数组,注意用Array()制作数组。E.g.: Array(100,200)
//ColorPoints: 一个不限数量的数组,包含了选取颜色点的坐标和颜色,每个元素为一个字符串,E.g.: Array("960,0 5574BD", "893,1002 FFFFFF", "990,1005 FFFFFF")
//isChangeColor: 点击后ColorPoints选取的颜色点是否改变颜色,1为是,0为否。
//name: 这次点击的名字,用户可以方便在输出窗口区分
//TTL: 运行最大时间,超过TTL则停止等待
TracePrint(name&"Enter WaitUntilClick Func")
Dim mWaitUntil,mClickUntilChange,mWaitUntilClick
mWaitUntil=WaitUntil(ColorPoints, name, TTL)
If (mWaitUntil = 1) Then
If (isChangeColor = 0) Then
Delay 3000
MoveTo ClickPoint(0),ClickPoint(1)
LeftClick 1
mClickUntilChange = 1
ElseIf (isChangeColor = 1)
mClickUntilChange = ClickUntilChange(ClickPoint, ColorPoints, name, 30)
End If
End If
If (mWaitUntil + mClickUntilChange = 2) Then
mWaitUntilClick = 1
TracePrint(name&" WaitUntilClick Func Success")
Else
mWaitUntilClick = 0
TracePrint(name&" WaitUntilClick Func Failed")
End If
WaitUntilClick = mWaitUntilClick
Rem WaitUntilClickEnd
End Function
寻找颜色(CmpColorEx)
实际上,这个目标是有按键精灵自带的方法的,但写的时候不知道,所以自己写了一个
该方法为WaitUntilClick调用的一个子方法,输入参数为颜色点数组,即ColorPoints。数组元素为字符串,需要字符串处理获得颜色点坐标、颜色值。for循环逐个数组元素获取屏幕中该坐标点的颜色值并与输入值对比。同时还有允许误差,需要对颜色值16进制两位一组分成三组,并相减,取模,与允许误差对比。若有不符合,则返回0,若全部符合,则返回1.
Function CmpColorEx(ColorPoints, shift)
Dim PosX, PosY, ColorValue, GetColor, Check, ColorPoint
Check = 1
For i = 0 To UBound(ColorPoints)
ColorPoint=ColorPoints(i)
PosX = Cint(Mid(ColorPoint, 1, InStr(ColorPoint, ",")))
PosY = Cint(Mid(ColorPoint, InStr(ColorPoint, ",")+1, InStr(ColorPoint, " ")-InStr(ColorPoint, ",")))
ColorValue = Mid(ColorPoint, InStr(ColorPoint, " ")+2)
GetColor = GetPixelColor(PosX, PosY)
If (Abs(Eval("&H" & Mid(GetColor, 1, 2)) - Eval("&H" & Mid(ColorValue, 1, 2))) < Eval("&H" & Mid(shift, 1, 2))and Abs(Eval("&H" & Mid(GetColor, 3, 4)) - Eval("&H" & Mid(ColorValue, 3, 4))) < Eval("&H" & Mid(shift, 3, 4)) and Abs(Eval("&H" & Mid(GetColor, 5, 6)) - Eval("&H" & Mid(ColorValue, 5, 6))) < Eval("&H" & Mid(shift, 5, 6))) Then
Else
Check = 0
End If
Next
CmpColorEx = Check
End Function
等待出现某个颜色(WaitUntil)
for循环,每一秒进行一次,调用寻找颜色的方法。若超时,则返回0。
Function WaitUntil(ColorPoints, name, TTL)
Dim CntDown,AlreadyFindColor
CntDown = TTL
AlreadyFindColor = 0
While (CntDown > 0 and AlreadyFindColor = 0)
If (CmpColorEx(ColorPoints, "202020") = 1) Then
AlreadyFindColor = 1
End If
CntDown = CntDown - 0.5
TracePrint("Waiting Until "& name & Cstr(CntDown))
Delay 500
Wend
If (AlreadyFindColor = 1) Then
TracePrint("Found color "&name)
Else
Call LogErr(name,"Can't find color")
End If
WaitUntil = AlreadyFindColor
End Function
点击(ClickUntilChange)
点击有点击一次与点击到变色。如果只点击一次,则直接稍微延时后点击。主要实现点击直到变色。变色也用CmpColorEx方法。
Function ClickUntilChange(ClickPoint, ColorPoints, name, TTL)
Dim CntDown, AlreadyChange
CntDown = TTL
AlreadyChange = 0
While (CntDown > 0 and AlreadyChange = 0)
MoveTo ClickPoint(0),ClickPoint(1)
LeftClick 1
If (CmpColorEx(ColorPoints, "202020") = 0) Then
AlreadyChange = 1
End If
CntDown = CntDown - 2
TracePrint("Clicking Until Change "& name & Cstr(CntDown))
Delay 2000
Wend
If AlreadyChange = 1 Then
TracePrint("Clicked"&name)
Else
Call LogErr(name,"Click Can't change color")
End If
ClickUntilChange = AlreadyChange
End Function
自动远征
主要还是调用上述的WaitUntilClick方法。对屏幕点位的操作,主要还是重复性操作,因此不再赘述
连点器
主要有两块,一是用户控制部分,用于控制点击启停,二是实际点击,三是点掉连点器警告(工艺战舰在接受到过快的点击时会警告)。
玩家控制部分
仍然是一个for作为主循环,连续两次点击空格后开始检测连点,连续点两次ctrl后结束连点。
连点以及反警告都在其他线程完成,主线程主要是进行玩家控制,不进行点击操作。
While (true)
key1 = WaitKey()
key2 = WaitKey()
TracePrint (key1)
TracePrint (key2)
If (key1 = 32 and key2 = 32) Then //开始检测射击
TracePrint("开始检测射击")
ableShoot = True
End If
If (key1 = 17 and key2 = 17) Then //停止检测射击
TracePrint("停止检测射击")
ableShoot = False
End If
TracePrint ("ableShoot: "+cstr(ableShoot)+" useBug: "+cstr(useBug))
If (ableShoot = True and shooting = false) Then
TracePrint(开始射击)
ThreadID1 = BeginThread(shoot())
ThreadID2 = BeginThread(checkWarning())
shooting = True
End If
If (ableShoot = False and shooting = True) Then
TracePrint("停止射击")
StopThread (ThreadID1)
StopThread (ThreadID2)
shooting = False
End If
Delay 500
Wend
连点部分(shoot)
检测区域存在颜色,如果装填好后,装填进度条颜色会变成绿色,若出现绿色,则开始点击。
lastShoot = false
sub shoot()
While (true)
//cnt = 20
Call FindColor(589,834,1590,1033,"B5FE00",intX,intY)
If intX > 0 And intY > 0 Then
LeftClick 1
TracePrint("SHOOT")
thisShoot = True
Else
thisShoot = False
End If
lastShoot = thisShoot
Delay 1
Wend
End Sub
连点警告处理
检测颜色点,如果出现警告弹窗的颜色点,则开始点击。
Sub checkWarning()
While (True)
isWarning = Lib.Click_Extend.CmpColorEx(Array("386,314 26BAFF","415,896 FFFFFF","483,890 333333"),"101010")
If (isWarning = 1) Then
Call MoveTo(515,889)
LeftClick 1
End If
Delay 100
Wend
End Sub
无敌战斗
使用Fiddler进行修改,期待下一篇
连发核弹
使用Fiddler进行修改,期待下一篇
自动战斗
使用Fiddler进行修改,期待下一篇
标签:外挂,颜色,name,TracePrint,ColorPoints,探究,点击,End,战舰 来源: https://blog.csdn.net/MioSleet/article/details/112555110