├── README.md └── main.py /README.md: -------------------------------------------------------------------------------- 1 | # Wuthering-Waves-Auto 2 | 【鸣潮】角副本 自动刷声骸 3 | 4 | **使用指南:** 5 | 6 | 0.**运行环境**:右键“以管理员身份运行”打开打包好的exe程序,游戏需全屏显示,桌面分辨率设置为**2560x1440**。 7 | 8 | 1.**配队**:安可、暗主、维里奈(配队顺序不能变)。安可和暗主的练度越高,打得越快。 9 | 10 | 2.**初始站位(重要)**:请让角色背对着副本入口,且按下鼠标右键后,正好出现进入副本的按钮。 11 | 12 | 3.**启动脚本**:游戏必须在前台运行,按下快捷键**alt + s**,脚本开始运行。如需停止运行,关闭程序即可。 13 | 14 | 4.**已知BUG**:当BOSS血条剩下一点(几乎看不见)的时候,有概率停止战斗,此时不用操作,继续让脚本运行即可。 15 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # _*_coding : utf-8 _*_ 2 | # @Time : 2024/7/4 20:09 3 | # @Author : Gabriel 4 | # @File : main 5 | # @Project : mcAuto 6 | #以管理员身份运行!!! 7 | 8 | import time 9 | import pyautogui 10 | import keyboard 11 | import cv2 12 | import numpy as np 13 | 14 | startHotkey = 'alt + s' #启动脚本快捷键 15 | gameResolution1 = (0,0,2560,1440) 16 | gameResolution2 = (320,180,1920,1080) 17 | multiPlayReso = (10,35,68,68) 18 | bossHPReso = (890,71,26,26) 19 | absorbReso = (1790,725,60,35) 20 | enterReso = (1790,725,180,35) 21 | ExitSample = 'ExitSample.png' 22 | bossHPSample = 'BossHPSample.png' 23 | absorbSample = 'AbsorbSample.png' 24 | EnterSample = 'EnterSample.png' 25 | absorbedNum = 0 26 | 27 | def picCompare(original_img1, original_img2): 28 | img1 = cv2.imread(original_img1) 29 | img2 = cv2.imread(original_img2) 30 | img1_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) 31 | img2_gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) 32 | mean1, mean2 = np.mean(img1_gray), np.mean(img2_gray) 33 | var1, var2 = np.var(img1_gray), np.var(img2_gray) 34 | cov = np.cov(img1_gray.flatten(), img2_gray.flatten())[0,1] 35 | c1 = (0.01*255) ** 2 36 | c2 = (0.03 * 255) ** 2 37 | ssim = (2 * mean1 * mean2 + c1) * (2 * cov + c2) / ((mean1 ** 2 + mean2 ** 2 + c1) * (var1 + var2 + c2)) 38 | return ssim 39 | 40 | def checkBossHP(): 41 | pyautogui.screenshot('BossHP.png', bossHPReso) 42 | bossHP = 'BossHP.png' 43 | ssim = picCompare(bossHPSample, bossHP) 44 | if ssim >= 0.3: 45 | return True 46 | else: 47 | return False 48 | 49 | def fight(): 50 | pyautogui.press('e') 51 | pyautogui.click(button='left', interval=0.2, clicks=10) 52 | pyautogui.press('2') 53 | pyautogui.press('q') 54 | pyautogui.click(button='left', interval=0.2, clicks=10) 55 | pyautogui.press('3') 56 | time.sleep(0.5) 57 | pyautogui.press('e') 58 | pyautogui.press('1') 59 | 60 | def checkEcho(): 61 | pyautogui.screenshot('Absorb.png', absorbReso) 62 | absorb = 'Absorb.png' 63 | ssim = picCompare(absorb, absorbSample) 64 | if ssim >= 0.8: 65 | return True 66 | else: 67 | return False 68 | 69 | #吸收声骸 70 | def echo(): 71 | pyautogui.click(button='middle') 72 | i = 0 73 | while i < 1: 74 | if checkEcho() == True: 75 | pyautogui.press('f', presses=2) 76 | return True 77 | else: 78 | pyautogui.keyDown('w') 79 | time.sleep(1) 80 | pyautogui.keyUp('w') 81 | i += 1 82 | i = 0 83 | while i < 1: 84 | if checkEcho() == True: 85 | pyautogui.press('f', presses=2) 86 | return True 87 | else: 88 | pyautogui.keyDown('a') 89 | time.sleep(1) 90 | pyautogui.keyUp('a') 91 | i += 1 92 | i = 0 93 | while i < 2: 94 | if checkEcho() == True: 95 | pyautogui.press('f', presses=2) 96 | return True 97 | else: 98 | pyautogui.keyDown('s') 99 | time.sleep(1) 100 | pyautogui.keyUp('s') 101 | i += 1 102 | i = 0 103 | while i < 2: 104 | if checkEcho() == True: 105 | pyautogui.press('f', presses=2) 106 | return True 107 | else: 108 | pyautogui.keyDown('d') 109 | time.sleep(1) 110 | pyautogui.keyUp('d') 111 | i += 1 112 | i = 0 113 | while i < 3: 114 | if checkEcho() == True: 115 | pyautogui.press('f', presses=2) 116 | return True 117 | else: 118 | pyautogui.keyDown('w') 119 | time.sleep(1) 120 | pyautogui.keyUp('w') 121 | i += 1 122 | i = 0 123 | while i < 3: 124 | if checkEcho() == True: 125 | pyautogui.press('f', presses=2) 126 | return True 127 | else: 128 | pyautogui.keyDown('a') 129 | time.sleep(1) 130 | pyautogui.keyUp('a') 131 | i += 1 132 | i = 0 133 | while i < 4: 134 | if checkEcho() == True: 135 | pyautogui.press('f', presses=2) 136 | return True 137 | else: 138 | pyautogui.keyDown('s') 139 | time.sleep(1) 140 | pyautogui.keyUp('s') 141 | i += 1 142 | i = 0 143 | while i < 4: 144 | if checkEcho() == True: 145 | pyautogui.press('f', presses=2) 146 | return True 147 | else: 148 | pyautogui.keyDown('d') 149 | time.sleep(1) 150 | pyautogui.keyUp('d') 151 | i += 1 152 | # print('未掉落声骸') 153 | 154 | #检查是否退出 155 | def checkExit(): 156 | pyautogui.screenshot('Enter.png', enterReso) 157 | enter = 'Enter.png' 158 | ssim = picCompare(EnterSample, enter) 159 | # print(ssim) 160 | if ssim >= 0.85: 161 | return True 162 | else: 163 | return False 164 | 165 | def run(): 166 | # 按F进入时序之寰 167 | pyautogui.press('f') 168 | # 选择推荐等级50 点击单人挑战 点击开启挑战 169 | pyautogui.moveTo(x=423, y=357) 170 | pyautogui.click(x=423, y=357, button='left', interval=0.5, clicks=3) 171 | pyautogui.click(x=2077, y=1296, button='left', interval=0.5, clicks=2) 172 | pyautogui.click(x=2077, y=1296, button='left', interval=0.5, clicks=2) 173 | # 检测是否成功载入游戏 174 | while True: 175 | pyautogui.screenshot('ExitIcon.png', multiPlayReso) 176 | exitIcon = 'ExitIcon.png' 177 | ssim = picCompare(ExitSample, exitIcon) 178 | if ssim >= 0.8: 179 | # print(ssim) 180 | break 181 | time.sleep(0.5) 182 | # 开始战斗流程 183 | pyautogui.keyDown('w') 184 | time.sleep(3) 185 | pyautogui.keyUp('w') 186 | while True: 187 | if checkBossHP() == True: 188 | fight() 189 | else: 190 | if checkBossHP() == True: 191 | fight() 192 | else: 193 | if checkBossHP() == True: 194 | fight() 195 | else: 196 | echo() 197 | pyautogui.press('esc') 198 | pyautogui.click(x=1718, y=893, button='left', interval=0.5, clicks=2) 199 | break 200 | time.sleep(5) 201 | 202 | def mainFunc(): 203 | time.sleep(1) 204 | dur = 0.8 205 | pyautogui.PAUSE = dur # 停顿时间 206 | pyautogui.FAILSAFE = True # 终止程序、声明异常 207 | print("开始运行脚本...") 208 | while True: 209 | pyautogui.click(button='right') 210 | time.sleep(1) 211 | if checkExit() == True: 212 | run() 213 | 214 | 215 | keyboard.add_hotkey(startHotkey, mainFunc) #启动脚本 216 | 217 | try: 218 | keyboard.wait('alt + d') 219 | except KeyboardInterrupt: 220 | ... 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | --------------------------------------------------------------------------------