提示

  1. 请勿将通过此教程制作的客户端用于不允许使用这类客户端的服务器内使用,若使用,后果自负!

  2. 该教程中的内容并非 挂端 的制作教程,所以并不包含与挂端有关的内容(如 Fly,Blink,FreeCam ,X-Ray 等功能),仅仅是基于 Minecraft-Hack-BaseClient 项目进行制作,该教程内所展示的功能皆可在正常的服务器内使用,请审核注意。

  3. 该教程仅应用于已购买了Minecraft正版账号的人,否则你可能将会违反 Minecraft EULA

开始

使用MCP进行反编译

首先下载 MCP918 反编译工具对 Minecraft 1.8.8 进行反编译,在下载完成 MCP 后使用任意启动器(教程所使用的教程为 PCL2 启动器)在 官方启动器目录 启动一次 Minecraft 1.8.8 然后退出,然后打开下载好的 MCP 中的 decompile.bat 或 decompile.sh(对应 Linux 或 Mac 系统) 进行反编译,预计需要 10 分钟左右。

提示:若出现提示 scalac 未安装,请忽略此提示,因为在 scalac 安装后可能会导致在对客户端的重新编译时失败。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第1张图片

然后删除 <mcp>/src/minecraft 目录并将 OxideWaveLength/Minecraft-Hack-BaseClient 项目中的 minecraft 目录全部复制到 <mcp>/src 目录中,然后在此目录中创建 resources 资源目录,将 <mcp>\temp\src\minecraft 中除了 net 和 META-INF 目录全部复制到刚刚创建的资源目录中为导入项目做准备,然后再将 <mcp>/jars/libraries 目录中的所有 *.jar 文件复制到 <mcp>/lib 目录中为导入项目做准备。

导入项目

导入模块

这里以 IDEA 为例,但是最好使用 Eclipse IDE,首先新创建一个空项目,然后打开项目结构,设置 JDK1.8,语言级别 8,然后打开模块选项,删除已有的所有模块,然后导入模块 <mcp>/eclipse/Client/.project,一直点下一步和是,选择 JDK 1.8,然后删除所有已有的内容根,并导入新的内容根 <mcp>/src ,将 minecraft 设置为源代码目录,resources 设置为资源目录。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第2张图片导入依赖

首先打到库选项,点击加号选择 Java,然后将 <mcp>/lib 目录导入,并添加到刚才的模块中,然后打回到模块选择,点击依赖,删除除了刚刚导入的依赖的所有其他的依赖,并设置 JDK 1.8。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第3张图片

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第4张图片

然后点击应用关闭。

打包工件

首先打到工件选项,点击加号,然后依次点击 JAR,空,名称和输出目录自定义,然后将可用元素中的 模块编译输出 加过来即可,打包后的文件中的 Start.class 文件可以删除。

编辑启动配置

点击右上角的当前文件编辑配置,添加应用程序,名称随意,这里以 RunClient 为例,将工作目录改为 <mcp>/jars,主类设置为 Start,然后添加 VM 参数 -Djava.library.path=<mcp>/jars/versions/1.8.8/1.8.8-natives,然后点击应用保存退出。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第5张图片


最后运行配置即可。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第6张图片

修改游戏窗口标题和图标及简易功能实现

修改游戏窗口标题及图标

首先打开 minecraft/me/wavelength/baseclient/BaseClient.java 文件,然后修改 clientName,clientVersion,author 以及 defaultUsername 变量的默认值,然后修改 initialize 函数中的 icon16x16 和 icon64x64 变量以修改图标,图标应为 Base64 编码,然后启动游戏即可看到效果。

//String icon16x16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAACH1BMVEUcL0wcL0wcL0wcL0weME0dME0cL0wcL0wcL0wcL0wcL0wcL0wbL0wTJ0UUKEYdME0eME0aLUscL0wcL0wcL0wbLksfMU5CUmo/T2gZLUoXKkgkNlIbLkscL0wdME0XK0g3SGJfbIFkcYVkcYRea4A7TGUXK0gdME0dME0XK0g3R2Fda4BjcIRmc4Zhb4M7SmMXK0gdME0cL0wdME0dME0dME0bL0wmQlsaLUobLktFVGxKWHAjP1kcL0wdME0dME0dME0cL0waLksVKUcYK0kaLUoZLEkZOFIbOFIcOVMPLUgOLUgZN1EaLUoZLEkYK0kVKUcbLksoOlZjcIQ0RV8iNVEoOlYjNVEnOlUfM09RYHZRYHZDUmolN1MoOlYsPVg9TWYiNVEzRF6Fj59xfY9/ipp0gJJ8h5d/ipo/T2dUYnhKWnF3gpSFj599iJhxfY93gpQkNlIoOlVTYXdIV25XZXpKWXBPXXRLWHEfMU9MWnJFU21CUWpOXXRFVWw2R2BFVWwkNlIaLUsVKUcVKUYUKEYWKUcUKkUVMUUaM0oVLkYVMEUVK0YVKEYXKkgYK0kWKkcbLkwcL0weMU0eME0eMU0eL00dNUwbQUgaPEgbP0kbQUgdNEweME0dME0dME0cL0wcL0wcL0wcLkwcLE0cLU0cLU0cLU0cLkwcL0wcL0wcL0wcL0wcL0wcMEwcL0wcL0wcMEwcL0wcL0z///9JKFXpAAAAAWJLR0S0RAlq3QAAAAd0SU1FB+QDEAAECDwPk00AAADdSURBVBjTY2AgBjAyMbOwsrFzcDJCBbi4eXj5+AUEhYShAiKiYuISklLSMrJQATl5BUUlZRVVNXWICQwamlraOrp6+gaGIL6RsYmpmbmFpZW1ja2dvYMjg5Ozi6ubu4enl7ePr59/QCBDUHBIaFh4RGRUdExsXHxCIkNSckpqWnpGZlZ2Tm5efkEhQ1FxSWlZeUVlVXVNbV19QyNDU3NLa1t7R2dXd09vX/+EiQyTJk+ZOm36jJmzZs+ZO2++8QKQzQsXLV6ydNnyFStXQV26es3ades3bNy0ajOQAwAsgT/ObWFqTwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wMy0xNlQwMDowNDowOC0wNzowMAp3d0UAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDMtMTZUMDA6MDQ6MDgtMDc6MDB7Ks/5AAAAAElFTkSuQmCC";
//String icon32x32 = "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";

String icon16x16 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB4ElEQVR4nLWSTWgTURSFz33vzYylTSamhBJKiMRW7V8UQenOhfiz6aKCglJwJSitCzdS1IUL8QeELgUR3OtCXRQp3WmxEEUpoWNra6Jiq3aMgTRpptM3b1ybnyYbz/Jy78c9hwP8L+nCPBUODLwMB5NT2+1RrVl3ZNhNxkdZS2AXpCDMZe7j4+cHAoDfDEA7dzjlaEYIkhN8Q0AJYD77EGnrDq9cZpXAod4nzszyNRS3fiBjP4NPnCli6Np9oaaFSoBoDw6guLkK3diJ2fmrcORv9XQyoUjTmwJInwiaaEOuZKEzchQfFm8j2X+DKcZxcnjBawQAuAIjAy16FGHzAIobWQSCCdj2K3hCNPwAEkCs4xjKno1CeQmtrV1YXH6M9NzNZiyQ+S5zD92xs/iVf4v+nnHk8ins2XcRSkkQr374n4lgO+5m154rnzQsfH3kEhNIxEdUe8cRmOGD+P7txfYAqcqXBntusdn0ZWVoprvyc3qjUFpS66UVueX+ca03V6p6UJmK73gFeWj/BFMCumRMxozz8Dgh3jcm11anG2UApKzrkVzRciSRUtwXPilVWP8kv6Qnqo7rKtS2145GT9jHh96XE71j+WCoL4fata+rM0Q0omnma860SSKcrgf4C0l8rDfoS31dAAAAAElFTkSuQmCC";
String icon32x32 = "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";

简易功能实现

删除PVP客户端不应该具有的功能

首先打开 minecraft/me/wavelength/baseclient/module/ModuleManager.java 中的 registerModules 函数然后注释掉以下代码:

  1. registerModule(new Fly());

  2. registerModule(new XRay());

  3. registerModule(new TestModule());

然后删除 minecraft/me/wavelength/baseclient/module/modules/movement/Fly.java , minecraft/me/wavelength/baseclient/module/modules/render/XRay.java ,

minecraft/me/wavelength/baseclient/command/commands/XRayCommand.java 这三个文件,同时在 minecraft/me/wavelength/baseclient/command/CommandManager.java 中取消注册 XRay 指令。

public void registerModules() {
   registerModule(new Friends());
   //registerModule(new Fly());
   //registerModule(new TestModule());
   //registerModule(new XRay());
   registerModule(new NameProtect());
   registerModule(new AdvancedTabGui());
   registerModule(new TabGui());
   registerModule(new ClickGui());
}
public void registerCommands() {
   registerCommand(new HelpCommand());
   registerCommand(new IRCCommand());
   registerCommand(new SetCommand());
   registerCommand(new BindCommand());
   registerCommand(new ColorCommand());
   registerCommand(new FriendsCommand(BaseClient.instance.getFriendsManager()));
   registerCommand(new NamesCommand());
   //registerCommand(new XRayCommand());
   registerCommand(new FontCommand());
   registerCommand(new ToggleCommand());
}

FullBright

在 render 目录中创建一个类并继承于 Module,然后让其在开启时记录当前 gamma 值,让其在关闭时恢复,然后在 onUpdate 函数中持续使 gamma 值变为 15 或更高的值以达到全亮的效果,然后在 ModuleManager 中注册模块:

package me.wavelength.baseclient.module.modules.render;

import me.wavelength.baseclient.event.events.UpdateEvent;
import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import net.minecraft.client.Minecraft;
import org.lwjgl.input.Keyboard;

public class FullBright extends Module {

    private float gamma = 0.0F;

    public FullBright() { //默认按键 V,分类为渲染
        super("FullBright", "It can make the gamma value up to 300.", Keyboard.KEY_V, Category.RENDER, true);
    }

    @Override
    public void onEnable() {
        this.gamma = Minecraft.getMinecraft().gameSettings.gammaSetting;
    }

    @Override
    public void onUpdate(UpdateEvent event) {
        Minecraft.getMinecraft().gameSettings.gammaSetting = 300F;
    }

    @Override
    public void onDisable() {
        Minecraft.getMinecraft().gameSettings.gammaSetting = this.gamma;
    }
}
//ModuleManager
registerModule(new FullBright());

AutoSprint

与 FullBright 同理:

package me.wavelength.baseclient.module.modules.movement;

import me.wavelength.baseclient.event.events.UpdateEvent;
import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import net.minecraft.client.Minecraft;
import org.lwjgl.input.Keyboard;

public class AutoSprint extends Module {

    private boolean sprint = false;

    public AutoSprint() {//无默认按键,分类为移动
        super("AutoSprint", "It can make you always sprint.",Keyboard.KEY_NONE, Category.MOVEMENT, true);
    }

    @Override
    public void onEnable() {
        this.sprint = Minecraft.getMinecraft().gameSettings.keyBindSprint.isPressed();
    }

    @Override
    public void onUpdate(UpdateEvent event) {
        Minecraft.getMinecraft().gameSettings.keyBindSprint.setPressed(true);
    }

    @Override
    public void onDisable() {
        Minecraft.getMinecraft().gameSettings.keyBindSprint.setPressed(this.sprint);
    }
}
registerModule(new AutoSprint());

Sneak

与 AutoSprint 同理:

package me.wavelength.baseclient.module.modules.movement;

import me.wavelength.baseclient.event.events.UpdateEvent;
import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import net.minecraft.client.Minecraft;
import org.lwjgl.input.Keyboard;

public class Sneak extends Module {

    private boolean sneak = false;

    public Sneak() {//默认按键Z,分类为移动
        super("Sneak", "It can make you always sneak.",Keyboard.KEY_Z, Category.MOVEMENT, true);
    }

    @Override
    public void onEnable() {
        this.sneak = Minecraft.getMinecraft().gameSettings.keyBindSneak.isPressed();
    }

    @Override
    public void onUpdate(UpdateEvent event) {
        Minecraft.getMinecraft().gameSettings.keyBindSneak.setPressed(true);
    }

    @Override
    public void onDisable() {
        Minecraft.getMinecraft().gameSettings.keyBindSneak.setPressed(this.sneak);
    }
}

NoFireOverlay

首先创建一个最基础的继承于 Module 的类,然后在 ItemRenderer 类的 renderFireInFirstPerson 函数中判断模块是否启用,然后返回:

package me.wavelength.baseclient.module.modules.render;

import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import org.lwjgl.input.Keyboard;

public class NoFireOverlay extends Module {

    public NoFireOverlay() {//无默认按键,分类为渲染类
        super("NoFireOverlay", "It can make the game not to render the fire overlay.", Keyboard.KEY_NONE, Category.RENDER, true);
    }
}
private void renderFireInFirstPerson(float p_78442_1_) {
   if(BaseClient.instance.getModuleManager().getModule(NoFireOverlay.class).isToggled()){
      return;
   }
   [...]
}
registerModule(new NoFireOverlay());

TimeChanger

首先创建一个最基础的继承于 Module 的类,然后在 WorldInfo 类的 getWorldTime 函数中判断模块是否启用,然后返回模块配置的时间,默认为1000:

package me.wavelength.baseclient.module.modules.world;

import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import org.lwjgl.input.Keyboard;

public class TimeChanger extends Module {

    public TimeChanger() {//无默认按键,分类为世界,默认配置 time 1000
        super("TimeChanger", "It can custom the time of the world.", Keyboard.KEY_NONE, Category.WORLD, true);
        this.moduleSettings.addDefault("time",1000);
    }
}
registerModule(new TimeChanger());
public long getWorldTime() {
   Module module = BaseClient.instance.getModuleManager().getModule(TimeChanger.class);
   if(module.isToggled()) return module.getModuleSettings().getInt("time");
   return this.worldTime;
}

NoHurtCam

首先创建一个最基础的继承于 Module 的类,然后在 EntityRenderer 类的 hurtCameraEffect 函数中判断模块是否启用,然后返回:

package me.wavelength.baseclient.module.modules.render;

import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import org.lwjgl.input.Keyboard;

public class NoHurtCam extends Module {

    public NoHurtCam() {//无默认按键,分类为渲染类
        super("NoHurtCam", "It can none the hurt camera.", Keyboard.KEY_NONE, Category.RENDER, true);
    }
}
private void hurtCameraEffect(float partialTicks) {
   if(BaseClient.instance.getModuleManager().getModule(NoHurtCam.class).isToggled()){
      return;
   }
   [...]
}
registerModule(new NoHurtCam());

NoUnderWaterOverlay

首先创建一个最基础的继承于 Module 的类,然后在 ItemRenderer 类的 renderWaterOverlayTexturet 函数中判断模块是否启用,然后返回:

package me.wavelength.baseclient.module.modules.render;

import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import org.lwjgl.input.Keyboard;

public class NoUnderWaterOverlay extends Module {

    public NoUnderWaterOverlay() {//无默认按键,分类为渲染类
        super("NoUnderOverlay", "It can make none the under water overlay.", Keyboard.KEY_NONE, Category.RENDER, true);
    }
}
private void renderWaterOverlayTexture(float p_78448_1_) {
   if(BaseClient.instance.getModuleManager().getModule(NoUnderWaterOverlay.class).isToggled()) return;
   [...]
}
registerModule(new NoUnderWaterOverlay());

AutoRespawn

首先创建一个继承于 Module 的类,在 onUpdate 事件中判断玩家是否死亡,若死亡则发送重生数据包:

package me.wavelength.baseclient.module.modules.combat;

import me.wavelength.baseclient.event.events.UpdateEvent;
import me.wavelength.baseclient.module.Category;
import me.wavelength.baseclient.module.Module;
import net.minecraft.client.Minecraft;
import net.minecraft.network.play.client.C16PacketClientStatus;
import org.lwjgl.input.Keyboard;

public class AutoRespawn extends Module {

    public AutoRespawn() {
        super("AutoRespawn", "It make you can auto respawn.", Keyboard.KEY_V, Category.COMBAT, true);
    }

    @Override
    public void onUpdate(UpdateEvent event) {
        if(Minecraft.getMinecraft().thePlayer!=null && !Minecraft.getMinecraft().thePlayer.isEntityAlive()){
            Minecraft.getMinecraft().getNetHandler().getNetworkManager().sendPacket(new C16PacketClientStatus(C16PacketClientStatus.EnumState.PERFORM_RESPAWN));
        }
    }
}
registerModule(new AutoRespawn());

UI美化

首先任意下载一个你喜欢的资源包,这里以 Lunar Private [32x] 资源包为例,将下载好的资源包中的 assets 目录 和 pack.png 文件(可选)覆盖到 <mcp>/src/resouces 目录中即可。

最后运行测试即可。

基于 Minecraft-Hack-BaseClient 的1.8.x PVP 简易客户端制作-第7张图片

最后提示:

  1. 请勿将通过此教程制作的客户端用于不允许使用这类客户端的服务器内使用,若使用,后果自负!

  2. 该教程中的内容并非 挂端 的制作教程,所以并不包含与挂端有关的内容(如 Fly,Blink,FreeCam ,X-Ray 等功能),仅仅是基于 Minecraft-Hack-BaseClient 项目进行制作,该教程内所展示的功能皆可在正常的服务器内使用,请审核注意。