blocklauncher插件吧 关注:2,541贴子:18,931

大杂烩,插件代码原理

取消只看楼主收藏回复

首先我们分析一下Level::setTime(long)的原理。
Level是它的类,然而我们的插件不像js那样温柔,所以,必须获取Level。
我觉得,tick是获取Level的好办法。
class Level {
public:
static void tick();//钩子必须添加static,我现在用的是隐式
void setTime(long);
};
这是前头工作。我们将在教程里详细探讨。
第二个,操作。
static void (*t_r)(Level*);//指针声明
static void t_h(Level*l) {
level=l;
t_r(level);
}
MSHookFunction((void*)&Level::tick,(void*)&t_h,(void**)&t_r);//这是放在模板里jni那一行的。
手头工作搞定了以后,我们喝杯java,继续干。
*t_r的上面添加Level*level=NULL;//初始化,防止寄存器垃圾值
当然,要有钩子,才能触发函数,今晚继续。



IP属地:广东来自Android客户端1楼2015-07-30 09:59回复
    @ID是空岛人 你要的源码,未完工


    IP属地:广东来自Android客户端2楼2015-07-30 10:01
    收起回复
      钩子是MinecraftClient::onPlayerLoaded


      IP属地:广东来自Android客户端6楼2015-07-30 22:17
      回复
        用这个勾住进入世界


        IP属地:广东来自Android客户端7楼2015-07-30 22:17
        收起回复
          level->setTime(13380)


          IP属地:广东来自Android客户端8楼2015-07-30 22:17
          回复
            static void (*a_r)(MinecraftClient*,Player*);


            IP属地:广东来自Android客户端9楼2015-07-30 22:35
            回复
              static void a_h(MinecraftClient*m,Player*p) {
              level->setTime(13380);
              a_r(m,p);
              }


              IP属地:广东来自Android客户端10楼2015-07-30 22:36
              回复
                当然,我们不仅要掌握一级函数,还有二级


                IP属地:广东来自Android客户端13楼2015-07-31 11:13
                回复
                  但我们在函数表里看不到LocalPlayer::tick,那咋办呢?


                  IP属地:广东来自Android客户端15楼2015-07-31 11:15
                  回复
                    别急,还有 Level::getLocalPlayer(void)


                    IP属地:广东来自Android客户端16楼2015-07-31 11:16
                    回复
                      刚刚我们用了tick获取了Level,现在要从level里获取localplayer了


                      IP属地:广东来自Android客户端17楼2015-07-31 11:17
                      回复
                        今晚继续


                        IP属地:广东来自Android客户端18楼2015-07-31 11:17
                        回复
                          当然,现在有些函数是没有获取指令的,所以我们就要用到构造函数。


                          IP属地:广东来自Android客户端20楼2015-07-31 22:23
                          回复
                            例如:Level::level和TileSource::TileSource


                            IP属地:广东来自Android客户端21楼2015-07-31 22:24
                            回复
                              对了,我们发现了一个有趣的现象,就是冒号的前面和后面的名字都一样。


                              IP属地:广东来自Android客户端22楼2015-07-31 22:25
                              回复