clok 发表于 2025-2-7 01:27:36

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]
查看完整版本: Minestom 入门指南:轻量级 Minecraft 服务器框架的崛起