From 487451fe3f330f0d5df9da41ae6d66b1901f6c84 Mon Sep 17 00:00:00 2001 From: xien <2383759126@qq.com> Date: Wed, 3 Dec 2025 11:01:26 +0800 Subject: [PATCH 1/3] update:Aim adds player lock --- .../Terraria/Assets/i18n/template.pot | 103 ++++++----- .../Terraria/Assets/i18n/zh-CN.mo | Bin 22840 -> 23074 bytes .../Terraria/Assets/i18n/zh-CN.po | 118 ++++++++----- .../TerraAngel/Config/ClientConfig.cs | 5 +- .../Tools/Automation/AutoAimTool.cs | 164 ++++++++++++++++-- 5 files changed, 297 insertions(+), 93 deletions(-) diff --git a/TerraAngelPatches/Terraria/Assets/i18n/template.pot b/TerraAngelPatches/Terraria/Assets/i18n/template.pot index 954c80e..0213921 100644 --- a/TerraAngelPatches/Terraria/Assets/i18n/template.pot +++ b/TerraAngelPatches/Terraria/Assets/i18n/template.pot @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: Terraria\n" -"POT-Creation-Date: 2025-07-20 18:58:48+0800\n" -"PO-Revision-Date: 2025-07-20 18:58:52+0800\n" +"POT-Creation-Date: 2025-12-03 10:49:23+0800\n" +"PO-Revision-Date: 2025-12-03 10:49:29+0800\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -130,8 +130,8 @@ msgstr "" msgid "Accept Very Rare" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:25 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:28 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:26 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:29 msgid "Action" msgstr "" @@ -197,15 +197,15 @@ msgstr "" msgid "Attempt to bypass TShock" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:48 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:55 msgid "Auto Use" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:7 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:8 msgid "Auto-Aim" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:31 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:38 msgid "Auto-Attack Settings" msgstr "" @@ -225,6 +225,10 @@ msgstr "" msgid "Auto-Swing" msgstr "" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:78 +msgid "Auto-target nearest player" +msgstr "" + #: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:80 msgid "Automation" msgstr "" @@ -310,7 +314,7 @@ msgstr "" msgid "Bypass TShock" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:45 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:46 msgid "Cancel" msgstr "" @@ -467,7 +471,7 @@ msgstr "" msgid "DockingPreview" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:77 +#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:78 msgid "DOESN'T HAVE active bobber!" msgstr "" @@ -534,7 +538,7 @@ msgstr "" msgid "ESP Colors" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:17 +#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:18 msgid "Exploit Current Sign" msgstr "" @@ -649,7 +653,7 @@ msgstr "" msgid "Hammer Power: " msgstr "" -#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:71 +#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:72 msgid "Has active bobber!" msgstr "" @@ -798,9 +802,9 @@ msgid "Item Spacing" msgstr "" #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:127 -#: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:61 #: ../../../TerraAngel/UI/ClientWindows/QuickItemBrowserWindow.cs:47 #: ../../../TerraAngel/UI/ClientWindows/QuickItemBrowserWindow.cs:81 +#: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:61 msgid "Items" msgstr "" @@ -817,14 +821,14 @@ msgstr "" msgid "Journey Menu" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:45 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:46 msgid "Kick!" msgstr "" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:58 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:60 -#: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:73 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:54 +#: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:73 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:60 #, csharp-format msgid "Kill \"{0}\"" msgstr "" @@ -934,7 +938,7 @@ msgstr "" msgid "MenuBarBg" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:34 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:41 msgid "Minimum Target Range" msgstr "" @@ -990,10 +994,10 @@ msgstr "" msgid "None" msgstr "" -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:114 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:116 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:114 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:116 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:114 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:116 msgid "None/Server" msgstr "" @@ -1040,6 +1044,10 @@ msgstr "" msgid "NPCs {0}-{1}" msgstr "" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:69 +msgid "Only PvP Players" +msgstr "" + #: ../../../TerraAngel/UI/TerrariaUI/PluginUI.cs:99 msgid "Open Plugins Folder" msgstr "" @@ -1060,8 +1068,8 @@ msgstr "" msgid "Other TerraAngel user box color" msgstr "" -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:112 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:112 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:112 #, csharp-format msgid "Owned By: {0}/{1}" msgstr "" @@ -1101,8 +1109,8 @@ msgstr "" msgid "Player hitboxes" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:24 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:27 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:25 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:28 msgid "Player ID" msgstr "" @@ -1114,8 +1122,8 @@ msgstr "" msgid "Player Inventory" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:23 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:26 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:24 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:27 msgid "Player Name" msgstr "" @@ -1152,13 +1160,13 @@ msgstr "" msgid "PopupBg" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:7 -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:15 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:8 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:16 msgid "Portal Kick" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:9 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:17 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:10 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:18 msgid "Portal Teleport" msgstr "" @@ -1169,7 +1177,7 @@ msgstr "" msgid "Position: {0}" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:52 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:59 msgid "Prediction Scaling" msgstr "" @@ -1181,7 +1189,7 @@ msgstr "" msgid "Press L to spawn" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:19 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:20 msgid "Press P to teleport" msgstr "" @@ -1277,6 +1285,11 @@ msgstr "" msgid "Reloads plugins" msgstr "" +#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:17 +#, csharp-format +msgid "Remaining Time For Next Exploit: {0: 0.0}s" +msgstr "" + #: ../../../TerraAngel/WorldEdits/WorldEditBrush.cs:55 msgid "Remove" msgstr "" @@ -1286,7 +1299,7 @@ msgstr "" msgid "Replace" msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:47 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:54 msgid "Require Line of Sight" msgstr "" @@ -1347,7 +1360,7 @@ msgstr "" msgid "Search:" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:48 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:49 msgid "Select!" msgstr "" @@ -1367,8 +1380,8 @@ msgstr "" msgid "SeparatorHovered" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:51 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:54 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:52 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:55 msgid "Seriously?" msgstr "" @@ -1430,8 +1443,8 @@ msgstr "" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:86 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:87 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:80 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:83 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:80 #, csharp-format msgid "Speed: {0}" msgstr "" @@ -1513,10 +1526,22 @@ msgstr "" msgid "Taking map screenshot" msgstr "" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:63 +msgid "Target Hostile NPCs" +msgstr "" + +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:116 +msgid "Target Player" +msgstr "" + +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:64 +msgid "Target Players" +msgstr "" + #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:47 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:50 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:49 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:43 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:49 #, csharp-format msgid "Teleport to \"{0}\"" msgstr "" @@ -1676,7 +1701,7 @@ msgstr "" msgid "Unlocked" msgstr "" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:48 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:49 msgid "Unselect!" msgstr "" @@ -1706,19 +1731,19 @@ msgstr "" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:88 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:89 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:82 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:85 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:82 msgid "Velocity Dir: " msgstr "" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:49 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:56 msgid "Velocity Prediction" msgstr "" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:87 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:88 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:81 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:84 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:81 #, csharp-format msgid "Velocity: {0}" msgstr "" diff --git a/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.mo b/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.mo index 4e60aac3a573bdc7c1c085e3f1d64c55950c2924..b8d869c6d814b8d41f0559d9af0293a07c2f2755 100644 GIT binary patch delta 9272 zcmYk>3w+P@9>?+DnB8qNm(j5QT<12sU~(Cn%iPvnb1N+tinVNn@Hb&47HuR<$()l_ zj$5jugV2qXRLD82(?xSVB}ECH*Zcqbcs%+&9-lqG-_Q5^``&)P-=;@z?(lnQm!J2m zDF0OsSGk|#G{kN-9VexlNo+|3hQ7ZCSo59#hDn43o#OxnPnJ3eJh6H zUeq{8to=ALmDl;sEjX7^9sjfrVa?nL8X+B>R#*#DE#DtC!3fmEIj9L{VmQt-mthU+ z>##X)M2+*lPp{*ANg;~F1#FDBtV1Jut7ChtkG(Jm$CwjPCo&c5Vj=1zoM-|N{WR+2&Y(Z@JC`YFV#gj{BAFW>Ld$58!$N1m?Z4R6DzMWG|AVLS$7fz{`uo@EJY$D2_L+lAWM z+m=6!dfC3T_Dh!k6+_AUw{UUsG~iK+Sygq2{{Swj)O3aYHid>cu*T_i{bkIdsv4|C8&?Zn)ncEC$p?R zA2q--)PQTOeKUqoe+BhC^(*MrTOHiq9iS;{f&|pd(*xlPWS-p(fa5?b}c%Z~!&l5ok!bv9Uunv4BMjy z>Sp;2tB*4$V=dYX%q6H3TZ4K;8&C`0gxbI^)JYt&`e#0Q{@+p1TYd$#^XsUUR_o~A zP#^UOTB7d+P!p%4-s%z7J`ME?W)|v%=AtHi2DOn5sH3mI+W02c(f9um1uftk)B?_$ zKcNQr4fTiuJGnclg<41)YGKK!_U@>O`kBK}{l;584>kT=)VPb#tBFe}XrQ&I8#bdl z?nZUoi#pn)*8Uml1inZ0yNa6l7V6Q3q`KooqfR6qwZOKh`#Pb1?_{L%{5A0dBs9P@ z)X~gFEo3?Bh7G8r+lK1D*Xkc)UFs)M_gz9Q*srtOKN59+W7I!D5-|ZYQIBX|XU<X?jg~)*P03$CO%Rdh8jI(sw?{3kK@ay) zc(4`q1k}PtVW^kFBno;~`KXt#&@4tB`8w1pPBi;lmp!ujBKW(l<^?SwKf%JME7;;DOi{H&lyQU z6HP_!z>6MSgPPzi)X5w{^*fL8c+>JN`ne11gF3OHsD5M3Tx%~hi!HxSGQYExf+l{) zI-Ir+RaU=_0kj8ZxD$n=e&@%aCQ7t?ItEeCLjA@Zjk+%%b#imeBGgHjqVM}Jr=VY% z|3cmHDQe(TsAqTqb>!Dj1Nrs0g`oPySUth)irP>H>g2Mq5iY>yxWVd&`g8tDd`lu2 zg9f+@h(b-&0JYK-X@9_Y45qS_mw25g3!FvaTqQGfkLp>{q6)qf#s!lzL4tT(ryHoV(wh5e|V z9!3p(8g;`@r~z)8k%Qc$Y>LYFLftpq>Jw2DKZY7-zFCU;tSeCO&O504yeF)~50X_c}-2f^!-* zV3pNxnjx9)OB0P+Sa;Nfqfu}9RJ;S1U=VIZEw}=;fbHg9Yd?b8$mhO1&;NVta2d6L zTh^h@-EPNb7*4(eYG>(|A8hq|tv(60u*a;v)Le_9X54kG@BM>X(Z;f%&KtC_?osMonC1R-pR7fnF8fr=S~7nqOIm zGv=?T0cs3!jWT0V_q8=sEZ@cKXAVc5Otx8I77gL~YXNIX=(DRp)eo4*&2P=0Q9G_S z)U`fp0STz@xg&;PcZ|Xe)FT^<8aKzBf$Fz-sD1w{tf9<&4Yi4WMw1a<#JF9jX#G}H>`Scj#kfy%7C-16H|U%?^E z|JS^PI+^QMj~wof+sJHfrlJ()4`MC6W(JRN7aD`w zNE5R?YNBq~2Jc2~=yBBj3$c#A|56It(H1x1ylWj!qaMLU)LZO7(zP~ffF`H~cEGyW z8?}Hj);`Jdv#~b$XRLh_YGK=ad7l443L5C7b*QoqznFpdxG&Ki7)!rq$jY7Gs2z<) zy-fF`#(CI$9CdO}qc%{E>c7+K|HLqT{~uD&j!syIvudFJBkEV?4QqEsxdTR_`nN$1 z+#R)`K~~Q;^H4kWn$M!f+l*Ss7WDo1|2FIJhItsZfJ*bc<*!*iWVCxC(Wo8Aq53DG zPACoaXZ=3QFS7hfY(aiI>Yrw(M)Ul&!W$%H#27v)oWqX^DsXwRmzCWNpACf>+Eac$Gui~5Z@uX5-aF4l{im% zF>(8vO~FIlO=J_R30)b)RbR>dQDWsM@B`v?;xRpcUELY@NkV_gbSoQc#wrTmQ5_aI-d@A`^b+cY)OC>POz0n?f4z#RH1cEr^=(jnO6`dI zh`$jJ5Vx;(^r=ZilhFSuolP8|{4TMam`YRA0jLz*O7RF(6yh)qudW4BJL+jsQ-yE)~BAiliYk_qtz)o z$%OY4ezZ`HYY>g~aTk$GY$9|``pZqKKTWhHju4$_8%5|>cu(t>L-{pgz10U$9!7Zz z(Si7kxG1T&Nu^aUp*cACMYUep( z7@^CL+{bRw_n%$>I%H9AVr6yy z2XT{FWw{TPbhPe_Z)E#anemW5BjOMU5Css z@syP((|G~$jn!x2OzOJ6b8+r8zs4jh|JQs2M-smf^>!X@vY}eNb_LnfC*>4)a&xk$ z=j0c7@}_3b&Y8aR!RD(&BXXzC_GHb>@?`mP`8%&C<^{yL-7_A^FPJhl$CH_rp6?8I zbGN%qP8}W)nv~owF~yUV*rj7~$@|@3_UpJaFRi#*-E*adXSS~WVf})$`&L%1T~t-P z<;>RIJ8$;%goS;-XK~iZEXy<;Toe#nwQlPVFBY9E+i>QE;&ZEtn9Fff*6F2Tt84rp DbiLZJ delta 9044 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 Dsy}~f diff --git a/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.po b/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.po index 1deaefd..2037384 100644 --- a/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.po +++ b/TerraAngelPatches/Terraria/Assets/i18n/zh-CN.po @@ -1,15 +1,15 @@ msgid "" msgstr "" "Project-Id-Version: Terraria\n" -"POT-Creation-Date: 2025-07-20 18:58:48+0800\n" -"PO-Revision-Date: 2025-07-20 18:59+0800\n" +"POT-Creation-Date: 2025-12-03 10:49:23+0800\n" +"PO-Revision-Date: 2025-12-03 10:52+0800\n" "Last-Translator: \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.6\n" +"X-Generator: Poedit 3.5\n" #: ../../../TerraAngel/UI/ClientWindows/ChatWindow.cs:201 #, csharp-format @@ -137,8 +137,8 @@ msgstr "接受不常见物品" msgid "Accept Very Rare" msgstr "接受非常稀有物品" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:25 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:28 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:26 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:29 msgid "Action" msgstr "操作" @@ -206,15 +206,15 @@ msgstr "应用自定义UUID" msgid "Attempt to bypass TShock" msgstr "尝试绕过TShock" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:48 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:55 msgid "Auto Use" msgstr "自动打怪" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:7 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:8 msgid "Auto-Aim" msgstr "自动瞄准" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:31 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:38 msgid "Auto-Attack Settings" msgstr "自动攻击设置" @@ -234,6 +234,10 @@ msgstr "自动钓鱼设置" msgid "Auto-Swing" msgstr "自动挥舞" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:78 +msgid "Auto-target nearest player" +msgstr "锁定最近的玩家" + #: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:80 msgid "Automation" msgstr "自动辅助" @@ -319,7 +323,7 @@ msgstr "按钮悬停" msgid "Bypass TShock" msgstr "尝试绕过TShock" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:45 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:46 msgid "Cancel" msgstr "取消" @@ -476,7 +480,7 @@ msgstr "停靠空背景" msgid "DockingPreview" msgstr "停靠预览" -#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:77 +#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:78 msgid "DOESN'T HAVE active bobber!" msgstr "没有有效的鱼漂!" @@ -543,7 +547,7 @@ msgstr "ESP碰撞箱" msgid "ESP Colors" msgstr "ESP颜色" -#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:17 +#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:18 msgid "Exploit Current Sign" msgstr "利用当前告示牌" @@ -658,7 +662,7 @@ msgstr "抓取弧度" msgid "Hammer Power: " msgstr "锤力: " -#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:71 +#: ../../../TerraAngel/Tools/Exploit/FishOutNPCExploit.cs:72 msgid "Has active bobber!" msgstr "有一个有效的鱼漂!" @@ -807,9 +811,9 @@ msgid "Item Spacing" msgstr "项目间距" #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:127 -#: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:61 #: ../../../TerraAngel/UI/ClientWindows/QuickItemBrowserWindow.cs:47 #: ../../../TerraAngel/UI/ClientWindows/QuickItemBrowserWindow.cs:81 +#: ../../../TerraAngel/UI/ClientWindows/MainWindow.cs:61 msgid "Items" msgstr "物品" @@ -826,14 +830,14 @@ msgstr "加入服务器" msgid "Journey Menu" msgstr "旅行力量菜单" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:45 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:46 msgid "Kick!" msgstr "踢出!" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:58 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:60 -#: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:73 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:54 +#: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:73 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:60 #, csharp-format msgid "Kill \"{0}\"" msgstr "杀死 \"{0}\"" @@ -943,7 +947,7 @@ msgstr "最大预测步数" msgid "MenuBarBg" msgstr "菜单栏背景" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:34 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:41 msgid "Minimum Target Range" msgstr "最小目标范围" @@ -999,10 +1003,10 @@ msgstr "幽灵模式设置" msgid "None" msgstr "无" -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:114 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:116 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:114 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:116 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:114 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:116 msgid "None/Server" msgstr "无/服务器" @@ -1049,6 +1053,10 @@ msgstr "生物" msgid "NPCs {0}-{1}" msgstr "生物: {0}-{1}" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:69 +msgid "Only PvP Players" +msgstr "仅PVP玩家" + #: ../../../TerraAngel/UI/TerrariaUI/PluginUI.cs:99 msgid "Open Plugins Folder" msgstr "打开插件文件夹" @@ -1069,8 +1077,8 @@ msgstr "其他玩家" msgid "Other TerraAngel user box color" msgstr "其他TerraAngel玩家碰撞箱颜色" -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:112 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:112 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:112 #, csharp-format msgid "Owned By: {0}/{1}" msgstr "所有者: {0}/{1}" @@ -1110,8 +1118,8 @@ msgstr "玩家 \"{0}\"" msgid "Player hitboxes" msgstr "玩家碰撞箱" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:24 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:27 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:25 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:28 msgid "Player ID" msgstr "玩家ID" @@ -1123,8 +1131,8 @@ msgstr "玩家检视器" msgid "Player Inventory" msgstr "玩家背包" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:23 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:26 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:24 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:27 msgid "Player Name" msgstr "玩家名字" @@ -1161,13 +1169,13 @@ msgstr "折线图悬停" msgid "PopupBg" msgstr "弹出窗口背景" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:7 -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:15 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:8 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:16 msgid "Portal Kick" msgstr "传送门踢出" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:9 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:17 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:10 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:18 msgid "Portal Teleport" msgstr "传送门传送" @@ -1178,7 +1186,7 @@ msgstr "传送门传送" msgid "Position: {0}" msgstr "位置: {0}" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:52 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:59 msgid "Prediction Scaling" msgstr "预测倍率" @@ -1190,7 +1198,7 @@ msgstr "修饰语: " msgid "Press L to spawn" msgstr "按下L生成" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:19 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:20 msgid "Press P to teleport" msgstr "按下P传送" @@ -1286,6 +1294,11 @@ msgstr "需要重载" msgid "Reloads plugins" msgstr "重载插件" +#: ../../../TerraAngel/Tools/Exploit/MsgUpdateSign.cs:17 +#, csharp-format +msgid "Remaining Time For Next Exploit: {0: 0.0}s" +msgstr "" + #: ../../../TerraAngel/WorldEdits/WorldEditBrush.cs:55 msgid "Remove" msgstr "移除" @@ -1295,7 +1308,7 @@ msgstr "移除" msgid "Replace" msgstr "替换" -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:47 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:54 msgid "Require Line of Sight" msgstr "需要视线" @@ -1356,7 +1369,7 @@ msgstr "搜索" msgid "Search:" msgstr "搜索:" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:48 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:49 msgid "Select!" msgstr "就他了!" @@ -1376,8 +1389,8 @@ msgstr "分隔符激活" msgid "SeparatorHovered" msgstr "分隔符悬停" -#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:51 -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:54 +#: ../../../TerraAngel/Tools/Exploit/PortalKick.cs:52 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:55 msgid "Seriously?" msgstr "真的吗?" @@ -1439,8 +1452,8 @@ msgstr "速度" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:86 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:87 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:80 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:83 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:80 #, csharp-format msgid "Speed: {0}" msgstr "速度: {0}" @@ -1522,10 +1535,24 @@ msgstr "标签选中上划线" msgid "Taking map screenshot" msgstr "正在为地图截图" +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:63 +msgid "Target Hostile NPCs" +msgstr "目标非城镇NPC" + +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:116 +#, fuzzy +#| msgid "Target Players" +msgid "Target Player" +msgstr "目标玩家" + +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:64 +msgid "Target Players" +msgstr "目标玩家" + #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:47 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:50 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:49 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:43 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:49 #, csharp-format msgid "Teleport to \"{0}\"" msgstr "传送至 \"{0}\"" @@ -1685,7 +1712,7 @@ msgstr "输入 #help 查看指令列表" msgid "Unlocked" msgstr "解锁" -#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:48 +#: ../../../TerraAngel/Tools/Exploit/PortalTeleport.cs:49 msgid "Unselect!" msgstr "算了吧!" @@ -1715,19 +1742,19 @@ msgstr "UUID 不能为空!" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:88 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:89 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:82 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:85 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:82 msgid "Velocity Dir: " msgstr "速率方向: " -#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:49 +#: ../../../TerraAngel/Tools/Automation/AutoAimTool.cs:56 msgid "Velocity Prediction" msgstr "速率预测" #: ../../../TerraAngel/Tools/Inspector/NPCInspectorTool.cs:87 #: ../../../TerraAngel/Tools/Inspector/ItemInspectorTool.cs:88 -#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:81 #: ../../../TerraAngel/Tools/Inspector/PlayerInspectorTool.cs:84 +#: ../../../TerraAngel/Tools/Inspector/ProjectileInspector.cs:81 #, csharp-format msgid "Velocity: {0}" msgstr "速度向量: {0}" @@ -1834,6 +1861,17 @@ msgstr "清空掉落物" msgid "World Edit" msgstr "世界编辑" +#, fuzzy +#~| msgid "Updates available" +#~ msgid "No online players available" +#~ msgstr "有可用更新" + +#~ msgid "Online Players" +#~ msgstr "在线玩家" + +#~ msgid "Target Specific Player" +#~ msgstr "选定玩家" + #~ msgid "Noclip" #~ msgstr "幽灵模式" diff --git a/TerraAngelPatches/Terraria/TerraAngel/Config/ClientConfig.cs b/TerraAngelPatches/Terraria/TerraAngel/Config/ClientConfig.cs index 845d680..76743f3 100644 --- a/TerraAngelPatches/Terraria/TerraAngel/Config/ClientConfig.cs +++ b/TerraAngelPatches/Terraria/TerraAngel/Config/ClientConfig.cs @@ -32,6 +32,7 @@ public UIConfigElementAttribute(string type, string name) public class Config { + public bool AutoAttackTargetPlayers = false; [UIConfigElement("zh-CN", "显示主窗口")] [UIConfigElement("en-US", "Show Stats Window")] public bool ShowStatsWindow = true; @@ -309,8 +310,10 @@ public class Config public bool AutoAttackTargetHostileNPCs = true; public bool AutoAttackRequireLineOfSight = true; public bool AutoAttackVelocityPrediction = true; - public float AutoAttackVelocityPredictionScaling = 0.2269f; + public float AutoAttackVelocityPredictionScaling = 0.1f; // 从 0.2269f 降低到 0.1f public float AutoAttackMinTargetRange = 800f; + public bool AutoAttackOnlyPvPPlayers = false; + public string AutoAttackTargetPlayerName = ""; public float StatsWindowHoveredTransperency = 0.65f; diff --git a/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs b/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs index 2f8d308..92f6082 100644 --- a/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs +++ b/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs @@ -9,17 +9,23 @@ public class AutoAimTool : Tool public ref bool FavorBosses => ref ClientConfig.Settings.AutoAttackFavorBosses; public ref bool TargetHostileNPCs => ref ClientConfig.Settings.AutoAttackTargetHostileNPCs; + public ref bool TargetPlayers => ref ClientConfig.Settings.AutoAttackTargetPlayers; public ref bool RequireLineOfSight => ref ClientConfig.Settings.AutoAttackRequireLineOfSight; public ref bool VelocityPrediction => ref ClientConfig.Settings.AutoAttackVelocityPrediction; + public ref bool OnlyPvPPlayers => ref ClientConfig.Settings.AutoAttackOnlyPvPPlayers; public ref float MinAttackRange => ref ClientConfig.Settings.AutoAttackMinTargetRange; public ref float VelocityPrectionScaling => ref ClientConfig.Settings.AutoAttackVelocityPredictionScaling; + public ref string TargetPlayerName => ref ClientConfig.Settings.AutoAttackTargetPlayerName; + public bool AutoUse; public bool CanAutoUse => AutoUse && !Main.playerInventory; public bool Enabled; + private int targetPlayerIndex = 0; + public override void DrawUI(ImGuiIOPtr io) { ImGui.Checkbox(Name, ref Enabled); @@ -49,8 +55,79 @@ public override void DrawUI(ImGuiIOPtr io) ImGui.Checkbox(GetString("Velocity Prediction"), ref VelocityPrediction); if (VelocityPrediction) { - ImGui.SliderFloat(GetString("Prediction Scaling"), ref VelocityPrectionScaling, 1f, 30f); + ImGui.SliderFloat(GetString("Prediction Scaling"), ref VelocityPrectionScaling, 0.0f, 10.0f, "%.3f"); + } + + ImGui.Separator(); + ImGui.Checkbox(GetString("Target Hostile NPCs"), ref TargetHostileNPCs); + ImGui.Checkbox(GetString("Target Players"), ref TargetPlayers); + + if (TargetPlayers) + { + ImGui.Indent(); + ImGui.Checkbox(GetString("Only PvP Players"), ref OnlyPvPPlayers); + + ImGui.Separator(); + + // 获取在线玩家列表 + var onlinePlayerNames = new List(); + var onlinePlayerIndices = new List(); + + // 添加"不选中任何玩家"选项 + onlinePlayerNames.Add(GetString("Auto-target nearest player")); + onlinePlayerIndices.Add(-1); + for (int i = 0; i < Main.maxPlayers; i++) + { + if (Main.player[i].active && i != Main.myPlayer) + { + string pvpStatus = Main.player[i].hostile ? "PvP" : "Non-PvP"; + onlinePlayerNames.Add($"[{i}] {Main.player[i].name} ({pvpStatus})"); + onlinePlayerIndices.Add(i); + } + } + + // 确保索引有效 + if (targetPlayerIndex >= onlinePlayerNames.Count) + targetPlayerIndex = 0; + + // 同步当前目标玩家名称与下拉框索引 + if (!string.IsNullOrWhiteSpace(TargetPlayerName)) + { + bool found = false; + for (int i = 1; i < onlinePlayerIndices.Count; i++) // 从1开始,跳过"不选中"选项 + { + if (onlinePlayerIndices[i] >= 0 && Main.player[onlinePlayerIndices[i]].name == TargetPlayerName) + { + targetPlayerIndex = i; + found = true; + break; + } + } + if (!found) + targetPlayerIndex = 0; // 如果找不到玩家,重置为"不选中" + } + else + { + targetPlayerIndex = 0; // 没有指定玩家名称时,选择"不选中" + } + + ImGui.Text($"{GetString("Target Player")}:"); + if (ImGui.Combo("##TargetPlayerSelection", ref targetPlayerIndex, onlinePlayerNames.ToArray(), onlinePlayerNames.Count)) + { + // 选择改变时更新目标玩家名称 + if (targetPlayerIndex == 0 || onlinePlayerIndices[targetPlayerIndex] < 0) + { + // 选择了"不选中任何玩家" + TargetPlayerName = ""; + } + else + { + TargetPlayerName = Main.player[onlinePlayerIndices[targetPlayerIndex]].name; + } + } + + ImGui.Unindent(); } ImGui.Unindent(); @@ -61,6 +138,7 @@ public override void DrawUI(ImGuiIOPtr io) public Vector2 TargetPoint = Vector2.Zero; public bool wantToShoot = false; public bool LockedOnToTarget = false; + public override void Update() { ImDrawListPtr drawList = ImGui.GetBackgroundDrawList(); @@ -69,27 +147,85 @@ public override void Update() Vector2 correctedPlayerCenter = Main.LocalPlayer.RotatedRelativePoint(Main.LocalPlayer.MountedCenter, reverseRotation: true); float minDist = float.MaxValue; - for (int i = 0; i < Main.maxNPCs; i++) + // 瞄准 NPC + if (TargetHostileNPCs) { - NPC npc = Main.npc[i]; + for (int i = 0; i < Main.maxNPCs; i++) + { + NPC npc = Main.npc[i]; + + if (npc.active) + { + if (npc.friendly) + continue; + + if (npc.immortal || npc.dontTakeDamage) + continue; + + float distToPlayer = correctedPlayerCenter.Distance(npc.Center); + + if (distToPlayer > MinAttackRange) + continue; + + RaycastData raycast = Raycast.Cast(correctedPlayerCenter, (npc.Center - correctedPlayerCenter).Normalized(), distToPlayer + 1f); + if (RequireLineOfSight) + { + if (raycast.Hit) + { + continue; + } + } - if (npc.active) + Vector2 targetPoint = npc.Center; + if (VelocityPrediction) + { + float sp = CalcPlayerShootSpeed(); + if (sp > 0 && (npc.velocity.X != 0 || npc.velocity.Y != 0)) + { + float ttt = (raycast.Distance / sp) * VelocityPrectionScaling; + RaycastData tttCorrection = Raycast.Cast(npc.Center, (npc.velocity * ttt).Normalized(), (npc.velocity * ttt).Length() + 0.1f); + targetPoint = tttCorrection.End; + } + } + + float d = targetPoint.DistanceSQ(correctedPlayerCenter); + if (d < minDist) + { + TargetPoint = targetPoint; + LockedOnToTarget = true; + minDist = d; + } + } + } + } + + // 瞄准玩家 + if (TargetPlayers) + { + for (int i = 0; i < Main.maxPlayers; i++) { - if (npc.friendly) + Player player = Main.player[i]; + + if (!player.active || player.dead || i == Main.myPlayer) continue; - if (!TargetHostileNPCs) + // 如果开启了仅锁定PVP玩家,则跳过非PVP玩家 + if (OnlyPvPPlayers && !player.hostile) continue; - if (npc.immortal || npc.dontTakeDamage) + // 如果指定了玩家名称,则仅锁定该玩家 + if (!string.IsNullOrWhiteSpace(TargetPlayerName) && player.name != TargetPlayerName) + continue; + + if (player.team == Main.LocalPlayer.team && player.team != 0) continue; - float distToPlayer = correctedPlayerCenter.Distance(npc.Center); + float distToPlayer = correctedPlayerCenter.Distance(player.Center); if (distToPlayer > MinAttackRange) continue; - RaycastData raycast = Raycast.Cast(correctedPlayerCenter, (npc.Center - correctedPlayerCenter).Normalized(), distToPlayer + 1f); + RaycastData raycast = Raycast.Cast(correctedPlayerCenter, (player.Center - correctedPlayerCenter).Normalized(), distToPlayer + 1f); if (RequireLineOfSight) { if (raycast.Hit) @@ -98,14 +234,14 @@ public override void Update() } } - Vector2 targetPoint = npc.Center; + Vector2 targetPoint = player.Center; if (VelocityPrediction) { float sp = CalcPlayerShootSpeed(); - if (sp > 0 && (npc.velocity.X != 0 || npc.velocity.Y != 0)) + if (sp > 0 && (player.velocity.X != 0 || player.velocity.Y != 0)) { float ttt = (raycast.Distance / sp) * VelocityPrectionScaling; - RaycastData tttCorrection = Raycast.Cast(npc.Center, (npc.velocity * ttt).Normalized(), (npc.velocity * ttt).Length() + 0.1f); + RaycastData tttCorrection = Raycast.Cast(player.Center, (player.velocity * ttt).Normalized(), (player.velocity * ttt).Length() + 0.1f); targetPoint = tttCorrection.End; } } @@ -119,7 +255,9 @@ public override void Update() } } } - if (!Main.mapFullscreen && LockedOnToTarget) drawList.AddCircleFilled(Util.WorldToScreenWorld(TargetPoint), 5f, Color.Red.PackedValue); + + if (!Main.mapFullscreen && LockedOnToTarget) + drawList.AddCircleFilled(Util.WorldToScreenWorld(TargetPoint), 5f, Color.Red.PackedValue); } } From f2c706a1a85c599108fe1c406f695b42feada798 Mon Sep 17 00:00:00 2001 From: xien <2383759126@qq.com> Date: Wed, 3 Dec 2025 11:15:00 +0800 Subject: [PATCH 2/3] update:Fixed duplicate key exception in ToolManager by using composite key instead of MetadataToken. --- .../Terraria/TerraAngel/Tools/ToolManager.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs b/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs index 8559a13..42fd95d 100644 --- a/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs +++ b/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs @@ -5,7 +5,7 @@ namespace TerraAngel.Tools; public class ToolManager { - private static Dictionary LoadedTools = new Dictionary(); + private static Dictionary LoadedTools = new Dictionary(); private static List[] ToolTabs; private static List AllTools; @@ -26,24 +26,55 @@ static ToolManager() public static void RemoveTool() where T : Tool => RemoveTool(typeof(T)); + private static string GetToolKey(Type type) + { + // Use a combination of module name and full type name to ensure uniqueness across assemblies + return $"{type.Module.Name}:{type.FullName}"; + } + public static Tool GetTool(Type type) { - return LoadedTools[type.MetadataToken]; + string key = GetToolKey(type); + if (LoadedTools.TryGetValue(key, out Tool? tool)) + { + return tool; + } + + // Fallback: try to find by type full name only (for backward compatibility) + foreach (var kvp in LoadedTools) + { + if (kvp.Value.GetType() == type) + { + return kvp.Value; + } + } + + throw new KeyNotFoundException($"Tool of type {type.FullName} is not registered."); } public static void AddTool(Type type) { + string key = GetToolKey(type); + + // Check if already registered + if (LoadedTools.ContainsKey(key)) + { + return; + } + Tool cringe = (Tool)Activator.CreateInstance(type)!; ToolTabs[(int)cringe.Tab].Add(cringe); - LoadedTools.Add(type.MetadataToken, cringe); + LoadedTools.Add(key, cringe); AllTools.Add(cringe); } public static void RemoveTool(Type type) { Tool cringe = GetTool(type); + string key = GetToolKey(type); + ToolTabs[(int)cringe.Tab].Remove(cringe); - LoadedTools.Remove(type.MetadataToken); + LoadedTools.Remove(key); AllTools.Remove(cringe); } From 0caf0dcb1595257f76d176395c2aa85d4941d757 Mon Sep 17 00:00:00 2001 From: xien <2383759126@qq.com> Date: Wed, 3 Dec 2025 13:25:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=92=8C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tools/Automation/AutoAimTool.cs | 206 ++++++++++-------- .../Terraria/TerraAngel/Tools/ToolManager.cs | 14 +- 2 files changed, 124 insertions(+), 96 deletions(-) diff --git a/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs b/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs index 92f6082..f5f9f0f 100644 --- a/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs +++ b/TerraAngelPatches/Terraria/TerraAngel/Tools/Automation/AutoAimTool.cs @@ -1,4 +1,6 @@ using TerraAngel.Physics; +using System.Collections.Generic; +using System; namespace TerraAngel.Tools.Automation; @@ -139,119 +141,94 @@ public override void DrawUI(ImGuiIOPtr io) public bool wantToShoot = false; public bool LockedOnToTarget = false; + private struct TargetCandidate + { + public Vector2 Center; + public Vector2 Velocity; + public bool IsValid; + } + + private bool TryFindBestTarget( + Vector2 playerCenter, + Func getCandidate, + int maxCount, + out Vector2 bestTarget) + { + float minDistSq = float.MaxValue; + bestTarget = Vector2.Zero; + bool foundTarget = false; + + for (int i = 0; i < maxCount; i++) + { + TargetCandidate candidate = getCandidate(i); + if (!candidate.IsValid) + continue; + + float distToPlayer = playerCenter.Distance(candidate.Center); + if (distToPlayer > MinAttackRange) + continue; + + RaycastData raycast = Raycast.Cast(playerCenter, (candidate.Center - playerCenter).Normalized(), distToPlayer + 1f); + if (RequireLineOfSight && raycast.Hit) + continue; + + Vector2 targetPoint = candidate.Center; + if (VelocityPrediction) + { + float shootSpeed = CalcPlayerShootSpeed(); + if (shootSpeed > 0 && (candidate.Velocity.X != 0 || candidate.Velocity.Y != 0)) + { + float timeToTarget = (raycast.Distance / shootSpeed) * VelocityPrectionScaling; + RaycastData predictionRaycast = Raycast.Cast( + candidate.Center, + (candidate.Velocity * timeToTarget).Normalized(), + (candidate.Velocity * timeToTarget).Length() + 0.1f); + targetPoint = predictionRaycast.End; + } + } + + float distSq = targetPoint.DistanceSQ(playerCenter); + if (distSq < minDistSq) + { + bestTarget = targetPoint; + minDistSq = distSq; + foundTarget = true; + } + } + + return foundTarget; + } + public override void Update() { ImDrawListPtr drawList = ImGui.GetBackgroundDrawList(); if (Enabled && !Main.gameMenu) { Vector2 correctedPlayerCenter = Main.LocalPlayer.RotatedRelativePoint(Main.LocalPlayer.MountedCenter, reverseRotation: true); - float minDist = float.MaxValue; + LockedOnToTarget = false; - // 瞄准 NPC + // Target NPCs if (TargetHostileNPCs) { - for (int i = 0; i < Main.maxNPCs; i++) + if (TryFindBestTarget(correctedPlayerCenter, GetNPCCandidate, Main.maxNPCs, out Vector2 npcTarget)) { - NPC npc = Main.npc[i]; - - if (npc.active) - { - if (npc.friendly) - continue; - - if (npc.immortal || npc.dontTakeDamage) - continue; - - float distToPlayer = correctedPlayerCenter.Distance(npc.Center); - - if (distToPlayer > MinAttackRange) - continue; - - RaycastData raycast = Raycast.Cast(correctedPlayerCenter, (npc.Center - correctedPlayerCenter).Normalized(), distToPlayer + 1f); - if (RequireLineOfSight) - { - if (raycast.Hit) - { - continue; - } - } - - Vector2 targetPoint = npc.Center; - if (VelocityPrediction) - { - float sp = CalcPlayerShootSpeed(); - if (sp > 0 && (npc.velocity.X != 0 || npc.velocity.Y != 0)) - { - float ttt = (raycast.Distance / sp) * VelocityPrectionScaling; - RaycastData tttCorrection = Raycast.Cast(npc.Center, (npc.velocity * ttt).Normalized(), (npc.velocity * ttt).Length() + 0.1f); - targetPoint = tttCorrection.End; - } - } - - float d = targetPoint.DistanceSQ(correctedPlayerCenter); - if (d < minDist) - { - TargetPoint = targetPoint; - LockedOnToTarget = true; - minDist = d; - } - } + TargetPoint = npcTarget; + LockedOnToTarget = true; } } - // 瞄准玩家 + // Target Players if (TargetPlayers) { - for (int i = 0; i < Main.maxPlayers; i++) + if (TryFindBestTarget(correctedPlayerCenter, GetPlayerCandidate, Main.maxPlayers, out Vector2 playerTarget)) { - Player player = Main.player[i]; - - if (!player.active || player.dead || i == Main.myPlayer) - continue; - - // 如果开启了仅锁定PVP玩家,则跳过非PVP玩家 - if (OnlyPvPPlayers && !player.hostile) - continue; - - // 如果指定了玩家名称,则仅锁定该玩家 - if (!string.IsNullOrWhiteSpace(TargetPlayerName) && player.name != TargetPlayerName) - continue; - - if (player.team == Main.LocalPlayer.team && player.team != 0) - continue; - - float distToPlayer = correctedPlayerCenter.Distance(player.Center); - - if (distToPlayer > MinAttackRange) - continue; - - RaycastData raycast = Raycast.Cast(correctedPlayerCenter, (player.Center - correctedPlayerCenter).Normalized(), distToPlayer + 1f); - if (RequireLineOfSight) - { - if (raycast.Hit) - { - continue; - } - } - - Vector2 targetPoint = player.Center; - if (VelocityPrediction) - { - float sp = CalcPlayerShootSpeed(); - if (sp > 0 && (player.velocity.X != 0 || player.velocity.Y != 0)) - { - float ttt = (raycast.Distance / sp) * VelocityPrectionScaling; - RaycastData tttCorrection = Raycast.Cast(player.Center, (player.velocity * ttt).Normalized(), (player.velocity * ttt).Length() + 0.1f); - targetPoint = tttCorrection.End; - } - } - - float d = targetPoint.DistanceSQ(correctedPlayerCenter); - if (d < minDist) + float currentBestDistSq = LockedOnToTarget ? TargetPoint.DistanceSQ(correctedPlayerCenter) : float.MaxValue; + float newDistSq = playerTarget.DistanceSQ(correctedPlayerCenter); + + if (newDistSq < currentBestDistSq) { - TargetPoint = targetPoint; + TargetPoint = playerTarget; LockedOnToTarget = true; - minDist = d; } } } @@ -261,6 +238,45 @@ public override void Update() } } + private TargetCandidate GetNPCCandidate(int index) + { + NPC npc = Main.npc[index]; + + if (!npc.active || npc.friendly || npc.immortal || npc.dontTakeDamage) + return new TargetCandidate { IsValid = false }; + + return new TargetCandidate + { + Center = npc.Center, + Velocity = npc.velocity, + IsValid = true + }; + } + + private TargetCandidate GetPlayerCandidate(int index) + { + Player player = Main.player[index]; + + if (!player.active || player.dead || index == Main.myPlayer) + return new TargetCandidate { IsValid = false }; + + if (OnlyPvPPlayers && !player.hostile) + return new TargetCandidate { IsValid = false }; + + if (!string.IsNullOrWhiteSpace(TargetPlayerName) && player.name != TargetPlayerName) + return new TargetCandidate { IsValid = false }; + + if (player.team == Main.LocalPlayer.team && player.team != 0) + return new TargetCandidate { IsValid = false }; + + return new TargetCandidate + { + Center = player.Center, + Velocity = player.velocity, + IsValid = true + }; + } + public float CalcPlayerShootSpeed() { int projectileType = Main.LocalPlayer.HeldItem.shoot; diff --git a/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs b/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs index 42fd95d..57fc2e7 100644 --- a/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs +++ b/TerraAngelPatches/Terraria/TerraAngel/Tools/ToolManager.cs @@ -6,6 +6,7 @@ namespace TerraAngel.Tools; public class ToolManager { private static Dictionary LoadedTools = new Dictionary(); + private static Dictionary TypeToKeyCache = new Dictionary(); private static List[] ToolTabs; private static List AllTools; @@ -34,17 +35,25 @@ private static string GetToolKey(Type type) public static Tool GetTool(Type type) { + // Check cache first + if (TypeToKeyCache.TryGetValue(type, out string? cachedKey)) + { + return LoadedTools[cachedKey]; + } + string key = GetToolKey(type); if (LoadedTools.TryGetValue(key, out Tool? tool)) { + TypeToKeyCache[type] = key; return tool; } - // Fallback: try to find by type full name only (for backward compatibility) + // Fallback: try to find by type match and cache the result foreach (var kvp in LoadedTools) { if (kvp.Value.GetType() == type) { + TypeToKeyCache[type] = kvp.Key; return kvp.Value; } } @@ -65,6 +74,7 @@ public static void AddTool(Type type) Tool cringe = (Tool)Activator.CreateInstance(type)!; ToolTabs[(int)cringe.Tab].Add(cringe); LoadedTools.Add(key, cringe); + TypeToKeyCache[type] = key; AllTools.Add(cringe); } @@ -75,6 +85,7 @@ public static void RemoveTool(Type type) ToolTabs[(int)cringe.Tab].Remove(cringe); LoadedTools.Remove(key); + TypeToKeyCache.Remove(type); AllTools.Remove(cringe); } @@ -104,6 +115,7 @@ public static void Update() public static void Clear() { LoadedTools.Clear(); + TypeToKeyCache.Clear(); AllTools.Clear(); Array.Clear(ToolTabs);