FOR ENGLISH VERSION
在Terraria 1.4.5.3版本下测试可行
使用工具:dnSpy
请下载使用32位版本
- 使用dnSpy打开terraria主程序,进行反编译
- 在程序左侧找到 Terraria - Terraria.exe - Terraria
- 右键点击Terraria,右键 → 添加类 (Add Class),如图中红框所示
- 在弹出的窗口中粘贴如下代码, 点击 编译
using System;
using Microsoft.Xna.Framework;
namespace Terraria
{
public class AutoFisher
{
// 收杆倒计时:>0 时每帧递减,到 0 时执行收杆
public static int PullTimer;
// 放杆冷却:收杆后需等待几帧再抛竿
public static int AutocastDelay;
// 是否已收过杆(收杆后才开启自动抛竿)
public static bool FirstReelDone;
// 校验位:true = 本次收杆由 FishingCheck 触发(鱼上钩),false = 否则(抛竿时还原)
public static bool ReelFromFishingCheck;
// 上一帧是否有浮标(用于检测玩家手动收杆)
private static bool HadBobberLastFrame;
// 锁定抛竿位置(可选)
public static float TargetX;
public static float TargetY;
public static void Update()
{
if (Main.myPlayer < 0 || Main.myPlayer >= Main.player.Length)
return;
Player player = Main.player[Main.myPlayer];
if (!player.active || player.dead)
return;
bool hasBobber = CheckBobbersActive(Main.myPlayer);
// 0. 不钓鱼时(切换掉鱼竿)立即关闭自动抛竿
if (player.HeldItem.fishingPole == 0)
{
FirstReelDone = false;
PullTimer = 0;
ReelFromFishingCheck = false;
HadBobberLastFrame = hasBobber;
return;
}
// 0.5. 玩家手动收杆:上一帧有浮标、这帧没了、且不是 FishingCheck 触发的 -> 关闭自动抛竿
if (HadBobberLastFrame && !hasBobber && !ReelFromFishingCheck)
FirstReelDone = false;
// 1. 自动收杆:PullTimer 倒计时(PullTimer 由 FishingCheck 设置,此时 ReelFromFishingCheck 已为 true)
if (PullTimer > 0)
{
PullTimer--;
if (PullTimer == 0)
{
player.controlUseItem = true;
player.releaseUseItem = true;
player.ItemCheck();
FirstReelDone = true;
AutocastDelay = 15;
}
}
// 2. 自动放杆:收杆后、无浮标且持有鱼竿时自动抛竿
if (FirstReelDone && player.HeldItem.fishingPole > 0)
{
if (AutocastDelay > 0)
AutocastDelay--;
else if (!hasBobber)
{
ReelFromFishingCheck = false; // 抛竿时还原,下次收杆前保持 false
if (TargetX != 0f || TargetY != 0f)
{
Main.mouseX = (int)(TargetX - Main.screenPosition.X);
Main.mouseY = (int)(TargetY - Main.screenPosition.Y);
}
player.controlUseItem = true;
player.releaseUseItem = true;
player.ItemCheck();
AutocastDelay = 10;
}
}
HadBobberLastFrame = CheckBobbersActive(Main.myPlayer); // 帧末状态(本帧可能已收杆)
}
private static bool CheckBobbersActive(int whoAmI)
{
for (int i = 0; i < Main.projectile.Length; i++)
{
Projectile p = Main.projectile[i];
if (p.active && p.owner == whoAmI && p.bobber)
return true;
}
return false;
}
}
}- 在dnSpy左上角 文件 - 保存模块 - 选择路径 - 确定, 将新添加的类保存到exe文件中
- 在程序左侧找到 Terraria - Terraria.exe - Terraria - Projectile - FishingCheck,右键 → 编辑方法 (Edit Method C#)。
- 在如图下面的位置插入代码, 点击 编译
if (owner == Main.myPlayer && Main.player[owner].active && !Main.player[owner].dead)
{
AutoFisher.PullTimer = (int)(0.5f * 60 + 1); // 0.5 秒延迟后收杆
AutoFisher.ReelFromFishingCheck = true; // 校验位:本次收杆由 FishingCheck 触发
AutoFisher.TargetX = Center.X; // 记住抛竿位置,用于自动放杆
AutoFisher.TargetY = Center.Y;
}-
在程序左侧找到 Terraria - Terraria.exe - Terraria - Main - DoUpdate, 右键点击 DoUpdate,右键 → 编辑方法 (Edit Method C#)。
-
在以下位置上面插入代码, 点击 编译
Terraria.AutoFisher.Update();- 在dnSpy左上角 文件 - 保存模块 - 选择路径 - 确定, 将新添加的类保存到exe文件中
- 通过注释初始化steam信息的代码,可以实现免登录
- 在程序左侧找到Terraria - Terraria.exe - Terraria.Social - SocialAPI - LoadSteam(字体显示颜色为橙色),右键点击
LoadSteam,选择编辑方法(C#),在右侧代码区域内,将图中红框部分删除即可
- 存档位置
- steam正版的存档位置在
C:\Program Files (x86)\Steam\userdata\[your steam id]\105600\remote,该路径会随着你的steam安装位置和你的steamid不同而改变 - 离线版的存档位置在
%userprofile%\Documents\My Games\Terraria路径下
- 一些别的细节
Terraria - Terraria.exe - Terraria - Item - SetDefaults //初始化物品属性,可以在这里改单独武器的伤害,效率
Terraria - Terraria.exe - Terraria.GameContent.ItemDropRules - ItemDropDatabase //掉落的物品和概率,概率为值的倒数,例如值20代表概率为1/20
Terraria - Terraria.exe - Terraria - Item - buyPrice //购买价格
Terraria - Terraria.exe - Terraria - Item - sellPrice //出售价格
Terraria - Terraria.exe - Terraria - Player - Hurt //受到伤害,经过测试可能和无敌帧有一点关系但不多,数值也不影响受到伤害,直接return一个数就可以无敌,烧伤等负面效果无法免疫
Terraria - Terraria.exe - Terraria - Player - GetWeaponDamage //所有武器伤害的计算都在这里
- 编译时报错
the type or namespace name "ReLogic",则去Terraria - Terraria.exe - 资源里看看有没有类似的dll,右键保存dll到本地,然后用dnSpy左上角 文件 - 打开,打开dll即可正常编译。








