From 3ef4d911b61a8b86a3eadd5744376fc89e38daac Mon Sep 17 00:00:00 2001 From: wangbing Date: Sat, 7 Sep 2024 23:17:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=87=87=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- legend/兵营_训练#L369,862.png | Bin 0 -> 2085 bytes legend/兵营_返回#L10,11.png | Bin 0 -> 1940 bytes legend/城镇_关闭面板#L337,395.png | Bin 0 -> 374 bytes legend/城镇_完成射手#L286,514.png | Bin 0 -> 822 bytes legend/城镇_完成盾兵#L286,403.png | Bin 0 -> 972 bytes legend/城镇_完成矛兵#L286,459.png | Bin 0 -> 861 bytes legend/城镇_打开面板#L4,394.png | Bin 0 -> 453 bytes legend/城镇_礼包#L458,44.png | Bin 600 -> 0 bytes legend/城镇_礼包#L459,45.png | Bin 0 -> 592 bytes legend/城镇_空闲射手#L297,505.png | Bin 0 -> 551 bytes legend/城镇_空闲盾兵#L309,464.png | Bin 0 -> 557 bytes legend/城镇_空闲矛兵#L298,451.png | Bin 0 -> 416 bytes legend/城镇_面板1未选中#L63,190.png | Bin 0 -> 1791 bytes legend/城镇_面板1选中#L59,188.png | Bin 0 -> 1871 bytes legend/城镇_面板2未选中#L221,190.png | Bin 0 -> 1848 bytes legend/城镇_面板2选中#L226,190.png | Bin 0 -> 1648 bytes legend/城镇_面板_空闲1#L144,280.png | Bin 0 -> 1715 bytes legend/城镇_面板_空闲2#L144,334.png | Bin 0 -> 1715 bytes legend/城镇_面板_空闲3#L144,388.png | Bin 0 -> 1715 bytes legend/城镇_面板_空闲4#L144,442.png | Bin 0 -> 1715 bytes legend/城镇_面板_空闲5#L144,496.png | Bin 0 -> 1715 bytes legend/城镇_面板_空闲6#L144,550.png | Bin 0 -> 1715 bytes legend/探险_返回#L4,4.png | Bin 3476 -> 0 bytes legend/探险_返回#L8,11.png | Bin 0 -> 2403 bytes legend/点击任意位置退出#L190,862.png | Bin 4198 -> 0 bytes legend/点击任意位置退出#L190,868.png | Bin 0 -> 2640 bytes legend/返回#L4,4.png | Bin 3476 -> 0 bytes legend/返回#L6,8.png | Bin 0 -> 2369 bytes legend/邮件_返回#L5,14.png | Bin 0 -> 1750 bytes ..._搜索面板_搜索按钮#L226,879.png} | Bin legend/野外_放大镜搜索#L19,632.png | Bin 0 -> 974 bytes src/main/java/xyz/wbsite/jmacro/JMacro.java | 95 +++--- .../xyz/wbsite/jmacro/base/ViewColor.java | 2 +- .../xyz/wbsite/jmacro/tool/PickLegend.java | 17 +- .../xyz/wbsite/jmacro/tool/PickPoint.java | 4 +- .../xyz/wbsite/jmacro/util/ColorUtil.java | 20 +- .../java/xyz/wbsite/jmacro/util/TaskUtil.java | 11 +- .../xyz/wbsite/jmacro/wjdr/MacroForWJDR.java | 22 +- .../jmacro/wjdr/task/Task_定位城镇.java | 18 +- .../jmacro/wjdr/task/Task_探险领取.java | 18 +- .../jmacro/wjdr/task/Task_状态检测.java | 108 +++++++ .../jmacro/wjdr/task/Task_自动练兵.java | 276 ++++++++++++++++++ .../jmacro/wjdr/task/Task_自动采矿.java | 84 +++--- .../wjdr/task/Task_邮箱礼包领取.java | 37 ++- 44 files changed, 588 insertions(+), 124 deletions(-) create mode 100644 legend/兵营_训练#L369,862.png create mode 100644 legend/兵营_返回#L10,11.png create mode 100644 legend/城镇_关闭面板#L337,395.png create mode 100644 legend/城镇_完成射手#L286,514.png create mode 100644 legend/城镇_完成盾兵#L286,403.png create mode 100644 legend/城镇_完成矛兵#L286,459.png create mode 100644 legend/城镇_打开面板#L4,394.png delete mode 100644 legend/城镇_礼包#L458,44.png create mode 100644 legend/城镇_礼包#L459,45.png create mode 100644 legend/城镇_空闲射手#L297,505.png create mode 100644 legend/城镇_空闲盾兵#L309,464.png create mode 100644 legend/城镇_空闲矛兵#L298,451.png create mode 100644 legend/城镇_面板1未选中#L63,190.png create mode 100644 legend/城镇_面板1选中#L59,188.png create mode 100644 legend/城镇_面板2未选中#L221,190.png create mode 100644 legend/城镇_面板2选中#L226,190.png create mode 100644 legend/城镇_面板_空闲1#L144,280.png create mode 100644 legend/城镇_面板_空闲2#L144,334.png create mode 100644 legend/城镇_面板_空闲3#L144,388.png create mode 100644 legend/城镇_面板_空闲4#L144,442.png create mode 100644 legend/城镇_面板_空闲5#L144,496.png create mode 100644 legend/城镇_面板_空闲6#L144,550.png delete mode 100644 legend/探险_返回#L4,4.png create mode 100644 legend/探险_返回#L8,11.png delete mode 100644 legend/点击任意位置退出#L190,862.png create mode 100644 legend/点击任意位置退出#L190,868.png delete mode 100644 legend/返回#L4,4.png create mode 100644 legend/返回#L6,8.png create mode 100644 legend/邮件_返回#L5,14.png rename legend/{野外_搜索#L226,879.png => 野外_搜索面板_搜索按钮#L226,879.png} (100%) create mode 100644 legend/野外_放大镜搜索#L19,632.png create mode 100644 src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_状态检测.java create mode 100644 src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动练兵.java diff --git a/legend/兵营_训练#L369,862.png b/legend/兵营_训练#L369,862.png new file mode 100644 index 0000000000000000000000000000000000000000..336eb71185515b721625ba088987c636045f6928 GIT binary patch literal 2085 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 P00000NkvXXu0mjf&9B*S literal 0 HcmV?d00001 diff --git a/legend/兵营_返回#L10,11.png b/legend/兵营_返回#L10,11.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3ec37a8b64ccfdc0da34cdd47aefb5baf81905 GIT binary patch literal 1940 zcmV;F2W$9=P)@_HTG>y<*SMF+-{IowGPO`#k&I&-?CoqglJR5z8eatsdb? zl~}jSh}0Yly8Euc?eV||z)eQUbM-nV0SAli2-%T~h}61ee^axZmm<>}5S~(t@Psn_ zD=8nP6}5Qq$3x8ee3(`RJ|H*9b#i+Sxa$Fu^KDoYqyMmiBXma)nplCg@x@5WwxaEP z2S&%nKus7Ye~{lvFX>ik=PXVR0bBQ#BOodV;U7w{h)kH)f-SoZFxl%daPK}m9EKo2hI)0wz@4s&5}G5#4#gM;)dU+zdcTxd8G7deqijFlh3t}Q94M^BKBFCb z^DCgsvmr%qLvoH4yIFM-vu)63SrIQ|L+n8-qS8(HKG7tvxW>O+i5W%i)MJ0qA$s*P zCfsgJ(63MYguYSSYv@tw=cY0=K8{hRi#S;hopMPW8J%ZTVPq7~1-u^`9!CG&0aVtV zz<05^(9CZFkyvCO$09G$)oa(`_IfeJ0Yy}AsmuN@V&?_-s)%aRujar)2Gm+U&!8XO zW5Ds79%!N&)vEet3=H0fn_hLQUcJ6xw|bxSESSWb5J78m0p{L0XwF{fV7VHXE$}}+ zxbvQ(`aTh&TU`>&eLiTM!ms?pi0ZN4k4UJ$;8UX#O8UIeJZ8Ch#3Mb-a7-x${;&F|gJWOvDLAA*FSv;bX6hY> zrjXfH&b_ssrQz(9vW+UjB|qL>@FjM3=iL&{vbAfUc}vlff+zrutg}VkPG}CcO(O3S zP)tA6u!}j#?7Qd{1HKe2?j7$GeF+^i5?Z(uop`1MMnw8;1qtb{WxO)X=}c$fY}gu6ty_ed4| z_wN!A5?h40s;kKE@F0)BFkJ&`xxE~FETQ3%gvO`9f5zq`zkCmiHnW3v=$upN^7C`g zB7(*9Gu$-F+05j1O+m9NIv-#Bn29wz^02+A4Qb6!k?ZiGm`=A`QT$!aee%R}CCcw2 zSWY~0p5ru+Dr2^eD|yrNiszNdwX*T9VMAkNGm_Q8IxPCluXYwu^nR?`{u|b(Rzh2I z6S?hP82M%~e`vp>cv}pxoJu01*~(-)dFDd*Fv}ucZS!~E@eVu zWvdu0vEq50QA*PzXd-lVat|E%s|hQk^!Vb3Oa%R6z)!|jWHb-SqRrec};(0!Qm)tOjZ&U0_KP-+Z zp~=-)v#S&VF$Riew72cYhO}zzYaWKtp+vfZK580PMEAT&wDi)0C%N=CzH4+$a^+me z?U;t1gXme`^fY!ZvntOq2Lr8W;0s0~t~pGa2H^ zkC5G!_&T;kKH+}8IZgg=O%yGX+47vr=!1p5=V8|DQ)5czzt-1&f`v!3P7fg9M;-na z`3pYTn1WCKv4+zN=vM_??^eo6M%A3`H!iyXo?ab;K? zW8_N*uyWf0dZ-d9je{_Bd0}SFuDqixce^NezQwD9NT8h7egyuMiO;rVFj56C2w>Fa zS^YDwKO1C$0nrA0#phq|DnU?!l|i)A1xJ=R=F1j2jNrryIU&Dfv{!7+ke4v7+yVW$ z3E9`Se#Ii^7TLXo;1;fgzU?-GcjjOf#RT)?!MiJ7h2IKJuo0_#6(Yk@Y8b#HvYvGr ajrc!`1{h*PUxPjX00001 z!ArtW90&0C?`3)FQgjG~x>yk%?9wF&Z;E0RF*+C?Vg-SAC?SLLU{Qo6RFp8WELW&# zb8c<>_BL>9bLtnqw-0ac{eB}JUl?PKdi)WrM_3e!C5WN~q9Z3<4JC1P`vjpQLen%0 z^%_{)MK)JJtKBhx9vhkq?jUuVN4?oHfepd? zimJjHGC3awlgyy<&O=cYxP?TSG)i0*vg{5FRD9$hNiv3o{0JgOg{UqU?L*xWpE3|v z{-CcKei})zXQ=V@z5&|M^gJ0MD-#6S^Y3F(!rbTg{l^A3pGd U6m0frQUCw|07*qoM6N<$f>K_br2qf` literal 0 HcmV?d00001 diff --git a/legend/城镇_完成射手#L286,514.png b/legend/城镇_完成射手#L286,514.png new file mode 100644 index 0000000000000000000000000000000000000000..4a23b195ed97e6c0db933563f01285d4315a73f4 GIT binary patch literal 822 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 literal 0 HcmV?d00001 diff --git a/legend/城镇_打开面板#L4,394.png b/legend/城镇_打开面板#L4,394.png new file mode 100644 index 0000000000000000000000000000000000000000..984112f2954935debea6431b87223e15294e35ac GIT binary patch literal 453 zcmV;$0XqJPP)n;@ ztd9@LHkQ{9(4aDgP+Um%yJbE_ZQGdeEcD^VLV^xXY*6-2MbT$PPH vKNkz{9z5{UZ?IlEFsNUGyw&h^uJ7;z1t%#t+vcm800000NkvXXu0mjf+rZ2f literal 0 HcmV?d00001 diff --git a/legend/城镇_礼包#L458,44.png b/legend/城镇_礼包#L458,44.png deleted file mode 100644 index c60d14beaa45690d22dc96076ba453fc752f706c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmV-e0;m0nP)cg*jgwph&_~g=tZdqPf2iYlbWQ_q`PD{HF1A@`(_}J+GKazg~zh9GoSgs`Mx*IvMgK;(=bpf6cAfn#J!!1;>~OrrCH1_?}9;mjzo~B!&S>==*=c97w6bnlNx2l1+gdhM=?7&i4U(|A(Ki$ zJ3A8-T!E<8)Jg?~WD-&=1~zcRiw8a*=4WPbM1vZo>sFaTE>}-ZkX~KI+khXe-|NA% zM-Q(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-)=5M`RCwB)l+9}sK^Vs8|MDa#coCu?co4nRTMu4Z^w3jMFM)bdS|#M#t@Myk z3nDH=B+>{{s?ZeDgpInXX?ER^53{@T@$(=#w9UuXf#){wZ=RX=eMT5#I4>n7E!QQ# zvBBM2H@SZG3aJ~{$UR-3>H=gY z$QXl+A{yVm@^*WhFXb}BUT-2~E@%wvb-Rp)!)% z1B@|KNl9q41Awbv4H6M{>1ED=D~-(9ztvV zul4^qh~xUX5m9lBmU3_qJ3~c)bA%x zKY$8D`mW1yvB>*umXFyihn9t3t)k*M*?*+9X5cu~3kB?Sn(V^`UMw#1X>E;PmPK%M ebSA80{T%=(z80V0HsZ7Z00000lUfPqDA$!7n9nNlrj&)w!=7QAxkTrFt8x;=b+g{vqbGte-1_jFOh8vy(&-I*h?nl!56V!i5Qt$ucW3E~5 z8y*tcx`}+{4p_%h5h(hkBgA0s9%9=S>q2XS4fY^k6=meqmH!J)Fe<>TO1%MaAc5W+ zL+4rGgd zxcc8|WjSHRWrG2dTPMX7?R4rXDZz$utG6BS7oX9K5R2(c&9a9F z?*{RWg-D6pipu5lVo-`VBS9`bb)aeMX20bVI@i3|f&e3n3FZ0$Kn7 literal 0 HcmV?d00001 diff --git a/legend/城镇_空闲盾兵#L309,464.png b/legend/城镇_空闲盾兵#L309,464.png new file mode 100644 index 0000000000000000000000000000000000000000..779848200ae11b8bf396a84ec90cb30fb6047712 GIT binary patch literal 557 zcmV+|0@D47P)NklDPgoG4a3wmXo9XqH(f;+Mcs6Oh%UlfsgaRF2aFC_ zwl>gc9V8uYQbL+m)C`+wAq`_|2W+`My_;wjF?!&`d-3vl-skzgQt{DN*6lftp{$m* zCEGC@>u{|!5R_$NvWB=IbA|;kv|1X9O>DItLaOkFFn0`LyyRue0VgiKo=>V3%m@*k zeu1=BN3>AQh^(fe#DruC#HjX1vGz`Lxb+bq^Ych4${*5#tkV$@^3&C8GGd$z_J<*S zrKLnPs((uJ{1D?#XyxCcqcg}`)e>gKMJ_QzMC`jr9Ocb_icw{exYIj9pxnxoIzOj0 zBlaItFGt$k{)!DP-E6w-V{en2U_o9^F{Tu9Ppcpq>)WYm?4ZJVhq4oGbXj*35*-oo z|1BjInb(F@T&T1o9l7D<`RF7MUIy8JwF~R97H&EAWrG@1E#r%(fX`z5plT@tMMYe! zzm3iP9;wmYL-<>QbqJc-R0$%a@RNKoZZAUzrWKtjAWU+MJE vY$MOWJ8GNnv;K^W^1CBg`r>o==YHWAH4ey`j_@i(00000NkvXXu0mjf8f693 literal 0 HcmV?d00001 diff --git a/legend/城镇_空闲矛兵#L298,451.png b/legend/城镇_空闲矛兵#L298,451.png new file mode 100644 index 0000000000000000000000000000000000000000..8b65a98537deeee89b9668db431dbd74e7e26de9 GIT binary patch literal 416 zcmV;R0bl-!P)0lUfJ07m_BSYLEpwsNuq#Cl?Sd;eODT%nAQ@@K#a1rJX(Y`l6B;(hB9v2Y zF+z%{wONdL{0OD7^48OL_4K}df^x%ya$Q8c`L=sBt;3u~h4GS<1j#ACB76v+6wjWs zCX?fei~UmwkV>ZQ97#gNmgN6P4h}@=ImomCsc7yJTW%rOlE~naV(}KaahG(1g^X@1 zYRxeA=n(utCJOSwZF00G)IDZO4O3(`8!@OVIg5?pDe>pbR}ptYJVJVxnYzI_wj38& z_D`raE}&@WrK!A{V@W6{G2xtvI7J+iaF(SqgtT@O+VN#>Tn{`v`Z&70p<{LvMavKc zHJwz|8?a{QGghjmqHl$=(Orbp#(s1YR_@$h-s5}mb9LupV0E8d-8j-V6Gi%YR5Q-+ zhY1?<21|!dyiY#9;`hID@9{FdV@IW*B&~IftdTwPR@^ApJiGxbhj%7*AY9-80000< KMNUMnLSTYeDY~uz literal 0 HcmV?d00001 diff --git a/legend/城镇_面板1未选中#L63,190.png b/legend/城镇_面板1未选中#L63,190.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0ebfcf15d044b85d18f3b732ce83481b32d2f4 GIT binary patch literal 1791 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 Vp%{IP?P>r3002ovPDHLkV1m-cm(~CP literal 0 HcmV?d00001 diff --git a/legend/点击任意位置退出#L190,862.png b/legend/点击任意位置退出#L190,862.png deleted file mode 100644 index f9986f29acfd51d799862c0243d476bff3ee1ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4198 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 T!}tt{NpbHo$`Y&nk@y7UA^ zpT+T-StBoE{|f?d4WEK2w!(b{@_DIGP=S+To4sW?2gEwtZ#;~9jX_7#QFzaN0cJ;^!m5;V zg!74?&H>vv{`O=``0bX2-FJb#1+|rFz6ZoweVp<+Q7z-7fgjQzLqPm~fI}?m%D)B~ zt1!@wBqqSv)Bz@DV`1s&51+6kEKaof#a--YCg=oV?;Fm1f7lMcg_5eTsD3S?^%5P!vgd)Pz zQQtDBl5a)40~qylMC(2d=w>w@gD1{`Z)g&JNW7~jv7Qqyj*=24)RSoHs-b9D1h<{H zpUn(5hRKLzKx$e)cdO z^Q_9K~A?$cLLU~9i`)MeR5k{AW zYpSt^(p|#`)P(p9q3IUv$bxEd9NwMa*Vu(dC7avKnUZqUcd6HhIpY(rWeA8lgODTT zSj)&ZabenXk2=;h(v=Jd#8V=xQ*t0E+vzKLUk-x( z%n&&GtKk$7372_M811_fW_B~tW2iIQ_Zic~JF%z++pNAzncAU~nLVt=`D1Eu0)E_^ z%d*#C19$E1oEiHIjR)<|gq6cIbm;XFI`kP069&|g=+xf^oy}|&*rAL0 sSah>=M0ZNLQ-3?O>dnAS?e#wW2U{R|BlTsy82|tP07*qoM6N<$g5@DNi~s-t literal 0 HcmV?d00001 diff --git a/legend/野外_搜索#L226,879.png b/legend/野外_搜索面板_搜索按钮#L226,879.png similarity index 100% rename from legend/野外_搜索#L226,879.png rename to legend/野外_搜索面板_搜索按钮#L226,879.png diff --git a/legend/野外_放大镜搜索#L19,632.png b/legend/野外_放大镜搜索#L19,632.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1c7fb5488062314991daf10ab132551b5f7c6d GIT binary patch literal 974 zcmV;<12O!GP)4#=&%v2;qNmSEo^gu-oNy0ubOC*&?wU(_`)V8(OTgYN z&9WA|pU%Cz-!Dz7J9FmV@4esqx#xV&=Nw_%(GmnlizY)vVi{7iojG{S^q9RY_e!$36+9Y>E;Depzttmbf9l6iJW#b_ z-^p?aVev}bENX^rYF@g)X3y#xCMKuR*wTp`4>U;1tmpF!Z5OPQGyHt>|Ks1Lajl>U zLR@++44r1lGj_P(bm286o!q&wqhDc?)h8s&S{J8Eu9kI2V^CP>*K~ zt@=R-_sZU2cFrk?H)*kc?T6vb40&G^8pD&Jt7 zk|IX8=vs!*-EWaL*lVxf4qDHqLlVK-$8CMOGqpy zR(g4qz1_zZTZ6{XOx*1`QOc{sHZ=#Ym;;JXNWb5NnYl%YM~`O}pGfG*8MO$BmTmAA zO<@ukvyfOBF5GQE&lf9i79xM&$QgmjK=)yQyxXYZ6#_N&jvx7Hln)z1I-;U(Kp*? z^lWqb%707*qoM6N<$g2m;}{r~^~ literal 0 HcmV?d00001 diff --git a/src/main/java/xyz/wbsite/jmacro/JMacro.java b/src/main/java/xyz/wbsite/jmacro/JMacro.java index 080d191..1983dc3 100644 --- a/src/main/java/xyz/wbsite/jmacro/JMacro.java +++ b/src/main/java/xyz/wbsite/jmacro/JMacro.java @@ -370,7 +370,7 @@ public abstract class JMacro { } Logger.info("查找图片:{}", pic.getAbsolutePath()); BufferedImage bufferedImage = ImageUtil.load(pic); - return findPic(viewRect, bufferedImage, minSimilar); + return findPic(viewRect, bufferedImage, minSimilar, true); } /** @@ -379,9 +379,10 @@ public abstract class JMacro { * @param viewRect 查找范围(不设时,取全屏) * @param pic 待查找图片 * @param minSimilar 相似度 + * @param fast 是否快速查找(快速查找通过优先定位四个顶点和中心,因此图的边缘和中心不能存在半透明等情况) * @return 匹配区域 */ - public ViewRect findPic(ViewRect viewRect, BufferedImage pic, double minSimilar) { + public ViewRect findPic(ViewRect viewRect, BufferedImage pic, double minSimilar, boolean fast) { // 当聚焦区域为null时,默认全屏查找 if (viewRect == null) { viewRect = getFocusRect() != null ? getFocusRect() : getScreenRect(); @@ -412,37 +413,44 @@ public abstract class JMacro { double maxSimilar = 0; for (int y = yMin; y <= yMax; y++) { for (int x = xMin; x <= xMax; x++) { - // 对关键点进行先期匹配,降低运算复杂度。如果关键点本身就不匹配,就没必要再去匹配小图的每一个像素点 - // 左上角 - boolean lt = ColorUtil.isSimilar(screenData[x - xMin][y - yMin], picData[0][0]); - // 右上角 - boolean rt = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() - 1][y - yMin], picData[pic.getWidth() - 1][0]); - // 左下角 - boolean lb = ColorUtil.isSimilar(screenData[x - xMin][y - yMin + pic.getHeight() - 1], picData[0][pic.getHeight() - 1]); - // 右下角 - boolean rb = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() - 1][y - yMin + pic.getHeight() - 1], picData[pic.getWidth() - 1][pic.getHeight() - 1]); - //中心点 - boolean cc = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() / 2][y - yMin + pic.getHeight() / 2], picData[pic.getWidth() / 2][pic.getHeight() / 2]); - if (lt && rt && lb && rb && cc) { - // 统计相似点数 - int samePixels = 0; - for (int smallY = 0; smallY < pic.getHeight(); smallY++) { - for (int smallX = 0; smallX < pic.getWidth(); smallX++) { - if (ColorUtil.isSimilar(screenData[x + smallX - xMin][y + smallY - yMin], picData[smallX][smallY])) { - samePixels++; - } - } + if (fast) { + // 对关键点进行先期匹配,降低运算复杂度。如果关键点本身就不匹配,就没必要再去匹配小图的每一个像素点 + // 左上角 + boolean lt = ColorUtil.isSimilar(screenData[x - xMin][y - yMin], picData[0][0]); + // 右上角 + boolean rt = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() - 1][y - yMin], picData[pic.getWidth() - 1][0]); + // 左下角 + boolean lb = ColorUtil.isSimilar(screenData[x - xMin][y - yMin + pic.getHeight() - 1], picData[0][pic.getHeight() - 1]); + // 右下角 + boolean rb = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() - 1][y - yMin + pic.getHeight() - 1], picData[pic.getWidth() - 1][pic.getHeight() - 1]); + //中心点 + boolean cc = ColorUtil.isSimilar(screenData[x - xMin + pic.getWidth() / 2][y - yMin + pic.getHeight() / 2], picData[pic.getWidth() / 2][pic.getHeight() / 2]); + // 五个关键点不一致,则没必要继续比下去 + // 但要注意四个顶点和中心存在半透明情况,会导致关键点定位不准 + if (!lt || !rt || !lb || !rb || !cc) { + continue; } - // 计算相似度 - double similar = (double) samePixels / (pic.getWidth() * pic.getHeight()); - maxSimilar = Math.max(maxSimilar, similar); - if (similar >= minSimilar) { - return new ViewRect(x, y, x + pic.getWidth(), y + pic.getHeight(), similar); + } + + // 统计相似点数 + int samePixels = 0; + for (int smallY = 0; smallY < pic.getHeight(); smallY++) { + for (int smallX = 0; smallX < pic.getWidth(); smallX++) { + if (ColorUtil.isSimilar(screenData[x + smallX - xMin][y + smallY - yMin], picData[smallX][smallY])) { + samePixels++; + } } } + // 计算相似度 + double similar = (double) samePixels / (pic.getWidth() * pic.getHeight()); + maxSimilar = Math.max(maxSimilar, similar); + if (similar >= minSimilar) { + return new ViewRect(x, y, x + pic.getWidth(), y + pic.getHeight(), similar); + } } } - if (maxSimilar > 0.1D) { + if (maxSimilar > 0.5D) { + ImageUtil.show(viewRect); Logger.info("最大相似度{}", NumberUtil.formatPercent(maxSimilar, 0)); } return null; @@ -497,7 +505,7 @@ public abstract class JMacro { BufferedImage pic = ImageUtil.load(picFile); return TaskUtil.timeTask(() -> { while (JMainService.getInstance().run) { - ViewRect result = findPic(rect, pic, minSimilar); + ViewRect result = findPic(rect, pic, minSimilar, true); if (result != null) { return result; } @@ -548,7 +556,7 @@ public abstract class JMacro { */ public ViewRect findLegend(ViewRect rect, Legend legend, double minSimilar) { Logger.info("查找图例:{}", legend.getName()); - return findPic(rect, legend.getImage(), minSimilar); + return findPic(rect, legend.getImage(), minSimilar, true); } /** @@ -562,7 +570,7 @@ public abstract class JMacro { Logger.info("等待并查找图例:{}", legend.getName()); return TaskUtil.timeTask(() -> { while (JMainService.getInstance().run) { - ViewRect result = findPic(rect, legend.getImage(), minSimilar); + ViewRect result = findPic(rect, legend.getImage(), minSimilar, true); if (result != null) { return result; } @@ -645,7 +653,7 @@ public abstract class JMacro { viewRect.setRight(viewRect.getLeft() + image.getWidth()); viewRect.setBottom(viewRect.getTop() + image.getHeight()); Logger.info("匹配图例:{},区域:{}", legend.getName(), viewRect); - return findPic(viewRect, image, minSimilar); + return findPic(viewRect, image, minSimilar, false); } /** @@ -681,7 +689,7 @@ public abstract class JMacro { Logger.info("等待并匹配图例:{},区域:{}", legend.getName(), viewRect); return TaskUtil.timeTask(() -> { while (JMainService.getInstance().run) { - ViewRect result = findPic(viewRect, image, minSimilar); + ViewRect result = findPic(viewRect, image, minSimilar, false); if (result != null) { return result; } @@ -827,12 +835,29 @@ public abstract class JMacro { * @return 是否匹配 */ public boolean matchColor(ViewColor color) { - ViewRect of = of(color.getX(), color.getY(), color.getX(), color.getY()); + ViewRect rect = new ViewRect(color.getX(), color.getY(), color.getX(), color.getY()); + // 获取实时屏幕 + BufferedImage pointImage = capture(robot, rect); + ImageUtil.show(pointImage); + int[][] pointData = ImageUtil.getImageRGB(pointImage); + boolean similar = ColorUtil.isSimilar(pointData[0][0], color.getColor()); + Logger.info("比较色值:{},{} ==> {}", Integer.toHexString(pointData[0][0]), Integer.toHexString(color.getColor()), similar ? "相似" : "不同"); + return similar; + } + + /** + * 匹配指定坐标色值 + * + * @param point 坐标点 + * @return 是否匹配 + */ + public String takeColor(ViewPoint point) { + ViewRect of = of(point.getX(), point.getY(), point.getX(), point.getY()); // 获取实时屏幕 BufferedImage pointImage = capture(robot, of); ImageUtil.show(pointImage); int[][] pointData = ImageUtil.getImageRGB(pointImage); - return ColorUtil.isSimilar(pointData[0][0], color.getColor()); + return "#" + Integer.toHexString(pointData[0][0]); } /** diff --git a/src/main/java/xyz/wbsite/jmacro/base/ViewColor.java b/src/main/java/xyz/wbsite/jmacro/base/ViewColor.java index 30f8c4d..96028dc 100644 --- a/src/main/java/xyz/wbsite/jmacro/base/ViewColor.java +++ b/src/main/java/xyz/wbsite/jmacro/base/ViewColor.java @@ -19,7 +19,7 @@ public class ViewColor extends ViewPoint { /** * @param x 坐标 * @param y 坐标 - * @param hexColor argb值 例如#FFFFFF + * @param hexColor rgb值 例如#FFFFFF */ public ViewColor(int x, int y, String hexColor) { super(x, y); diff --git a/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java b/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java index f437bcd..487b27d 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/PickLegend.java @@ -11,13 +11,7 @@ import xyz.wbsite.jmacro.util.Logger; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.List; @@ -219,16 +213,19 @@ public class PickLegend extends JFrame { if (returnVal == JFileChooser.APPROVE_OPTION) { // 默认文件 File file = jFileChooser.getSelectedFile(); - String name = file.getName().replaceAll("\\.png",""); + String name = file.getName().replaceAll("\\.png", ""); String legendName = name.split("#")[0]; String prefix = legendName + "#"; - List files = FileUtil.loopFiles(Legend.getDefaultBase(), pathname -> pathname.getName().startsWith(prefix)); + List files = FileUtil.loopFiles(Legend.getDefaultBase(), pathname -> pathname.getName().startsWith(legendName)); if (files.size() > 0) { DialogUtil.confirm("提示", "存在相同图例,是否旧的删除?", result -> { if (result) { for (File file1 : files) { - file1.deleteOnExit(); + boolean delete = file1.delete(); + if (!delete) { + Logger.error("删除失败,{}", file1.getAbsolutePath()); + } } } }); diff --git a/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java b/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java index 1318829..a5e3f2b 100644 --- a/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java +++ b/src/main/java/xyz/wbsite/jmacro/tool/PickPoint.java @@ -106,8 +106,8 @@ public class PickPoint extends JFrame { Logger.info("坐标色值:[#{}]", hexColor); Logger.info("用法示例:"); - Logger.info("1、点击坐标:mouseLeftClick(of({},{}));", x - originX, y - originY); - Logger.info("2、色值比对:matchColor(of({},{},\"#{}\"));", x - originX, y - originY, hexColor); + Logger.info("1、点击坐标:macro.mouseLeftClick(macro.of({},{}));", x - originX, y - originY); + Logger.info("2、色值比对:macro.matchColor(macro.of({},{},\"#{}\"));", x - originX, y - originY, hexColor); Logger.info("=========================坐标采集========================="); close(); diff --git a/src/main/java/xyz/wbsite/jmacro/util/ColorUtil.java b/src/main/java/xyz/wbsite/jmacro/util/ColorUtil.java index 4f91dc1..f9fbc24 100644 --- a/src/main/java/xyz/wbsite/jmacro/util/ColorUtil.java +++ b/src/main/java/xyz/wbsite/jmacro/util/ColorUtil.java @@ -1,5 +1,8 @@ package xyz.wbsite.jmacro.util; +import java.awt.image.BufferedImage; +import java.io.File; + /** * 颜色比对工具 * @@ -45,14 +48,15 @@ public class ColorUtil { * @return 是否相似 */ public static boolean isSimilar(int colorInt1, int colorInt2) { - // 透明色认为相似 - if ((colorInt1 >> 24 & 0xff) == 0) { - return true; - } - // 图例中的透明色认为相似 - if ((colorInt2 >> 24 & 0xff) == 0) { - return true; - } return calculateSimilarity(colorInt1, colorInt2) > THRESHOLD_OF_SIMILARITY; } + + public static void main(String[] args) { + + int color1 = 0xf6fbff; // 白色 + int color2 = 0xfefefe; // 非常接近白色的颜色 + + double similarity = calculateSimilarity(color1, color2); + System.out.println("Similarity: " + similarity); // 输出相似度 + } } diff --git a/src/main/java/xyz/wbsite/jmacro/util/TaskUtil.java b/src/main/java/xyz/wbsite/jmacro/util/TaskUtil.java index af4b1af..d1f5fd7 100644 --- a/src/main/java/xyz/wbsite/jmacro/util/TaskUtil.java +++ b/src/main/java/xyz/wbsite/jmacro/util/TaskUtil.java @@ -201,11 +201,18 @@ public class TaskUtil extends CronUtil { * @param time 毫秒 */ public static T timeTask(Callable callable, long time, TimeUnit unit) { + Future submit = null; try { CompletionService completionService = ThreadUtil.newCompletionService(); - Future submit = completionService.submit(callable); + submit = completionService.submit(callable); return submit.get(time, unit); - } catch (Exception e) { + } catch (InterruptedException e) { + return null; + } catch (ExecutionException e) { + e.printStackTrace(); + return null; + } catch (TimeoutException e) { + submit.cancel(true); return null; } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java b/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java index 413f095..48c1da7 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/MacroForWJDR.java @@ -80,6 +80,10 @@ public class MacroForWJDR extends JMacro { // 任意界面优先返回城镇 new Task_定位城镇(this, focusRect).run(); + // 检测状态 + Task_状态检测 task_状态检测 = new Task_状态检测(this, focusRect); + task_状态检测.run(); + // 可按优先级排序以下任务 { // 矿场攻击检测任务 @@ -89,14 +93,26 @@ public class MacroForWJDR extends JMacro { new Task_收留避难者(this, focusRect).run(); // 邮箱礼包领取 - new Task_邮箱礼包领取(this, focusRect).run(); + if (task_状态检测.有邮件奖励) { + new Task_邮箱礼包领取(this, focusRect).run(); + } // 探险领取 - new Task_探险领取(this, focusRect).run(); + if (task_状态检测.有探险奖励) { + new Task_探险领取(this, focusRect).run(); + } + + // 自动练兵 + new Task_自动练兵(this, focusRect).run(); // 自动采矿任务 - new Task_自动采矿(this, focusRect).run(); + if (task_状态检测.有空闲队列()) { + new Task_自动采矿(this, focusRect).run(); + } } + + Logger.info("休眠1分钟..."); + delay(60 * 1000); } } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java index af0413b..7cbcc3b 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_定位城镇.java @@ -21,6 +21,13 @@ public class Task_定位城镇 extends BaseTask { return; } } + {// 探险返回 + ViewRect rect = macro.matchLegend("探险_返回", 0.9); + if (rect != null) { + macro.mouseLeftClick(rect); + Logger.info("返回城镇"); + } + } {// 野外返回 ViewRect rect = macro.matchLegend("城镇", 0.9); if (rect != null) { @@ -29,12 +36,19 @@ public class Task_定位城镇 extends BaseTask { } } {// 其他页面返回 - ViewRect rect = macro.matchLegend("返回", 0.9); + ViewRect rect = macro.matchLegend("返回", 0.5); if (rect != null) { macro.mouseLeftClick(rect); Logger.info("返回城镇"); } } + {// 侧边面板关闭 + ViewRect rect = macro.matchLegend("城镇_关闭面板", 0.6); + if (rect != null) { + macro.mouseLeftClick(rect); + Logger.info("关闭侧面板"); + } + } { // 定位弹框,关闭弹框 ViewRect rect = macro.findLegend(macro.of(437, 28, 491, 106), "城镇_礼包", 0.7); if (rect != null) { @@ -73,7 +87,7 @@ public class Task_定位城镇 extends BaseTask { } } {// 点击任务位置退出 - ViewRect rect = macro.matchLegend("点击任意位置退出", 0.9); + ViewRect rect = macro.matchLegend("点击任意位置退出", 0.5); if (rect != null) { macro.mouseLeftClick(rect); Logger.info("点击任意位置退出"); diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领取.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领取.java index fa02269..88f2195 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领取.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_探险领取.java @@ -12,21 +12,13 @@ public class Task_探险领取 extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { - Logger.info("定位【探险】按钮"); - ViewRect 城镇_探险 = macro.waitAndMatchLegend("城镇_探险", 0.9); - if (城镇_探险 == null) { + boolean 有探险奖励 = macro.matchColor(macro.of(71, 877, "#ff1e1f")); + if (!有探险奖励) { + Logger.info("探险奖励未满,跳过"); return; } - - Logger.info("点击【探险】按钮"); - macro.mouseLeftClick(城镇_探险); - - ViewRect 探险_按钮 = macro.waitAndMatchLegend("探险_按钮", 0.9); - if (探险_按钮 == null) { - Logger.info("进入探险界面失败"); - return; - } - Logger.info("进入探险界面成功"); + Logger.info("进入探险页面,领取奖励"); + macro.mouseLeftClick(macro.of(71, 877)); ViewRect[] viewRects = macro.waitAndMatchLegends(0.9, 5, "探险_领取", "探险_不可领取"); if (viewRects[0] != null) { // 可以领取 diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_状态检测.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_状态检测.java new file mode 100644 index 0000000..172c53c --- /dev/null +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_状态检测.java @@ -0,0 +1,108 @@ +package xyz.wbsite.jmacro.wjdr.task; + +import xyz.wbsite.jmacro.JMacro; +import xyz.wbsite.jmacro.base.ViewRect; +import xyz.wbsite.jmacro.util.Logger; + +public class Task_状态检测 extends BaseTask { + + public boolean 队列1空闲; + public boolean 队列2空闲; + public boolean 队列3空闲; + public boolean 队列4空闲; + public boolean 队列5空闲; + public boolean 队列6空闲; + + public boolean 满体力; + public boolean 有任务奖励; + public boolean 有邮件奖励; + public boolean 有探险奖励; + + public Task_状态检测(JMacro macro, ViewRect viewRect) { + super(macro, viewRect); + } + + @Override + public void task(JMacro macro, ViewRect viewRect) { + Logger.info("读取行军状态"); + { + Logger.info("检测面板状态"); + ViewRect[] viewRects = macro.matchLegends(0.6, "城镇_打开面板", "城镇_关闭面板"); + if (viewRects[0] == null && viewRects[1] == null) { + Logger.info("检测面板状态失败"); + return; + } + + if (viewRects[0] != null) { + Logger.info("打开面板"); + macro.mouseLeftClick(viewRects[0]); + macro.delay(1000); + } + + Logger.info("选中城镇"); + macro.mouseLeftClick(macro.of(85,200)); + macro.delay(1000); + // todo + + Logger.info("选中野外"); + macro.mouseLeftClick(macro.of(245,200)); + macro.delay(1000); + + ViewRect[] viewRects1 = macro.matchLegends(0.6D, + "城镇_面板_空闲1", + "城镇_面板_空闲2", + "城镇_面板_空闲3", + "城镇_面板_空闲4", + "城镇_面板_空闲5", + "城镇_面板_空闲6" + ); + + if (null != macro.matchLegend("城镇_面板_空闲1", 0.6D)) { + 队列1空闲 = true; + Logger.info("队列1空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲2", 0.6D)) { + 队列2空闲 = true; + Logger.info("队列2空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲3", 0.6D)) { + 队列3空闲 = true; + Logger.info("队列3空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲4", 0.6D)) { + 队列4空闲 = true; + Logger.info("队列4空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲5", 0.6D)) { + 队列5空闲 = true; + Logger.info("队列5空闲"); + } + if (null != macro.matchLegend("城镇_面板_空闲6", 0.6D)) { + 队列6空闲 = true; + Logger.info("队列6空闲"); + } + } + + ViewRect 城镇_关闭面板 = macro.matchLegend("城镇_关闭面板", 0.6); + if (城镇_关闭面板 == null) { + Logger.info("关闭面板异常"); + return; + } + Logger.info("关闭面板"); + macro.mouseLeftClick(城镇_关闭面板); + + {// 任务奖励 + 有任务奖励 = macro.matchColor(macro.of(43, 759, "#ff3939")); + } + {// 邮件奖励 + 有邮件奖励 = macro.matchColor(macro.of(506, 751, "#fe3939")); + } + {// 探险奖励 + 有探险奖励 = macro.matchColor(macro.of(71,877,"#ff1e1f")); + } + } + + public boolean 有空闲队列() { + return 队列1空闲 || 队列2空闲 || 队列3空闲 || 队列4空闲 || 队列5空闲 || 队列6空闲; + } +} diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动练兵.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动练兵.java new file mode 100644 index 0000000..7b17a7f --- /dev/null +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动练兵.java @@ -0,0 +1,276 @@ +package xyz.wbsite.jmacro.wjdr.task; + +import xyz.wbsite.jmacro.JMacro; +import xyz.wbsite.jmacro.base.ViewRect; +import xyz.wbsite.jmacro.util.Logger; + +public class Task_自动练兵 extends BaseTask { + + public Task_自动练兵(JMacro macro, ViewRect viewRect) { + super(macro, viewRect); + } + + @Override + public void task(JMacro macro, ViewRect viewRect) { + 盾兵自动训练(macro, viewRect); + 矛兵自动训练(macro, viewRect); + 射手自动训练(macro, viewRect); + } + + private void 盾兵自动训练(JMacro macro, ViewRect viewRect) { + Logger.info("检测面板状态"); + ViewRect[] viewRects = macro.matchLegends(0.6, "城镇_打开面板", "城镇_关闭面板"); + if (viewRects == null) { + Logger.info("检测面板状态检测失败"); + return; + } + if (viewRects[0] != null) { + Logger.info("打开面板"); + macro.mouseLeftClick(viewRects[0]); + macro.delay(1000); + } + + if (viewRects[1] != null) { + Logger.info("面板已打开"); + } + + Logger.info("选中城镇"); + macro.mouseLeftClick(macro.of(85, 200)); + macro.delay(1000); + + Logger.info("检测盾兵"); + ViewRect[] viewRects2 = macro.waitAndMatchLegends(0.9D, 3, "城镇_完成盾兵", "城镇_空闲盾兵"); + if (viewRects2 == null) { + Logger.info("检测失败"); + return; + } + if (viewRects2[0] != null) { + Logger.info("训练完成,去领取"); + macro.mouseLeftClick(viewRects2[0]); + macro.delay(1000); + Logger.info("点击领取"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击兵营"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + Logger.error("确认训练"); + macro.mouseLeftClick(macro.of(396, 885)); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[1] != null) { + Logger.info("兵营空闲,去练兵"); + macro.mouseLeftClick(viewRects2[1]); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + Logger.error("确认训练"); + macro.mouseLeftClick(macro.of(396, 885)); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[0] != null && viewRects2[1] != null) { + Logger.info("关闭面板"); + ViewRect rect = macro.matchLegend("城镇_关闭面板", 0.6); + if (rect == null) { + return; + } + macro.mouseLeftClick(rect); + } + } + + private void 矛兵自动训练(JMacro macro, ViewRect viewRect) { + Logger.info("检测面板状态"); + ViewRect[] viewRects = macro.matchLegends(0.6, "城镇_打开面板", "城镇_关闭面板"); + if (viewRects == null) { + Logger.info("检测面板状态检测失败"); + return; + } + if (viewRects[0] != null) { + Logger.info("打开面板"); + macro.mouseLeftClick(viewRects[0]); + macro.delay(1000); + } + + if (viewRects[1] != null) { + Logger.info("面板已打开"); + } + + Logger.info("选中城镇"); + macro.mouseLeftClick(macro.of(85, 200)); + macro.delay(1000); + + Logger.info("检测矛兵"); + ViewRect[] viewRects2 = macro.waitAndMatchLegends(0.9D, 3, "城镇_完成矛兵", "城镇_空闲矛兵"); + if (viewRects2 == null) { + Logger.info("检测失败"); + return; + } + if (viewRects2[0] != null) { + Logger.info("训练完成,去领取"); + macro.mouseLeftClick(viewRects2[0]); + macro.delay(1000); + Logger.info("点击领取"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击兵营"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + ViewRect 兵营_训练 = macro.waitAndMatchLegend("兵营_训练", 0.9, 2); + if (兵营_训练 == null) { + Logger.error("训练失败,未检测到兵营训练"); + } + Logger.error("确认训练"); + macro.mouseLeftClick(兵营_训练); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[1] != null) { + Logger.info("兵营空闲,去练兵"); + macro.mouseLeftClick(viewRects2[1]); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + Logger.error("确认训练"); + macro.mouseLeftClick(macro.of(396, 885)); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[0] != null && viewRects2[1] != null) { + Logger.info("关闭面板"); + ViewRect rect = macro.matchLegend("城镇_关闭面板", 0.6); + if (rect == null) { + return; + } + macro.mouseLeftClick(rect); + } + } + + private void 射手自动训练(JMacro macro, ViewRect viewRect) { + Logger.info("检测面板状态"); + ViewRect[] viewRects = macro.matchLegends(0.6, "城镇_打开面板", "城镇_关闭面板"); + if (viewRects == null) { + Logger.info("检测面板状态检测失败"); + return; + } + if (viewRects[0] != null) { + Logger.info("打开面板"); + macro.mouseLeftClick(viewRects[0]); + macro.delay(1000); + } + + if (viewRects[1] != null) { + Logger.info("面板已打开"); + } + + Logger.info("选中城镇"); + macro.mouseLeftClick(macro.of(85, 200)); + macro.delay(1000); + + Logger.info("检测矛兵"); + ViewRect[] viewRects2 = macro.waitAndMatchLegends(0.9D, 3, "城镇_完成射手", "城镇_空闲射手"); + if (viewRects2 == null) { + Logger.info("检测失败"); + return; + } + if (viewRects2[0] != null) { + Logger.info("训练完成,去领取"); + macro.mouseLeftClick(viewRects2[0]); + macro.delay(1000); + Logger.info("点击领取"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击兵营"); + macro.mouseLeftClick(macro.of(268, 431)); + macro.delay(1000); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + ViewRect 兵营_训练 = macro.waitAndMatchLegend("兵营_训练", 0.9, 2); + if (兵营_训练 == null) { + Logger.error("训练失败,未检测到兵营训练"); + } + Logger.error("确认训练"); + macro.mouseLeftClick(兵营_训练); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[1] != null) { + Logger.info("兵营空闲,去练兵"); + macro.mouseLeftClick(viewRects2[1]); + + Logger.info("点击训练"); + macro.mouseLeftClick(macro.of(355, 632)); + macro.delay(1000); + + Logger.error("确认训练"); + macro.mouseLeftClick(macro.of(396, 885)); + macro.delay(1000); + + ViewRect 兵营_返回 = macro.matchLegend("兵营_返回", 0.9D); + if (兵营_返回 == null) { + Logger.error("兵营返回失败"); + } + macro.mouseLeftClick(兵营_返回); + macro.delay(1000); + } + if (viewRects2[0] != null && viewRects2[1] != null) { + Logger.info("关闭面板"); + ViewRect rect = macro.matchLegend("城镇_关闭面板", 0.6); + if (rect == null) { + return; + } + macro.mouseLeftClick(rect); + } + } +} diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java index d44d839..9a85f17 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_自动采矿.java @@ -4,7 +4,6 @@ import cn.hutool.json.JSONUtil; import xyz.wbsite.jmacro.JMacro; import xyz.wbsite.jmacro.base.ViewRect; import xyz.wbsite.jmacro.util.Logger; -import xyz.wbsite.jmacro.util.TaskUtil; public class Task_自动采矿 extends BaseTask { @@ -34,20 +33,6 @@ public class Task_自动采矿 extends BaseTask { Logger.info("定位野外按钮成功"); } - Logger.info("点击资源搜索按钮"); - macro.delayUnstable(1000); - macro.mouseLeftClick(macro.of(33, 648)); - - Logger.info("等待搜索面板"); - ViewRect 野外_搜索 = macro.waitAndMatchLegend("野外_搜索", 0.9); - if (野外_搜索 == null) { - Logger.error("未检测到【待搜索面板】,采矿终止"); - return; - } - - Logger.info("拖动面板"); - macro.mouseLeftDrag(macro.of(433, 679), macro.of(61, 682), true); - Logger.info("开始采集资源"); String[] types = new String[]{ "生肉", "木材", "煤矿", "铁矿" @@ -81,8 +66,28 @@ public class Task_自动采矿 extends BaseTask { * @return 采集是否结束(满队则返回true,接下来的采集也不需要了) */ private boolean collect(String type, int level) { + Logger.info("查看放大镜搜索"); + ViewRect 野外_放大镜搜索 = macro.waitAndMatchLegend("野外_放大镜搜索", 0.4); + if (野外_放大镜搜索 == null) { + Logger.error("未检测到【放大镜搜索】,采矿终止"); + return false; + } + + Logger.info("点击放大镜搜索按钮"); + macro.mouseLeftClick(野外_放大镜搜索); + + Logger.info("等待搜索面板"); + ViewRect 野外_搜索面板_搜索按钮 = macro.waitAndMatchLegend("野外_搜索面板_搜索按钮", 0.9); + if (野外_搜索面板_搜索按钮 == null) { + Logger.error("未检测到【待搜索面板】,采矿终止"); + return false; + } + + Logger.info("拖动面板"); + macro.mouseLeftDrag(macro.of(433, 679), macro.of(61, 682), true); + Logger.info("定位【野外_资源搜索_{}】图标", type); - ViewRect typeRect = macro.waitAndMatchLegend("野外_资源搜索_" + type, 0.9); + ViewRect typeRect = macro.waitAndMatchLegend("野外_资源搜索_" + type, 0.9, 2); if (typeRect == null) { Logger.error("定位【{}】图标失败", type); return false; @@ -91,18 +96,31 @@ public class Task_自动采矿 extends BaseTask { Logger.info("选择【{}】图标,坐标[{},{}]", type, typeRect.getCenter()[0], typeRect.getCenter()[1]); macro.mouseLeftClick(typeRect); - int clevel = getLevel(); - if (clevel > level) { - TaskUtil.execTask(() -> { - Logger.info("调整等级"); - macro.mouseLeftClick(macro.of(51, 777)); - }, clevel - level, 1000); - } - if (clevel < level) { - TaskUtil.execTask(() -> { - Logger.info("调整等级"); - macro.mouseLeftClick(macro.of(360, 777)); - }, level - clevel, 1000); + switch (level) { + case 1: + macro.mouseLeftClick(macro.of(93, 777)); + break; + case 2: + macro.mouseLeftClick(macro.of(125, 777)); + break; + case 3: + macro.mouseLeftClick(macro.of(158, 777)); + break; + case 4: + macro.mouseLeftClick(macro.of(192, 777)); + break; + case 5: + macro.mouseLeftClick(macro.of(223, 777)); + break; + case 6: + macro.mouseLeftClick(macro.of(256, 777)); + break; + case 7: + macro.mouseLeftClick(macro.of(288, 777)); + break; + case 8: + macro.mouseLeftClick(macro.of(321, 777)); + break; } ViewRect 野外_资源搜索 = macro.matchLegend("野外_资源搜索", 0.9); @@ -141,14 +159,4 @@ public class Task_自动采矿 extends BaseTask { return true; } - - private int getLevel() { - for (int i = 1; i <= 8; i++) { - ViewRect 等级 = macro.matchLegend("野外_资源等级" + i, 0.99); - if (等级 != null) { - return i; - } - } - return 0; - } } diff --git a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_邮箱礼包领取.java b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_邮箱礼包领取.java index f024a28..a2b808b 100644 --- a/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_邮箱礼包领取.java +++ b/src/main/java/xyz/wbsite/jmacro/wjdr/task/Task_邮箱礼包领取.java @@ -13,7 +13,7 @@ public class Task_邮箱礼包领取 extends BaseTask { @Override public void task(JMacro macro, ViewRect viewRect) { Logger.info("检测邮箱待领取礼包"); - boolean b = macro.matchColor(macro.of(505, 750, "#fd3939")); + boolean b = macro.matchColor(macro.of(506, 751, "#fe3939")); if (!b) { Logger.info("邮箱无待领取礼包"); return; @@ -25,10 +25,28 @@ public class Task_邮箱礼包领取 extends BaseTask { // todo 战争 // todo 联盟 - // todo 系统 + // 系统 + if (macro.matchColor(macro.of(297, 70, "#fe3939"))) { + macro.mouseLeftClick(macro.of(297, 70)); + macro.delay(500); + + ViewRect 一键已读领取 = macro.waitAndMatchLegend("一键已读领取", 0.9, 2); + if (一键已读领取 == null) { + Logger.info("异常结束"); + return; + } + macro.mouseLeftClick(一键已读领取); + + ViewRect 点击任意位置退出 = macro.waitAndMatchLegend("点击任意位置退出", 0.5, 2); + if (点击任意位置退出 != null) { + Logger.info("点击任意位置退出"); + macro.mouseLeftClick(点击任意位置退出); + macro.delay(500); + } + } // 报告 - if (macro.matchColor(macro.of(398,71,"#ff3a3a"))){ + if (macro.matchColor(macro.of(398, 71, "#fe3939"))) { macro.mouseLeftClick(macro.of(398, 71)); macro.delay(500); @@ -39,16 +57,15 @@ public class Task_邮箱礼包领取 extends BaseTask { } macro.mouseLeftClick(一键已读领取); - ViewRect 点击任意位置退出 = macro.waitAndMatchLegend("点击任意位置退出", 0.9); - - if (点击任意位置退出 == null) { - Logger.info("异常结束"); - return; + ViewRect 点击任意位置退出 = macro.waitAndMatchLegend("点击任意位置退出", 0.5, 2); + if (点击任意位置退出 != null) { + Logger.info("点击任意位置退出"); + macro.mouseLeftClick(点击任意位置退出); + macro.delay(500); } - macro.mouseLeftClick(点击任意位置退出); } - ViewRect rect = macro.matchLegend("返回", 0.9); + ViewRect rect = macro.matchLegend("邮件_返回", 0.9); if (rect != null) { macro.mouseLeftClick(rect); Logger.info("返回城镇");