Skip to content

CurssedCoffin/Terraria-auto-fish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 

Repository files navigation

Terraria AUTO-FISH tutorial

FOR ENGLISH VERSION

在Terraria 1.4.5.3版本下测试可行

avatar

使用工具:dnSpy

请下载使用32位版本

自动钓鱼实现

  1. 使用dnSpy打开terraria主程序,进行反编译
  2. 在程序左侧找到 Terraria - Terraria.exe - Terraria
  3. 右键点击Terraria,右键 → 添加类 (Add Class),如图中红框所示

avatar

  1. 在弹出的窗口中粘贴如下代码, 点击 编译

avatar

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;
        }
    }
}
  1. 在dnSpy左上角 文件 - 保存模块 - 选择路径 - 确定, 将新添加的类保存到exe文件中

avatar

  1. 在程序左侧找到 Terraria - Terraria.exe - Terraria - Projectile - FishingCheck,右键 → 编辑方法 (Edit Method C#)

avatar

  1. 在如图下面的位置插入代码, 点击 编译

avatar

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;
}
  1. 在程序左侧找到 Terraria - Terraria.exe - Terraria - Main - DoUpdate, 右键点击 DoUpdate,右键 → 编辑方法 (Edit Method C#)

  2. 在以下位置上面插入代码, 点击 编译

avatar

Terraria.AutoFisher.Update();
  1. 在dnSpy左上角 文件 - 保存模块 - 选择路径 - 确定, 将新添加的类保存到exe文件中

离线游玩实现(免steam)

  1. 通过注释初始化steam信息的代码,可以实现免登录
  2. 在程序左侧找到Terraria - Terraria.exe - Terraria.Social - SocialAPI - LoadSteam(字体显示颜色为橙色),右键点击LoadSteam,选择编辑方法(C#),在右侧代码区域内,将图中红框部分删除即可

avatar

avatar

  1. 存档位置
  • steam正版的存档位置在 C:\Program Files (x86)\Steam\userdata\[your steam id]\105600\remote,该路径会随着你的steam安装位置和你的steamid不同而改变
  • 离线版的存档位置在%userprofile%\Documents\My Games\Terraria路径下
  1. 一些别的细节
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即可正常编译。

About

A tutorial for terraria auto fish

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors