修改partical数量限制

今天是大年初一。昨天晚上用replay这个mod在1.12.2的服务器里录制了一段烟花表演,但是烟花生成的粒子数量实在是过于庞大,以至于烟花刚爆炸,生成的粒子就因为达到了数量上限而小时,只剩下爆炸产生的黑色球状粒子,巨丑hhh

于是就需要解除mc的粒子数量限制。想要实现这个目标,有两种方法,一种是直接修改客户端,修改数量限制,另一种是使用mod重写原版的粒子系统。显而易见,第一种方法更合适。

反编译minecraft

关于mcp

Minecraft是闭源的,但是为了编写模组,有了人力反编译的项目,比如即将使用的mcp,很幸运他们更新到了1.12版本,正好就是服务器使用的。再后来mojang官方提供了对照表,也就不再需要那么麻烦了。不过应该注意传播修改过的客户端是违反mojang的用户协议的。

mcp的下载和使用

mcp相关信息的wiki

1.12.2修改过的mcp下载

至于使用方法,文件里面有docs文件夹,里面是文档。需要注意java版本,比如mc的1.12.2需要使用java8,最开始因为是17的环境所以失败。

修改partical数量限制代码

反编译完成后,客户端代码位于src\minecraft\net\minecraft\。需要修改的文件是此目录下的client\particle\ParticleManager.java。这段代码在第190行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (!this.queue.isEmpty())
{
for (Particle particle = this.queue.poll(); particle != null; particle = this.queue.poll())
{
int j = particle.getFXLayer();
int k = particle.shouldDisableDepth() ? 0 : 1;

if (this.fxLayers[j][k].size() >= 2147483647)
{
this.fxLayers[j][k].removeFirst();
}

this.fxLayers[j][k].add(particle);
}
}

这里我已经把上限值改为了2147483647,应该够了吧,乐,要是渲染这些粒子能有0.1Fps就不错了hhh

重新编译

创建项目目录

这里需要IntelliJ IDEA来编译。其实修改也可以在这里,只不过我要改的不多直接用vscode改完了。

首先新建项目:

新建

然后将mcp目录下的jars文件夹复制到新建的项目目录。

由于idea不会读取全部子目录内的库,所以使用搜索找出libraries内的全部.jar文件,剪切出来,项目目录新建一个lib文件夹,粘贴进去,然后libraries文件夹就可以删掉了。

项目路径新建一个资源目录resources,将原客户端包内的log4j.xml,pack.png以及assets目录复制进去。

最后,将mcp反编译得到的代码src\minecraft\内的文件复制到项目目录src文件夹即可。

编译配置

打开ideaProject Structure项目结构。

在子目录libraries,新建选择java然后选择刚才创建的lib目录。

再修改子目录Modules,选中刚才新建的resources,选择上面的Resources将其设置为资源目录。

确认上述修改后,继续修改启动项。

创建一个启动项,选择Application,将Main Class主类设置为Start

然后将工作目录Working directory设置为之前复制来的jars目录。

modify options中选择add VM options,在其中填写natives目录路径,在这里就是-Djava.library.path=versions\1.12.2\1.12.2-natives

此时按下Start按钮就可以看到mc客户端启动啦

客户端启动

打包客户端

打开Project Structure项目结构,选择Artifacts,新建选择Jar内的Empty,修改Output Directory导出路径,当然不改也可以。

然后将右侧的双击移到左侧:

双击或拖动

最后在build菜单中选择build Artifacts,选择buld,等待编译完成即可

此时就可以替换掉原来的客户端文件开始渲染啦!

输出成功