前言
其实说句实在话,我必须承认的一点是,一开始加入网安协会,我颇有点“动机不纯”的意味在。在加入之前,我一直笃信自己的最大目标是制作一款属于自己的独立游戏。但随着阅历渐长,发现自己的美工、建模、代码能力都技不如人,加上各类竞赛、社团的时长愈发占据我生活的一大比重,乃至于在网安协会里愈发感受到了当代游戏公司对于软件安全方面的无力,我终于还是放下了这种想法,回来踏踏实实学技术。
所以,尝试mc模组开发,在某种意义上也算是我的一种不忘初心了?
要开发一个好模组,你就必须知己知彼。不但要提升自己的写代码能力,还要去了解自己的开发语言、开发平台等,其实和做一个项目也没什么两样,本质上,写mc mod和写各式插件一样,都是一个痛苦的屎叠屎的过程。
首先从所需要用到的语言说起
Java
Java是一门面向对象编程语言,摒弃了C++里难以理解的多继承、指针等概念。其优势就是突出一个莫得指针的干净整洁,以及强大的可移植性和更高的编译效率,但代价就是面向对象所导致的,在开发项目的过程中所需要的强大抽象思维,以及在构建过程中更高的产生屎山的概率(说的就是你麻将)
java为了其可移植性,特意设计了一套专为自身打造的虚拟机jvm和中间字节码系统。对于没有java运行的硬件条件的设备也非常友好,当然,过于明显的特征使得java代码本身对于逆向手也十分友好,你甚至可以直接用JDK内置的Javap解决问题……在没有混淆的前提下。
json
准确地从定义上来讲,json并不是一个编程语言,它在维基的定义上是一种轻量级资料交换格式,相比于编程语言,更像是一种被统一格式化的参数集合,以便被各类编程语言更好利用。它语句简单,格式明晰,在开发时非常舒服,但也因为特征过于明显,结构过于简单,很容易成为逆向或攻击的突破口之一。
golang(???)
说句实在话,我知道golang泛用性高,没想到golang还能稳稳地插在mc这一坨屎山上,直到我看到了这个项目
正如之前所说,golang专为服务器,尤其是游戏服务器设计,并且简单高效,如果对mc服务器有兴趣的可以尝试一波,本文目前由于主要针对离线模组开发,不多赘述。
然后,是我们构建模组所需的加载和兼容插件
其实现存的模组开发插件,基本都是基于一种“注入字节码”的思路去的。以经典的forge为例,它大概是这样往游戏本体添加mod数据的:
要知道minecraft是基于java的,java的类加载器一旦加载了一个类到java虚拟机中,这个类就不可能被外部修改了,但是加载之前的类的字节码可不是这样被严格的保护的,那些字节码处于一种谁想强X就强X的程度。forge本身通过修改启动器的json(1.6以后是这样,而1.6之前是直接修改jar文件)而优先于minecraft加载,并且forge会在minecraft加载的时候调教那些正要被加载的字节码。
——摘自MANAGERYZY的博客
听起来很像鲍师傅在隔壁mrfz开科技经常干的事情。同样是囸字节码,同样是修改游戏数据,但是从细节上来讲还是有些差别,Arknights的hack是通过插件直接去修改游戏本身的字节码,而minecraft的modding是通过插件先将forge自己的一部分注入到游戏的字节码中,再通过forge将符合条件的mod类导入游戏的jvm中,是额外添加本体不具有的数据。
而实现这一切的forge则是一系列工具链整合成的结果,从负责java源代码反编译、修复乃至于修复映射、注释的部分,再到Java项目的加载、运行。感兴趣可以查阅IzzelAliz的博客
由于网络上的资料复杂,关于forge本身的详细运作原理,我能寻得的有效资料哪怕是爬管子也及其有限,至于fabric的原理相关更是大海捞针,望各位dalao补充。
到此,我们粗略的了解了一下我们modding需要用到的工具。接下来的文章,我们将来讲讲modding的基础操作,以及我们如何编写一个至少能正常显示的mod。