举一个IL的应用的例子,比如我想让蒸汽机输出石油
蒸汽机原来输出的是水,水在游戏里是water,所以直接在蒸汽机的config文件里搜索water就行了
在这里,然后点water,这里有游戏里所有液体的名称,石油的英文是petroleum,按ctrl+f搜他会发现有,所以石油的英文就是他了,如果不知道石油的英文怎么搜呢,打开poedit,搜石油你就会搜到了
然后回到上面图的位置,在water那右键编辑IL指令,你会看到这些玩意
water呢,没有water,还记得源码里把water赋给了destElem,这里有这个单词,那么会不会上面那个数字就是water呢,看到他前面那个ldc.i4表示这个数字是个int类型,恍惚间还记得当时点water的时候出现了water=一串数字,那个也是int型,把那串数字转成16进制会发现刚好等于0x6D796197,所以,这里这个数字就表示水,那么我们改石油的时候也需要填一个16进制的数字,回到刚才的页面看看石油的数字是多少,-486269331,把他转成16进制,-0x1CFBE193,也就是说要把0x6D796197改成-0x1CFBE193
然后开始写代码,这里直接贴出来吧,IL的代码都比较死板
第一行注意这里要补丁的方法是DoPostConfigureComplete,下面的方法体,改IL的全长这样,不管补丁的方法参数是什么返回值是什么,然后下面的code[34].operand = …,这里是所有IL代码唯一不同的地方,34就是要修改的数字的序号,就是IL指令第一列的那个,operand表示修改的是操作符
至于怎么修改操作码,百度,这里不教,改操作码的情况非常非常少,而且改操作码非常危险,很可能造成游戏崩溃
其实这个例子并没有那么好,改蒸汽机输出直接用后置补丁就行了,不过这里主要是为了教大家怎么读IL代码,跟游戏中一些莫名其妙的0x数字都是啥
IL更好的应用是下面这个,这里是修改挖掘不减半,代码大家自己看,并不难