From 69cc60a4fed642b395d4a9b0bebc1ebaf7b949ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B7=E4=B8=AA=E5=90=8D=E5=AD=97=E5=A5=BD=E9=9A=BE?= =?UTF-8?q?=E7=9A=84=E5=96=B5?= <25520958+MisakaAldrich@users.noreply.github.com> Date: Thu, 26 Mar 2026 15:20:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=9A=E7=9F=A5=E6=91=A7=E6=AF=81?= =?UTF-8?q?=E8=8E=B7=E5=BE=97=E7=9A=84=E6=91=A9=E6=8B=89=E6=95=B0=E9=87=8F?= =?UTF-8?q?=20(#3000)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 添加摧毁完毕通知 * feat: 添加获取摩拉数量通知 --- .../Assets/RecognitionObject/Mora.png | Bin 0 -> 2414 bytes .../Assets/RecognitionObject/贵重物品.png | Bin 0 -> 2676 bytes .../Assets/RecognitionObject/贵重物品2.png | Bin 0 -> 2645 bytes .../Assets/背包摩拉数字/0.png | Bin 0 -> 616 bytes .../Assets/背包摩拉数字/1.png | Bin 0 -> 446 bytes .../Assets/背包摩拉数字/2.png | Bin 0 -> 534 bytes .../Assets/背包摩拉数字/3.png | Bin 0 -> 523 bytes .../Assets/背包摩拉数字/4.png | Bin 0 -> 467 bytes .../Assets/背包摩拉数字/5.png | Bin 0 -> 529 bytes .../Assets/背包摩拉数字/6.png | Bin 0 -> 579 bytes .../Assets/背包摩拉数字/7.png | Bin 0 -> 406 bytes .../Assets/背包摩拉数字/8.png | Bin 0 -> 594 bytes .../Assets/背包摩拉数字/9.png | Bin 0 -> 526 bytes repo/js/DestroyArtifactsForMora/main.js | 192 +++++++++++++++++- repo/js/DestroyArtifactsForMora/manifest.json | 10 +- repo/js/DestroyArtifactsForMora/settings.json | 6 + 16 files changed, 204 insertions(+), 4 deletions(-) create mode 100644 repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/Mora.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品2.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/0.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/1.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/2.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/3.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/4.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/5.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/6.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/7.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/8.png create mode 100644 repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/9.png diff --git a/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/Mora.png b/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/Mora.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5a6a3f660ba73d0e7314d193cbe4388318301b GIT binary patch literal 2414 zcmV-!36b`RP)~6P+#8s@C(x}ALummy`Lx351rn>@&Ia z+N3g>6gO9!CjGEU&%0C)?SIQr$uN37&S=b+$r{-0e@7+a!_YY}ECY_C-*MXj;Dkar zfeFJipg2ZId^(j*KRVp|ajm&A8Lo_H%44zS`^XPt|BuU8rkirrS>4X~)4iDp^(o45 zfi|epb`NR`SvjGobSQ=f!xsEh|3?bN(L+&b)m4=`t=eR|zBH=NzKw12DTgyzdd1+S z{-Pj4wh~Wyigsq7*xYo#*Qmv+4gAC-W2NkDqAZrIQfFSIF4Uv_v)rtFYzO^ z$^@;fw2@sN{ETon?5&g;iq4`^$#Ut6LARijuY7979gAr{bbOLDhfuCU|2c;f}z2ly*QA}n{M

e*FNwHZ~Zv)mmkteD~F*uJh7J z-rz-E9Hy#I(zp1COD#<*As);{YZOG~DNZd--CaUeq5e2ti9cIQ>250uiX#9Z$mH#{ zYNI^sXaysx^*5-BZmuhgT88F(n&RNK!NAt3ND^VR=6kwcktq=(wCB09?ToDnm`+7f zOViY{G>w8d^2Vc=X@CALaepNffkpzd^6@$u#i-1jX%5;H#_815ZPD|+S>(Pr?tH!C z%Gj(vPu~(m=@qGZIq7(TpxnzmUB`<%g3s2`JJT_n!l;7<)ZsF!CjPh0;mEDggg0eK zz{fs@UY>a_!3v5zR417_Mb7pVawN}TuF-FIl6<9a&`2{R<8eAEPA?^>k1J#n(&17v z_odtNyWqv9fcXyCLR;`$b3kLtgV7qV^}bkPXEI=Fs#vEWOD2$WO(7atmglX0?2 z*%-sD_Jj*6KwO5)Iu|7@1rO&t@aayYMb1O{c5m?(3oXHm9T33b9z!k9o_+_}=#No< z&rlxW6bDJF?_}latMji#M{`Mglh3yJVe8z$vl!xjp2yRq44Do zfnv7r2n)oo@cr}#JYMeBn`OhzddMMJe5wyy?TO;k9eMe7T#D^mtT~_NA)t8x=6G=u zF>>$}RC0h&@IPnXdx`@DzbgQbEKR%Lx0_LNMa?l{zsyEe~&wMoV#;=25{vLCm zOLFX{c>#(u!DCHNX4->B8-tEksy=sxFL#CZP+i*aR)e|rLsUn>-|np#^FERlC(DYB zv1lh+_2SI>@n*a{oAFZj0kZV~88}ht*-f_T&9EFK+Bf8Z0Z-u`eI=kFs{QsXeW?fa zsl~6C>ePU?;8Gj}rS7vW0sJzzF8ssRB(pv;a3~iz#&Vsk1`Si~1~dQUP;0zzuhmYkfw)_JKTbcdmrkJ~aGX6k(wJA%ZGKK(hi-2{v7 zG$1Sb_gd7ycvS2061$lim&H#1`8MzAYG+YBXsQM@&T^cpbssKrdt)Rqpq|mvC2<#(T_7QW&L{gGtVO$5Hj zJ*-FFD}(-0jrg?_`=^lZIK^@wDRiuV{(HlV`+d2 zzT7-Z0o{5q57VC(DLQbLuZ}o@w@3?h2S^gJ)|V zPgOjcsc@RBc3Eon+#HOQu9X;+i&y%2^?t&|F1q%0f>&s?KLQI)p}}!?83iXWAXu7z zEZ)U0BE;LiGSQ01cr;lBnyB-dW&3>Y4A>ls*qews62+e`CCfJP${p0DX5Msjb$xxk zwa%s$B!B`V{SjD53iW67|BUF{=!aqp0+H#UaHNN~&x@G98uM)gb?)=;y%sycD<6F} zc)|OVA^X#z=U@C3+y3g~7PVU4+SU;sjdTl&4tSah{m1xo(!#rc;U>a7C20D+@7geAXXd#?OjsPtpX9PinDlUX9Owz$GaMC!%79{TxBiF! zd?^3(!U=^COhHHj**7}HJ@o10fCzBlli+YaXjEY2(H gE93vG``OU{4VPwv`VV&)r~m)}07*qoM6N<$f`t6dv;Y7A literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品.png b/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品.png new file mode 100644 index 0000000000000000000000000000000000000000..978a6514b4c25cbf9137d2e1e4a6842b2a6adea9 GIT binary patch literal 2676 zcmV-)3XAoLP)!^w)mo}nt6sg;YH_WKiXv-Jk<|}(-y|eP zw)(z4|7V`#WHP^V&YYQvR{e($y#Xqz8i1++hzCME!Al7t9wWXG;)`C0CsdRY^@<4M zF{&zN(>$hys{yzggn0svgfK5Ja=HRA{VVGkX)v&2qdXpjszDN54Z;G660bFwS~`0z zL!-9w4^uM^=d8=^X5?}>ogb#At+w&L{=w$f4wYIjlHtWEd3IC`@hO$Uli)mC4r^N4 zx~69w9*<{vY02}|<8r%a91e%m>2S_+V-;=ZWAR%i!^$ z_whcQO%mB8k+=(8U!DEh+gVvz{<`Ryr+yX}Ju55A-d{U6{B_cIq9lJO`PCrI-sdx#c#Ni8$w`p{|6lMNHaB{n7#7Nv(=+yH$WP+SgXu@n zuz$v37emTCyIk~Am@kE^=va%}eDcLGkE&{{rq1DXMuJz*_!Pm|tPzidt{k&YTwMps z(9(E{%4gbAcoAI9io)|HFd#)Sb=|=5=+@T8g^%1+cd-a=hPoJr^ zL!)n$V`@;20WyRyttc77r}PqEhRvhcpbP_~2p~m;3S5HJKuRsH(c>CDtkg=88j%7A zWhf{^1aeF$r$-{xc&3#hK#?dsL(S)$6Esf(OAwXLX!@(y(qZn^)xVQt>Vio@8A3~e zt98bAo!!0WUQ1m=lN75d<`wi*JukBet`?JGvQ1_W)6@-)j;^jQA06%;?C-9vt-9Rq z(XsKqfuVMDPg|F{t;^hD?y(FGS;xm+pWJKftA_`>M@M_B-@gr6txBC9l%t>=EufOW z%1Pz%^h&d5AzumuG8EI)*`1EF(}Rb2Fq4dBldy=grNq)A1Kbt}7h&QzrhDiDy$pG~)lVxKQ`5iSmF|C% zmJFIsEQ`M>>3oEv1{KH+aXJ9~z*8&O@P#}PUgV#4U@9k~V>}-lC z$a-Zi?V<76H1W&3ZD?wy*(4s2AbeD zJ!3F%F*-gbfN**VK?OECJ{AmIaCznI#C@oLWLS!;^3j7*1e79mM$`ATm0Y@P(4<3D zRbTthY?Bjmm4+!FvX0~`jcsz`+J9D#%J%2d@$c&^b?=%$2n8XuipIb1GGCk@R}MNB zz5c$w(r)gCYjs>UZNs&?c60al^_5uknuV1#E-sGWo4Xmj43QwJp;2o*c2fdRMeI92 za?QETmVRA>NsOwB*<_Cb6=N!0qsiRgKkNSZ`}clH_ERPvj|GNoHVIxsMK42Om3G>0 zPd`Qr@yr?WV|%luvrCMsKn1&HUm9d3qacI{AWVoT8`|Fgy}4EnpH4=nXYH_B3&Lm> zC_|K5{oMSg!fI#OPno#?>U3>=b=qM!wRZ?%WnuIbn~WY+nc6!h?b9o3%U4&w%i*(W zVs2qhsW(t~IjYt-cox6p@f<4qKD8Z)cr38KGliP?S*U3rP9~4U_gPY^!2VeS15E@ zZU%0DHciZX=2eDz5J9UzISQ$?Q!_KE$0&CY*QO7He4B|!!+wWrR*2xV2SONkxMrha zKlhaib}AX2a?U^+Z5}U#lzoFkuYdn36A#>+*EhEcU<`yYLvu?Ya9)8|@F*Jb_l*n* zF=ZYPDo|5<$HBqwA8!tJqGTex^K*;FZ~xp%Cc^Ba%0?~|KRDVob#{OV`izHbbraK5 z$%og@@|1~3BYvr}=D*uF8hLHnpEB`eB0OQAg0(sZPksZDGBmY#y*rhC=RSS756*ma z%*;9-?t|R^%C>iZ$I#M3v&rb$O)N%K@6Fxe&=q|$ZVSM`%f*S!-)2+0967o#_BnGKu#3_gv(W$_U@jI&9!?n4S)EG zs_aTG6TiO;Zft#T@9mb?szC$;k!LmlV=wU3#f1S1OoXWPO)b{RiOqjDBGl)0WlZtY zY?_FKuQvZ#w|*GcH#dtgC6n-S`1}D*;sFH)DlnN!ZES5D9v@p;Sv>i@AB)~(Qn6wZ zwVpm8>yES3} literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品2.png b/repo/js/DestroyArtifactsForMora/Assets/RecognitionObject/贵重物品2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7c7b854922ac4941056cb46f85828393edefb0 GIT binary patch literal 2645 zcmV-b3aa&qP)$DjfN!;KK%egA;B#?cXFK$G3Ks*7rRx}WFM-+sEMyCey14-JcZ`-h$j zd(dhfy~87tl_iziVLWz!BrsZnplQ$VNQAc&G4GmsIV&Dat7H^`VMqspU}H=B-HL`P zUQ25_sV@o>-f-s~b7_S4A z7y`!wa6Ifx#JpMQf;8qwgLFYPUtQN!RK^9^d_jBnTg9AhQ|os@VV^BEbizKH-v!w= zwQm)3g7$8J%`YnBR@XHxsOAY!jumq31-9ZL=NTv(^-{w_L4GMGx1@?)+bHbpo0ynb zd_S+%EJKD>t4V7&>+EKo)ue?Ct6I(S;`{lDi3wq6AG@|Ox1=h+l+*A~piwVnMv3`R znln(M2>fPlhF#luEssf}0wgN%TR}xBqmJ9q`uJH_yRfIbXP~=hpk3JW_*oaXp|zAz z_gg^)R`XgOlU>{RW^M-4k2qpbZ5&w2N?+r66#+pIVDT^K&@WNS&Y3Rf&;b@71VMZp zGdRK?oeL$nYmrJ{-)7d6sK9wpNL1i9vtBBF9o)72!zfV%4!A8N;?ew4&UsMsOF1Lr z(SZAyBV()_PT_N@5=G#M&+f2n42r}Bw~lE@ltYp5%q2=$!7a|9NbIm|M0|E!lD~_R zJi1W?4*P5{q??k*`z3Tzs%ThJ4DiUb)9Wm@w5R@_T6M@YdNIHg z4NJ_1)q^-YoZjDn6872*8=pG5`twUUWTF)|6#^?cg>s2fMy3M!rJRnge#6G6u=ntN zelC=l9}an~CjDnYd-v5`MyhG71ao{jhf!3P>b!XuO<61zMg6p@Wekq&X2QQ3Q5aHva4# z$lS$Clrj<(Ak*kYWn7=r9P!zU%ea}*u_h!c@MrJ9!JH!4I-Wp5T+qB?j&g%_9+ck- zD(*je8uO#CrEn|@tQjDoEthzpvXnLe{~nCap&?&QQo#CN#5M-ltv#6(dU z7k8W?bG@))c4iuJL6~2h2~`CvGH!fs6Le-419NbTSwB7wdUiH(D=|Op+1VT)2X8U! zGeBUENK~Lr&}rQGoEBwyNd>U^nGNNYRJRE_KP)N#iZ9L-zf%%Mp!iu(^<F=L1C7CvX@Ib+&thC7 zP{nT6{nLVAyWfCDYi=x)%e(H}BS_QzE&XOhcDlyZOXf`cReKEz{`e z%d5G}&*%ZK7dG@?jvkZEF5%E^~DBnzGZ|f4Jtc1?fYd>Nqj4$iz5_(;#%XB3Lw>XM7vmvjQ040jR8ue05eRJ}O zCY>Ry{MY<)exm?G;Wr9?%`eYfAAd@s05$c^*qNRf#pN(arLWF!5j%bPT~NSn`6fAk z%`cZqU%4Cx;w26%)oayUek+cDX6AY!YeYOcA|Ab7$U3t!UV+PR)oaz5$J46dffL-d zEH5f=+^NCB6K|X@L!tuL^2@K~m!Id&h1tAur)GIk86;Y-(Xho+6oK7aM%m=#^+I&Z zl8)f}%1Knig^WE&LBXb6$YZq_*WN4Nj*Ur$U40Ll zo>lQ4p;s(-xp)Ft{3_m~2Tjj}U43I?()Y@@7ULSK#L<_5Q~kuRkoTjW{isK$`GBIt zLpz5wX;5%;A+OB|8#c5b7gX~z(^D^{ukbW8J++{k-_U+^!iLb%DG+Z+sLGz-5fAO` zM?G5>ePww?)|U0l*N8hFa>j$(r@>E>{i9DE@!)nmbB$?2f^Cn3;}Fz{Y*8}qpS`2&kto_*nB_J!=M3qSm;Fh5tRn2H~SPdv1Z zeiHis>2dHeC=qtWLvEE~`es4l#S0g+f4rFeWA^_5CVFwTWFG|v00000NkvXXu0mjf D6D0~n literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/0.png b/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/0.png new file mode 100644 index 0000000000000000000000000000000000000000..3e08bf71304150598402546ecf43b85c31e20680 GIT binary patch literal 616 zcmV-u0+;=XP)l&PU!n~35Elgfq6p95s+w6s?VgNP;FE* zq}Bp5JdxBF@Uz|em}P$Un_CX&^F=w@IdFBDBG8nFe*IR(6_5~WldV=xLn|D)UXmM7 zC>;DXY(dFjbvzZxFg+(xr;-t9^*hydgB4}cQybme^4f=Oj6!k~y24s!`xjI$CSkf! z%}6!o8QOmlc=zS~*SrE! ztY!C(s5y!H@4qvlal8<(iU^HZrsJPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0aHmtK~y+TjncbL z0znvt;djPW6l26f44xIDg_cGeXtc7RBX(GE1$qNslAVd2os|~Ef&@Z>D56FIB|&$0 z#$qAvuCnkob9yrQ=OB)ACz=6~ApCQGBAq4}b`c&ZrC@Z_z%WLfv36A?r6fEaBC)o> zQ98xp{tf^J0)!MygvMA|ijv&jVl%#oX<6Lniw+7;gjidiBel29#`-)$xa$*uKxWcO zvY7)Ct1%z=%}8W6epV<|QA!hw&LE|87TZ=lJ-<^ZJ|G*dHpTKImsdC3=1cxfFbwHj zfd)EXCe_-j-#9h(x>{>Y+xD&lwr#sF^Z%IE5D4$H^iLq_y;vaXWgybSAOevFr4$4q z)3Ru^+RzUvrD=Y&xhqt_kCak$I^UG4E@ z?N8HC6vppA*anS>_`%UK$h_<&Tim+MAS-@QT#TYDh(@!)1SdnBF3Th{WV0&7E$d!b zdr22oX|G}9{t;5{Rud9Po)0JY{PH~KoLs;_o`Ib2L3Cp~-H;`-*ZR|yn~fjag%85x z*bUz_1356}nR>PUx_ek77+ui7P|{ng4#5i&sbx*A5{yocJK6mENL-9QnJ?|;aj#7< zI>qQ^dIkL2D^Y_??%hP#$3TvOoI~(RKX>SRvmpWHV4q+#FxA-NLw3fRk81PFhS_UT zGoWiS!ARHSNL*wgXKO8+)Vo%TU<8b#Cc)@X`5juAvk4Y*`JIm^#~mxgP{7o^fNS>d zMA&=X-pwNHLEeaK>NP|vIbv2v19rD-^ zf6eWTuRQIv_h^cSs?Xj$zZJN{LT(5-Lf%h>O}fOuRKI@v>=uQwnPGwjx$XzcQn7C+ z1S9jP^&*)V55V(TN6=){U;bVkoD+RRS$w;6)9)G)JT1UhK0_}{Fe;XEuG!!Pf`vS2 z$P%5DV3f(NhZbTUF+9|KB=~49ky-{lt!_h?72vOKeTl0DG_{KL_7zeN_U&U%vhY&< Y1B-*qBhjc1c>n+a07*qoM6N<$f_wn_Gynhq literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/3.png b/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/3.png new file mode 100644 index 0000000000000000000000000000000000000000..4857790fe4dedef8f3ee62446e57cd9f214c0abc GIT binary patch literal 523 zcmV+m0`&cfP)33j z;ZNE?7{>2^gheM=QpW(7D51K-OjsA8BnFg}EyFJ)I94OVl1;yC6GYL0$SfW$l(MGC zTAG3Ok67w!SVQvW&0X$y&->hyLvc2(scqAcXX<{`6Y(V-OF9S=4Haw}@|`Y8!qwh> zKC_!Em%dFj$u#79Ll#=~l~4p(n^BK%Uby{X2SGXr(&Y=i-^qZmt_t}=!GeYg&gM8E zpsxfY{mw6#@bmn{f)t5QuxUHAOhr1lVH)y8ld5MWX0wrz)A_`^p>hmR8#{19f3Po#G2Vfsk=yjliG zm0K3{_fNN6`abWWfP3npHj^KwS#)p%jkT_6$YV{ye2v@BXLDTT_%2zNBhmhLQyicZ7C4ox%hjYMTaN#quh>(Sw{ZHSvk=J6rI z9UVn1cwP+5Z=U%tvjhcTTZYGGpC0e31py@z;uHX)5N)(~#Bg9c!L(WsA|VbNf&vVV zQmvg>Sk0ziEBO>Y5aIvO1G?$p{cT2!U0+|8bM*sJp6gO+8SvZE@g?;hV&_*G)>z8cb%f^>Kugh(q9K8b`{7g|;LoMs+#U}_ zGYo6|X=u5-M(etJP`_igR`MzSIS5AChEB9jQr8Lqb(2eJA^MpNuWXvoRkiM~rdFyO zlk{mO{r;3>* zYfl6l=2p%jDRZU6d~rj@l#&KsCCzc4T?7a+x22P~^V9X?9T*(z?UatjCE!KI9yBTr-!&z6@|>!PHgdY z$m0vXi+{LKidyoZ0}t|PV7$AB#pxOC%s4g2dHu~=NkbcIiS9*LW(S{4CN&PXs(`U^ z)|my9ogbqa8y9;Ue<%&kjt>Y%HTjJ521ZfF#zlAUxnWlYg~J@dr~#!wC^E{K?fmD_ zx`{idj2*)`HRtxM)}f@;ZPrSF_XYb`GQp^KDer&%!Y{4OzFgjnL@Oog41&?11I2ur z&Jo>>4|}TiIu>u*ije#D-07ivnY6fltKr{b7PqPo+;v+yEeN5For!0z|33H!porj0 TbS4gi00000NkvXXu0mjfKI-|| literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/6.png b/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/6.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2dd27ff003235f0349969cbfa0ffe4cccf8914 GIT binary patch literal 579 zcmV-J0=)f+P)2%G zZBN=z6ae7q?h_uMDW5t@?7_j~M8 za7j0A9H3F>Sa2RzC`sfck2@Osj{sDicE)= zLpWj4=rE{2WdM>y{@(?s=4wLM^YgA35M9r!rDiP`3=I&2CB6pMh9t(D%U+o&mQpp7I#Hu7L5w^-2L*70oP&1NM!vt*8ufWZdd*Xfnea2 zse+Ou@?C)j9|u&9YT3C3=ipyy(WzN`JhmaUYyII!uDfiro?BZF4Fs zYfHjl6bJBqM;AeXFcS^SaMMh*O*2UeqM{4kj7mtv+v_5<3ro_>x#@h&Tx>eh+J~t1 zgxVOwdHLh~|K}iz48~7i;*s$}kwJqiA{#pgPBQH9hDOIphWC$8dtzN`SL2BUV!&|C zOw152G7M@(MFvcnHakciWF@HkyBkFY;#)O#88=|K78z}x=y?nl<(Pua70@Eoqz1je zRuma@1U8vY!6yGUnHGHMYzD4r)=GiMrWT>S?TZ|%uuWsYH_%LO4Ymw3BIXSz4 zYdUQ&c&{f~71FRNY(u5W9RTA7OUB_1NSQn29E5TU=%oVL2R_Ku+V>@*5= zejwBrK!n+S$#e>$uE1ro869N7sa);~BBA-Rdl=P0bBilXnTCjGpWOb47NHn!_pG+~ zvLb_?RKLw%Pnumi$l(oj1@1#s#r#rmRQweG2610_;i@8QCIA2c07*qoM6N<$g7rPK A0ssI2 literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/8.png b/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/8.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4608259abecf985e09775c68b89c075427f7e9 GIT binary patch literal 594 zcmV-Y09+3kI)zsc`@~TomNTHGva@3%$ZBjrJibaYsw!ToHf_DLq_i{yEa$Ks& zhiJ^=)@t%kb{@Z(?92dyq!lXK;q)dG@tTm6y4CApbJ(d0d^YwqYF>2BX!Hb00qvYQ znTSi>>O>ZwO77P~q44t;7VvF5CUvGzI(6WB^KM?h^w#Syahb6MC$e~b)qKCY1_~Ex z)TUBAx7yqUNg=sCzFH}VQm4m1KwZcqCv~*HU~*uNUa;}GQcFz-QmAO5ybpLl5 zU}t0Fvu4&vC@G|QdMTGVz8$qtSAd>NSadkO7(&MS+Q)XI@E_N16dcPdkGK`DzfqoE z3!r0kNdFA~g)l24R&$5Ug?_5{}@ai7d*! zdbd@Q`*l1)2Nr$403ei<)#lkv?6jK&^as>qEJ0Y|V$mpLuq#OVj>FQ;nHi(qWN|VE gyGCbJkTg#H1+X3;IrQ$ETmS$707*qoM6N<$g3V1C&j0`b literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/9.png b/repo/js/DestroyArtifactsForMora/Assets/背包摩拉数字/9.png new file mode 100644 index 0000000000000000000000000000000000000000..8a4cac4d71a8203967f7f0b7b230f7131f0e05f6 GIT binary patch literal 526 zcmV+p0`dKcP)4E@ z{ZHCp5Xbv}K0oXUkuluXE@PsQF=q=QT9S!l1|yiv0m^)Zq3k6rDo7bED_yBAir|0} zBK#3cy~d$YlP8zE=RUdn-g6IuFoiH>wL9m7A9COK>$P(4qNcZGRVroo(u|L_Ja!;V z5(rb%GqZg0;IeZv)U{h@&{eaU)C-4)aJm?tJAky_loRp9tH~Lsi`h%>b{Z1gr*^i8 z?X8V&^AE(aPq8P@ra%cEd--kuOaHGj)U{r#Mih^70JR$u?F|3~HWUiiznI zQsq3;{t=F(nK?-)Jj{^@lW*SoMLutGrNU3}M*12M!X)EmCE?iQvY9l99qL*<7QdRq zqQX126s5_fi94 QjsO4v07*qoM6N<$g5-7e82|tP literal 0 HcmV?d00001 diff --git a/repo/js/DestroyArtifactsForMora/main.js b/repo/js/DestroyArtifactsForMora/main.js index 71df21a04..e18df3bf8 100644 --- a/repo/js/DestroyArtifactsForMora/main.js +++ b/repo/js/DestroyArtifactsForMora/main.js @@ -10,6 +10,11 @@ const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync */ (async function () { + await genshin.returnMainUi(); + let mora1 = 0; + if (settings.moraDiff) { + mora1 = await canCanNeed(); + } await genshin.returnMainUi(); keyPress("B"); await sleep(1500); @@ -80,4 +85,189 @@ const MidDestoryButtonRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync await genshin.returnMainUi(); } -})(); \ No newline at end of file + let mora2 = 0; + if (settings.moraDiff) { + mora2 = await canCanNeed(); + let moraDiff = mora2 - mora1; + log.info(`分解获得摩拉数量:${moraDiff}`) + notification.send(`分解获得摩拉数量:${moraDiff}`); + } + +})(); + +async function canCanNeed() { + let tryTimes = 0; + let moraRes = -1; + while ((tryTimes < 2) && (moraRes < 0)) { + await genshin.returnMainUi(); + await sleep(100); + keyPress("B"); + + await sleep(1000); + //切换到贵重物品 + const gzwpRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/贵重物品.png")); + const gzwpRo2 = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/贵重物品2.png")); + let trys = 0; + while (trys < 10) { + trys++ + let res1 = await findAndClick(gzwpRo, 1); + let res2 = await findAndClick(gzwpRo2, 2); + if (res1 || res2) { + break; + } + } + await sleep(1000); + if (moraRes < 0) { + const moraRo = RecognitionObject.TemplateMatch(file.ReadImageMatSync("Assets/RecognitionObject/Mora.png"), 0, 970, 600, 1080 - 970); + const gameRegion = captureGameRegion(); + let moraX = 336; + let moraY = 1004; + try { + const result = gameRegion.find(moraRo); + if (result.isExist()) { + moraX = result.x; + moraY = result.y; + } + } catch (err) { + } finally { + gameRegion.dispose(); + } + let attempts = 0; + while (moraRes < 0 && attempts < 5) { + attempts++; + moraRes = await numberTemplateMatch("Assets/背包摩拉数字", moraX, moraY, 300, 40, 0.95, 0.85, 10); + } + if (moraRes >= 0) { + log.info(`成功识别到摩拉数值: ${moraRes}`); + } else { + log.warn("未能识别到摩拉数值。"); + } + } + await sleep(500); + tryTimes++; + } + return moraRes; +} + +/** + * 在指定区域内,用 0-9 的 PNG 模板做「多阈值 + 非极大抑制」数字识别, + * 最终把检测到的数字按左右顺序拼成一个整数返回。 + * + * @param {string} numberPngFilePath - 存放 0.png ~ 9.png 的文件夹路径(不含文件名) + * @param {number} x - 待识别区域的左上角 x 坐标,默认 0 + * @param {number} y - 待识别区域的左上角 y 坐标,默认 0 + * @param {number} w - 待识别区域的宽度,默认 1920 + * @param {number} h - 待识别区域的高度,默认 1080 + * @param {number} maxThreshold - 模板匹配起始阈值,默认 0.95(最高可信度) + * @param {number} minThreshold - 模板匹配最低阈值,默认 0.8(最低可信度) + * @param {number} splitCount - 在 maxThreshold 与 minThreshold 之间做几次等间隔阈值递减,默认 3 + * @param {number} maxOverlap - 非极大抑制时允许的最大重叠像素,默认 2;只要 x 或 y 方向重叠大于该值即视为重复框 + * + * @returns {number} 识别出的整数;若没有任何有效数字框则返回 -1 + * + * @example + * const mora = await numberTemplateMatch('摩拉数字', 860, 70, 200, 40); + * if (mora >= 0) console.log(`当前摩拉:${mora}`); + */ +async function numberTemplateMatch( + numberPngFilePath, + x = 0, y = 0, w = 1920, h = 1080, + maxThreshold = 0.95, + minThreshold = 0.87, + splitCount = 10, + maxOverlap = 2 +) { + let ros = []; + for (let i = 0; i <= 9; i++) { + ros[i] = RecognitionObject.TemplateMatch( + file.ReadImageMatSync(`${numberPngFilePath}/${i}.png`), x, y, w, h); + } + + function setThreshold(roArr, newThreshold) { + for (let i = 0; i < roArr.length; i++) { + roArr[i].Threshold = newThreshold; + roArr[i].InitTemplate(); + } + } + + const gameRegion = captureGameRegion(); + const allCandidates = []; + + /* 1. splitCount 次等间隔阈值递减 */ + for (let k = 0; k < splitCount; k++) { + const curThr = maxThreshold - (maxThreshold - minThreshold) * k / Math.max(splitCount - 1, 1); + setThreshold(ros, curThr); + + /* 2. 0-9 每个模板跑一遍,所有框都收 */ + for (let digit = 0; digit <= 9; digit++) { + const res = gameRegion.findMulti(ros[digit]); + if (res.count === 0) continue; + + for (let i = 0; i < res.count; i++) { + const box = res[i]; + allCandidates.push({ + digit: digit, + x: box.x, + y: box.y, + w: box.width, + h: box.height, + thr: curThr + }); + } + } + + } + gameRegion.dispose(); + + /* 3. 无结果提前返回 -1 */ + if (allCandidates.length === 0) { + return -1; + } + + /* 4. 非极大抑制(必须 x、y 两个方向重叠都 > maxOverlap 才视为重复) */ + const adopted = []; + for (const c of allCandidates) { + let overlap = false; + for (const a of adopted) { + const xOverlap = Math.max(0, Math.min(c.x + c.w, a.x + a.w) - Math.max(c.x, a.x)); + const yOverlap = Math.max(0, Math.min(c.y + c.h, a.y + a.h) - Math.max(c.y, a.y)); + if (xOverlap > maxOverlap && yOverlap > maxOverlap) { + overlap = true; + break; + } + } + if (!overlap) { + adopted.push(c); + //log.info(`在 [${c.x},${c.y},${c.w},${c.h}] 找到数字 ${c.digit},匹配阈值=${c.thr}`); + } + } + + /* 5. 按 x 排序,拼整数;仍无有效框时返回 -1 */ + if (adopted.length === 0) return -1; + adopted.sort((a, b) => a.x - b.x); + + return adopted.reduce((num, item) => num * 10 + item.digit, 0); +} + +async function findAndClick(target, maxAttempts = 20) { + for (let attempts = 0; attempts < maxAttempts; attempts++) { + const gameRegion = captureGameRegion(); + try { + const result = gameRegion.find(target); + if (result.isExist) { + await sleep(50); + result.click(); + await sleep(50); + return true; // 成功立刻返回 + } + log.warn(`识别失败,第 ${attempts + 1} 次重试`); + } catch (err) { + } finally { + gameRegion.dispose(); + } + if (attempts < maxAttempts - 1) { // 最后一次不再 sleep + await sleep(250); + } + } + return false; +} \ No newline at end of file diff --git a/repo/js/DestroyArtifactsForMora/manifest.json b/repo/js/DestroyArtifactsForMora/manifest.json index 28c06be08..335281e31 100644 --- a/repo/js/DestroyArtifactsForMora/manifest.json +++ b/repo/js/DestroyArtifactsForMora/manifest.json @@ -1,15 +1,19 @@ { "manifest_version": 1, "name": "摧毁圣遗物换摩拉", - "version": "1.2", + "version": "1.3", "bgi_version": "0.44.6", "description": "图像识别改造版", "authors": [ { "name": "起个名字好难的喵", - "links":"https://github.com/MisakaAldrich" + "links": "https://github.com/MisakaAldrich" + }, + { + "name": "mno", + "links": "https://github.com/Bedrockx" } ], "main": "main.js", "settings_ui": "settings.json" -} +} \ No newline at end of file diff --git a/repo/js/DestroyArtifactsForMora/settings.json b/repo/js/DestroyArtifactsForMora/settings.json index b2e7e0863..2aa36ee23 100644 --- a/repo/js/DestroyArtifactsForMora/settings.json +++ b/repo/js/DestroyArtifactsForMora/settings.json @@ -23,5 +23,11 @@ "name": "fourStar", "type": "checkbox", "label": "摧毁四星圣遗物" + }, + { + "name": "moraDiff", + "type": "checkbox", + "label": "运行前后识别摩拉数量", + "default": "true" } ] \ No newline at end of file