参考知乎上的一篇文章:https://zhuanlan.zhihu.com/p/367243635

知乎上的做法是:

  1. 修改游戏本身的FishingCheck函数,添加一个钓鱼的标志位fishFlag,初始为false,如果钓到了鱼就将fishFlag置为true
  2. 创建一个线程,内部是一个死循环,循环不断检测fishFlag,如果为true则执行2次鼠标单击事件,一次为收杆,一次为重新抛竿,然后将fishFlag重新设置为false

这个做法有些问题,一个是游戏无法完全退出,退出后会残留一个线程;还有就是2次鼠标事件的间隔太短,有时游戏内收杆的动画还没结束,抛竿的鼠标事件就执行了

我参考文章的做法做了一些修改:

  1. 下载dnSpy,如果要调试则需要下载32位版本

    https://github.com/dnSpyEx/dnSpy/releases

  2. dnSpy打开泰拉瑞亚主程序,找到Projectile

  3. 右键Projectile类创建一个DoFish方法,并编辑函数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public extern void DoFish(); 

    //替换这一句为

    [System.Runtime.InteropServices.DllImport("user32")]
    private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
    public void DoFish(){
    //收杆
    Projectile.mouse_event(2, 0, 0, 0, 0);
    Thread.Sleep(100);
    Projectile.mouse_event(4, 0, 0, 0, 0);
    Thread.Sleep(500);//这个是收杆和抛竿的间隔,如果人物站的比较远可以适当调高
    //下杆
    Projectile.mouse_event(2, 0, 0, 0, 0);
    Thread.Sleep(100);
    Projectile.mouse_event(4, 0, 0, 0, 0);
    Thread.Sleep(500);
    }

    然后添加引用using System.Threading;

  4. 编辑Projectile类下的FishingCheck函数,末尾添加

    1
    2
    3
    4
    5
    6
    7
    using (StreamReader streamReader = new StreamReader("fish.conf"))
    {
    if (flag && streamReader.ReadLine() == "true")
    {
    new Thread(new ThreadStart(this.DoFish)).Start();
    }
    }

    然后添加引用using System.Threading;using System.IO;

    在游戏目录下创建fish.conf,如果内容为true则开启自动钓鱼

  5. 保存为模块,然后就能愉快的钓鱼了