本帖最后由 czm233 于 2019-2-19 23:01 编辑
前言:
之前我看到很多dalao在自己写端用或者卖给别人,所以对这个也来了兴趣。最近放假有点时间,又看到身边很多人也开始写端,我就决定尝试一下。
这个帖子并非什么专业的帖子,也可以说只是我在尝试路上的一些笔记。看论坛上没有这样的帖子,所以我分享出来想让大家也了解一下。
如果您是对这个很熟悉的dalao,这只是个萌新的帖子,写得不好请不要喷我。
如果您发现了这个帖子中的错误,欢迎指出交流。
谢谢!(不知道这个帖子能不能发在这区,不能的话请通知我删除)
一、反编译、反混淆 MC
在下文中,我将把 反编译和反混淆 简称为 处理
在这一部分中,我将用到MCP(全称Minecraft Coder Pack)来处理Minecraft1.8.8进行挂端编写
1.下载要用到的工具
处理Minecraft1.8.8使用的是MCP918版本
官方下载地址:http://www.modcoderpack.com/files/mcp918.zip
2.开始处理
下载完成后,将这个zip中的内容解压到一个文件夹下
在其中的jars文件夹中,新建一个versions文件夹,再将你的Minecraft1.8.8复制到其中
如果你操作得正确,那么现在的目录应该是这样
操作完成后目录的情况
然后编辑根目录下的decompile.bat,将以下内容覆盖到其中
[Asm] 纯文本查看 复制代码 @echo off
runtime\bin\python\python_mcp runtime\decompile.py --client --nocopy --norecompile %*
pause
现在,运行decompile.bat,静静等待操作完成
二、将MC代码导入IDE
第一步完成后,你肯定可以发现MCP的src文件夹里多了很多东西,这就是MCP处理完毕后得到的源码了
不过先别急着用它新建项目,打开这个文件夹,你可以看到里面还有一个minecraft文件夹,这个才是src的根目录
将它复制出来(这样可以保留一份原来的代码备用),再用它在你的IDE里新建一个项目,等IDE扫描完成,你会发现里面有很多错误,这是因为我们没有导入类库
打开里面的1.8.8.json,找到里面的“libraries”数组,这里面写了1.8.8这个版本需要的所有类库,从你MC的.minecraft/libraries目录中按名字一个一个找到他们,或者从里面提供的url处下载,并导入你的项目中,再让IDE扫描项目,如果一切顺利,代码此时应该没有任何错误了(当然你有时间的话也可以去修那一堆警告)
三、开始写各种功能(这个部分很大!)
1、Hud
一个挂端,首先总得有控制各部分开关的地方,可以是命令,可以是Hud,可以是ClickGUI。
命令实现最简单,但是使用麻烦;Hud更难,但是使用更方便;ClickGUI最难,但是使用比较方便而且可以进行很多配置
我们就先从Hud开始吧
在net.minecraft.client.gui包下有一个GuiIngame类,这个类参与游戏内游玩时的屏幕渲染,我们可以编辑它的renderGameOverlay方法来在游戏屏幕上渲染我们需要的内容,比如:
[Java] 纯文本查看 复制代码 FontRenderer fr = this.getFontRenderer();
fr.drawString("Test", 10, 10, ColorHelper.argb(0, 194, 194, 194));
这段代码渲染了一个颜色RGB均为194,透明度为0的Test字符串在屏幕上10,10处,这里面的ColorHelper是我自己写的,用来生成argb颜色int,这里就不贴代码了
这个包下还有一个Gui类,里面有一个静态方法drawRect,有5个参数,这里就有一个坑了
注意!注意!注意!这个方法的最后一个颜色参数是ARGB格式,但是里面的A在这里并不代表透明度,而是不透明度!
使用MC提供的这几个方法,我们就可以设计一个简单的Hud了
2、Reach
做完了Hud,接下来做具体功能吧
Reach,就是让你手更长,可以打到更远距离处的玩家,这个功能如何实现呢,首先我们看一下Minecraft这个类,里面响应了攻击键按下时的操作。分析响应部分,可以看到它调用了clickMouse方法,再转到这个方法,它使用了objectMouseOver这个变量来判断攻击的对象。使用IDE查找用例,发现net.minecraft.client.renderer包下的EntityRenderer类在getMouseOver对这个变量进行了赋值。
分析这个方法,其大致逻辑如下(随便画了个图):
流程图
可以看到,Reach的关键在后面的判断,具体代码是这一块:
[Java] 纯文本查看 复制代码 if (this.pointedEntity != null && flag && vec3.distanceTo(vec33) > 3.0D) // Reach(距离小于4.5格时只需要改这里)
{
this.pointedEntity = null;
this.mc.objectMouseOver = new MovingObjectPosition(MovingObjectPosition.MovingObjectType.MISS, vec33, (EnumFacing)null, new BlockPos(vec33));
}
只要修改那个3.0D,就可以达到Reach的效果了,当然如果你修改到大于4.5D,就还是4.5D的效果,因为如果距离大于4.5格还有两个地方要改,但是4.5格一般已经足够,所以这里我们就不赘述了
3、Hitbox
Hitbox,就是增大实体的攻击判定箱,使你更容易打到实体
Hitbox的实现重点也在EntityRenderer.getMouseOver中。看之前的流程图可以知道,重点在遍历数组时的expand方法,具体代码如下:
[Java] 纯文本查看 复制代码 float f1 = entity1.getCollisionBorderSize();
AxisAlignedBB axisalignedbb = entity1.getEntityBoundingBox().expand((double)f1, (double)f1, (double)f1);
只要修改f1的值就可以达到Hitbox的效果
4、Sprint
Sprint,就是强制疾跑
Sprint的实现方式很多,比如去掉一些判断等等,我们这里使用最简单最暴力的方式
转到net.minecraft.entity包下EntityLivingBase类的setSprinting方法,在最开始将这个方法的唯一参数sprinting设置为true,就可以达到一直疾跑的效果了
5、NoFall
NoFall,顾名思义就是无摔落伤害,它的实现可以用很多种方式,这里我们讨论最原始的一种(因为这个帖子并非讨论怎么绕过反作弊的)
在游玩时,net.minecraft.network.play.client包下的C03PacketPlayer及其内部类负责与服务端的位置交互,其中就有与摔落计算密切相关的onGround参数,这个参数为true表示玩家在地上,反之亦然
那么,只要我们修改这里,让onGround一直为true,那不就不会计算摔落伤害了吗?
将C03PacketPlayer及其各个内部类的构造器修改,在最后面加上一句this.onGround = true;就大功告成了
6、BugUp
BugUp就是掉落弹回,这个方法的实现可以直接让自己tp回去
在EntityPlayerSP类中加入一个BlockPos类型的lastestOG变量,再在它的的onLivingUpdate里加入这段代码:
[Java] 纯文本查看 复制代码 if(onGround)
lastestOG = getPosition();
else if((lastestOG.getY() - getPosition().getY()) >= 3)
setPosition(lastestOG.getX(), lastestOG.getY(), lastestOG.getZ());
现在你掉落三格就会自动回到方块上了!
未完待续... |