Minestom 入门指南:轻量级 Minecraft 服务器框架的崛起
本帖最后由 clok 于 2025-2-7 15:50 编辑## 第0章 序言——什么是Minestom?Minestom究竟可以做出什么?
阅读前你需要知道的:
- 文章前两章由AI编写(它们的语言表达能力比我强太多),我只是微修了它们的代码错误和对ms理解的错误
- 文章通篇代码展示多使用kotlin/scala/java,你需要有其中一门语言的基础
- Minestom的群聊:
- Minestom中国 QQ群聊:995070869
- Minestom国际 Discord:(https://discord.gg/pTTuttCK)
---
### **Minestom:轻量级新秀 vs NMS:经典老将**
先说结论——**没有绝对的好坏,只有不同的场景适配!** 就像你不能用水果刀砍树,也别指望电锯削苹果皮对吧?
---
#### **NMS(Net Minecraft Server)的江湖地位**
- **原厂血统,生态无敌**
人家毕竟是Mojang亲儿子代码改出来的,所有原版特性默认完美支持!装个PaperMC再搭配百来个插件,分分钟搭建一个千人服,生态成熟度目前Minestom确实还追不上
- **省心省力,开箱即用**
搞服务器又不是人人都想当码农!NMS系服务端对服主超级友好(Spigot Paper等):下个核心jar,拖几个插件进文件夹,改两行配置就能开服——这种傻瓜式操作,Minestom现阶段确实比不了
- **社区资源海量**
遇到问题?百度一搜全是教程;想要功能?SpigotMC插件站几万插件任选,新人入门选NMS系,绝对少走弯路!
---
#### **Minestom的突围姿势**
但!如果你属于以下两类人,请立刻关注Minestom:
1. **“我要造火箭,不想修自行车”的极客**
想实现“全自定义物理引擎”、“动态生成银河系星球”?NMS的代码架构会让你崩溃——就像试图在毛坯房里搞精装修,还得先拆承重墙!而Minestom给你一块空地,钢筋水泥自己搭,从地基开始设计自由度拉满。
2. **“性能焦虑症”晚期患者**
虽然PaperMC优化很强,但原版逻辑的包袱还在——比如实体AI计算、红石机制这些吃性能的大户。Minestom允许你**彻底阉割不需要的功能**,甚至重写底层算法。实测相同硬件下,Minestom的玩家容量上限能高出200%!
---
#### **举个栗子🌰:自定义生物行为**
- **NMS方案**:
1. 继承EntityZombie类,重写nms代码
2. 用反射hook原版方法(小心版本更新当场暴毙给你看)
3. 依赖插件监听事件,可能和其他插件冲突
- **Minestom方案**:
```kotlin
//这代码就是自定义一个Zombie实体,然后给它以一个四周看的AI行为,什么是AI以后的章节会讲
class ZombieEntity: EntityCreature(EntityType.ZOMBIE) {
init {
val aiGroup = EntityAIGroupBuilder()
.addGoalSelector(RandomLookAroundGoal(this, 20))
.build()
addAIGroup(aiGroup)
}
}
```
**优势**:不用和原版类打架,代码干净的就像初恋一样
---
#### **客观地吐槽时间**
- **NMS系插件的痛点**:
- 版本更新如渡劫,尤其Mojang大改协议时(比如1.13的扁平化),社区适配周期长到哭
- 想删减原版功能?比如禁用末影龙?难!总有隐藏代码依赖它
- 插件互相覆盖逻辑——装10个插件后,玩家攻击力可能变成玄学
- **Minestom的短板**:
- 目前生态还在发育,想搞经济系统?得自己造轮子或找小众模块
- 不适合“换皮服”——如果你只是改改配置,不如用NMS+插件省事
- 学习曲线陡峭,没Java基础的小白容易从入门到放弃
---
### **怎么选?灵魂三问**
1. **你的需求有多变态?**
- 普通玩法魔改 → NMS+插件
- 代码级魔改(比如把水变成岩浆)→ Minestom
2. **你的团队有几个人?**
- 单人游击队 → 优先NMS生态
- 有技术宅护体 → Minestom走起
3. **你要多快上线?**
- 明天就要开服 → NMS别犹豫
- 为爱发电长期项目 → Minestom未来可期
---
### **最后我想说**
其实NMS和Minestom完全**可以共存**!见过有大佬用Minestom做游戏大厅,NMS子服务器跑生存——就像用瑞士军刀(Minestom)切水果,用电饭煲(NMS)煮饭,谁也别嫌弃谁
所以啊,别站队撕逼啦!不如关注Minestom的Discord频道,围观他们怎么用代码造奇观——最近有人在复刻《原神》的提瓦特大陆,还有狠人把Minecraft改成第一人称RTS… 不得不说,这届开发者是真的牛
---
### **第一章:启动服务器!从零开始拿捏Minestom的核心管理器**
---
#### **第一步:安装Minestom —— 别被Maven吓到,其实超简单!**
先甩开那些复杂的配置!咱们直接用**Maven**(或者Gradle)引入依赖
我们这里使用的是**9803f2bfe3**编号的版本
对应的**Minecraft**客户端版本为**1.21.3**
最新版已经支持到了**1.21.5**
**Maven:**
```xml
<!-- pom.xml里加这个依赖 -->
<dependencies>
<dependency>
<groupId>net.minestom</groupId>
<artifactId>minestom-snapshots</artifactId>
<version>9803f2bfe3</version>
</dependency>
</dependencies>
```
**Gradle(Groovy):**
```groovy
dependencies {
implementation 'net.minestom:minestom-snapshots:9803f2bfe3'
}
```
**Gradle(Kotlin):**
```kotlin
dependencies {
implementation("net.minestom:minestom-snapshots:9803f2bfe3")
}
```
什么?你还在用记事本写代码?快去装个**IntelliJ IDEA**!社区版免费够用,代码补全能救你的命
---
#### **第二步:启动!你的第一个“空气服务器”**
新建个类,比如叫`BBSServer`,然后疯狂输出以下代码:
```kotlin
import net.minestom.server.MinecraftServer
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent
fun main() {
// 这行代码是灵魂!初始化服务器内核
val server = MinecraftServer.init()
// 搞个游戏世界(虽然现在还是虚空...)
val instance = MinecraftServer.getInstanceManager().createInstanceContainer()
// 玩家进服时丢到这个世界里
val globalEvent = MinecraftServer.getGlobalEventHandler()
/*
Minestom的关于玩家登录事件有很多例如AsyncPlayerPreLoginEvent(玩家资料初始化)-> AsyncPlayerConfigurationEvent(玩家初始化)-> PlayerSpawnEvent(玩家初始化完成)
这三个事件的作用都很重要,我后期会给你们讲
*/
globalEvent.addListener(AsyncPlayerConfigurationEvent::class.java) { event ->
event.spawningInstance = instance
}
// 暴风启动!端口自己改,别和别的服冲突
server.start("0.0.0.0", 25566)
}
```
**运行它!** 控制台会刷刷刷日志,这时候打开MC客户端,直连`127.0.0.1:25565`——恭喜!虽然你会掉进虚空(因为我们还没生成地形),但至少证明服务器活啦!
---
#### **第三步:认识三大Manager —— 掌控服务器的“三神器”**
Minestom把功能拆成了多个**管理器(Manager)**,咱们先盘最核心的三个:
1. **InstanceManager —— 你的世界创造器**
```Kotlin
MinecraftServer.getInstanceManager().createInstanceContainer(DimensionType.OVERWORLD)
```
**关键能力**:
- 多世界并行加载
- 动态生成/卸载区块
- 绑定自定义生成器(以后细说,本人认为这是整个核心最难的部分,数学要求极高)
2. **CommandManager —— 化身权限狗的神杖**
不想当OP的服主不是好码农!直接代码注册命令:
```kotlin
val command = MinecraftServer.getCommandManager()
command.register(
object : Command("fly") {
init {
condition = CommandCondition { commandSender, _ ->
commandSender is Player
}
addSyntax({sender, ctx ->
val player = sender as Player
player.isAllowFlying = true
player.sendMessage("芜湖!起飞模式已激活~");
})
}
}
)
```
玩家输入`/fly`直接获得飞行能力!不用装权限插件,不用改配置文件,代码即权力!
3. **EventManager —— 监听一切的上帝之耳**
想要玩家挖矿时触发事件?点这里!
```java
// 监听方块破坏事件
val event = MinecraftServer.getGlobalEventHandler()
event.addListener(PlayerBlockBreakEvent::class.java) {
val player = it.player
val block = it.block
if (block == Block.GRASS_BLOCK) {
it.isCancelled = true
player.sendMessage("❌ 草坪保护协会警告你!");
}
}
```
**事件类型多到离谱**:玩家移动、实体受伤、甚至数据包收发都能监听!
---
#### **第四步:配置你的服务器 —— 比原版舒服100倍!**
Minestom的配置藏在`MinecraftServer`里,随时可以调参:
```kotlin
MinecraftServer.setCompressionThreshold(256)
MinecraftServer.setBrandName("✨ 魔法世界 ✨")
```
---
#### **遇到坑了?经典问题自救指南**
- **玩家连不上?**
检查端口是否被占用,防火墙是否放行,确认`start`方法用的是`0.0.0.0`而不是`localhost`
- **控制台报协议错误?**
大概率客户端版本不对应,Minestom默认用最新版MC协议,记得让玩家更新客户端
- **代码改了没生效?**
热重载?不存在!Minestom需要重启服务器才能应用代码变更
---
#### **本章小结:Manager就是你的超能力**
现在你已经掌握了:
✅ 用**InstanceManager**创造异世界
✅ 用**CommandManager**当权限主宰
✅ 用**EventManager**监听万物
下一章咱们要搞点大事情——用**监听一切的上帝之耳**做出强大的战斗系统!准备好让你的服务器脱离“虚无世界”了吗?(暗示评分催更)
**作业**:
1. 写个命令`/heal`,让玩家回满血
2. 监听玩家聊天,把“hello”自动替换成“你好呀~”
页:
[1]