MC 插件开发教程 —— 序言(一)
Hi!你好哇!我是 Xiaoyi311, 一个独立开发者!经过我的思考,决定开始制作 MC 插件开发教程,本次教程讲偏向 0 基础!所以如果你已经有过基础了,就不推荐看本教程啦,可能涉及 java 基础很多,如果有任何的意见,也欢迎在 QQ 私聊我啦!当然 github issues 也是可以的!
请注意!本教程将基于 Mac OS 系统制作,但由于 Java 跨平台,所以差异不会太大,我也会尽量给出 Windows 系统的操作方案啦!
序言
Minecraft,一个由 Mojang Studio (俗称 ojang) 制作的开放性沙盒游戏,作为开放性沙盒游戏,避免少不了扩展类的玩法,更何况是多人游戏呢?而插件便诞生了~
什么?你说插件很难?那么就让我来和你刷新你对插件的刻板印象吧!
插件。是什么?
如果想知道这个问题,就不得不说到多人游戏这个机制了。服务器怎么做到的让多个玩家一起游玩?其实是因为服务端(服务器)一直在与客户端(玩家)不断的通讯,就和打电话一样~ 而我们在电话里说的话,专业一点可以叫它 —— 数据包。
没错,相信你已经理解了,服务端正是通过数据包与客户端不断通讯,服务端好比一个邮局,客户端给服务器发信件(数据包),服务端在处理以后发给其他的客户端。
那问题回来了,插件是什么?他和数据包有什么关联吗?对于玩家们来说,插件就好比魔法一样:
玩家:我C,好神奇,为什么我不登录就动不了啊!魔法!一定是魔法!
嘻嘻,如果你这么想就不对啦,插件其实也是利用了原版的机制,要知道,客户端每进行一个会影响其他玩家或者影响服务器的操作时,都会向服务器发送数据包,服务器处理后发给别的客户端。这时候插件就来搞事了,他通过控制服务端来修改数据包的处理过程,给客户端一个不一样的处理结果,蒙了客户端一把,让客户端以为这就是正确的处理结果!
或者。。形象一点?服务器是邮局,客户端是收信和发信的人,客户端把信件发给服务端,插件 绑架了服务端/劫持了信件 把信件的 实际处理结果/内容 改了改,再发给客户端们,如果是你,你能发现吗?
这就是插件!
Paper? Spigot? Bukkit? Vanilla? 这都是什么哇!
Bukkit 的悲惨历史(
Bukkit,俗称水桶,可以说是 MC 插件服的祖先了!Vanilla 也称香草服,是由 Mojang 官方制作的服务端,不过。。人尽皆知。Mojang 的 Vanilla 可以说是离谱,纯原版,让你玩游戏都能玩睡着(
于是,救世主 Bukkit 降临了!那 Bukkit 到底干了什么?这里就要借用一个很形象的比喻:
把 Vanilla 想象成一个盒子,你根本不知道他到底干了啥
Bukkit 就好比在盒子上砸出来个洞,允许开发者们把自己的东西塞进去,这便是最初的插件!
谁不想去给自己喜欢的游戏添加玩法呢?于是 Bukkit 项目一发布便瞬间火了起来,众多开发者投身开发,一个全新的插件生态建立了起来!
Bukkit 是最早的插件服务端,反编译了 Vanilla 的源码并修改,把修改后的代码打包直接发布,并提供了一系列 API —— Bukkit API, 便于开发者制作插件,但是。。Bukkit 却犯了个致命的错误。。直接导致了 Bukkit 项目结束。。
Mojang: 诶我操,不对啊,这家伙怎么拿着我的东西在那改,还发布呢?
于是 Mojang 蓄力放了个大招,EULA(最终用户条款)+ DMCA(数字千年版权法案)把 Bukkit 送上了法庭。。
Bukkit 使用了 Mojang 的代码,Mojang 生气了,于是 Bukkit 就此停止。。(了吗?
Spigot 的诞生!
你想啊,开发者们好不容易写的插件,诶~ 突然不能用,谁想想不来气,但是版权归版权,这地位是不可撼动的,怎么办呢。。有了!既然 Mojang 不让我把打洞的盒子给你,那我就教你打洞嘛,你自己打,关我什么事~ 于是 Bukkit 开发组制作了一个不包含 Vanilla 源码的部署工具(打洞工具),他会在你的电脑上给 Vanilla 打洞,添加东西,直接完美脱离责任~ 但是捏,毕竟再叫 Bukkit 也不太好了,那就改名叫。。 Spigot 吧!
没错,Spigot 诞生了!
Spigot 便是在原先 Bukkit API 的基础上,又打了几个洞,也就是 Spigot API,便于开发者使用~
Paper 呢?
这个就不用多说了,他也就是觉得 Spigot 给的 API 还不够用,又打了几个洞罢了(
Bukkit API!共同的约定!
让我们把时光倒流,回到 Bukkit API 诞生的这一天!因为他是第一个 MC 插件服 API,开发者们制定了共同的约定,将 Bukkit API 作为所有 MC 插件服 API 的基本标准!正是因为这个标准的诞生,我们所制作的插件才能在不同的服务端之间运行,而不是每换一个服务端就要重写插件!
一起来说:”谢谢 Bukkit!!!”