2.6
This commit is contained in:
21
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/1-署名.md
Normal file
21
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/1-署名.md
Normal file
@@ -0,0 +1,21 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 1分钟
|
||||
---
|
||||
|
||||
# 署名
|
||||
|
||||
**署名信息**
|
||||
|
||||
本文作者: tdiant
|
||||
|
||||
Github个人账户: [https://github.com/tdiant](https://github.com/tdiant)
|
||||
|
||||
原文: [https://bdn.tdiant.net/#/](https://bdn.tdiant.net/#/)
|
||||
|
||||
**相关说明**
|
||||
|
||||
中国版对文章部分内容有所改动
|
||||
|
||||
本文主体内容以 Bukkit 1.12.2 为蓝本进行教学,如有高版本开发需求可以先了解基础框架再着手开发高版本服务器插件
|
||||
42
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/2-写在前面.md
Normal file
42
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/2-写在前面.md
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 3分钟
|
||||
---
|
||||
|
||||
# 写在前面
|
||||
|
||||
也许你已经有了雄心壮志, 准备开发一个Bukkit插件出来了! 但是等一下. 开发Bukkit插件**也需要一定的基础知识**!
|
||||
本文在编写时默认你已经具有了下面所罗列的能力:
|
||||
|
||||
**了解我的世界**
|
||||
|
||||
我们假定你已经对我的世界有充分了解.
|
||||
例如, 我们认为类似"哪些方块是玩家不能破坏的", "某个物品使用后是什么效果"这种问题是您早已明白的内容, 不会过分提及.
|
||||
|
||||
**Java基础**
|
||||
|
||||
Bukkit插件开发对Java语言能力要求并不高, 通常情况下插件开发只会用到最基础的Java语法知识(如面向对象基础等), 且开发环境搭建极其简单.
|
||||
但是不会Java的新手绝对不会开发插件, 绝对弄不明白如何开发插件.
|
||||
本教程不针对Java初学者或从未学习过Java的人. 在本教程中, 将会尽可能避免较为复杂的Java语法知识.
|
||||
|
||||
本教程认为会Java还应当具备一定的开发能力和使用相关工具等资源的能力, 例如JavaDoc如何使用, 你正在使用的IDE如何操作等问题, 本教程不会提及.
|
||||
|
||||
**编程的思维**
|
||||
|
||||
编程的思维在实际编写一个项目当中尤为关键.
|
||||
有Java基础并不够, 只知道语法, 不知道怎么写, 与不会Java没有什么区别.
|
||||
|
||||
在本教程中, 我们能做的只是告诉你“有什么”, 而无法解决你的插件“怎么写”的问题.
|
||||
例如, 我们告诉你“事件”, 但是如何利用“事件”真正的写出来一个“登录插件”、“商店插件”等各种插件出来, 这需要你自己思考!
|
||||
|
||||
希望你在实际开发中能够“脑洞大开”, 想出别人想不到的内容, 想出能打本文作者脸的好办法、新思路!
|
||||
|
||||
**不觉得尝试是件麻烦事**
|
||||
|
||||
光看教程而不去实际操作是无法学到真正的原理,正如常言道“好记性不如烂笔头”,学习Bukkit开发亦是如此.
|
||||
|
||||
**学会对自己编写的内容进行调试**
|
||||
|
||||
插件开发离不开调试.
|
||||
请你在提出问题之前、编写插件的过程中, 不要忘记不断调试, 这样你才能知道你的插件是否真的可以用, 别人说的不如自己试的, 自己想的不如实际干的.
|
||||
56
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/3-MC服务端介绍.md
Normal file
56
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/3-MC服务端介绍.md
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# MC的服务端介绍
|
||||
|
||||
如果你想开一个MC服务器, 你会发现有各式各样的服务端可以选择. 由于MC是一款社区驱动发展的游戏, 各种各样的玩家社区正在以非常快的速度开发以及维护各式各样的服务端.
|
||||
那么, 它们都是什么? 它们本质上是怎样的? 本节大致上以时间顺序进行叙述来讲述这个问题.
|
||||
|
||||
## 官服
|
||||
|
||||
最开始, 我的世界这款游戏只有Java版本, 在每个版本(不考虑远古版本)发布时, Mojang都会同时发布其对应的ServerJar文件.
|
||||
利用ServerJar文件可以开启一个MC服务器, 这种服务器俗称为官服.
|
||||
|
||||
官服启动后, 会在根目录下创建`server.properties`文件, 这是它的配置文件.
|
||||
|
||||
## Bukkit服务端
|
||||
|
||||
官服有显而易见的问题, 那就是没有“插件系统”.
|
||||
假设你有特殊需求, 就偏偏想让玩家没法把手里的钻石扔在地上, 正常情况下根本无法在官服实现这个功能.
|
||||
MC日渐完善的红石和命令方块功能根本无法满足社区玩家对服务器自定义的需求, 因而一种成熟的“插件系统”显得极为迫切.
|
||||
|
||||
Bukkit因此出现.
|
||||
|
||||
Bukkit服务端启动后会额外多创建一个配置文件`bukkit.yml`, 还有一个名为`plugins`的文件夹.
|
||||
Bukkit会自动的将`plugins`里的Jar通过Java中的ClassLoader特性加载进服务端中,从而使服主能够通过插件执行服务端能执行的内容.
|
||||
开发者可以利用Bukkit官方给出的API开发一款插件, 丰富并拓展玩法.
|
||||
|
||||
## Spigot服务端
|
||||
|
||||
SpigotMC社区发布了Spigot服务端. 最开始是对Bukkit服务端的各种优化和拓展.
|
||||
|
||||
后来由于Bukkit服务端直接使用了Mojang的代码, 由于法律原因, Bukkit被Mojang起诉并败诉, Bukkit服务端停止开发.
|
||||
虽然Bukkit停止开发, 但是社区内Bukkit的热度依然很高, Bukkit服务端插件数量极大. 后来SpigotMC社区渐渐地接管了Bukkit的开发工作, 这意味着SpigotMC社区接管了BukkitAPI的维护工作.
|
||||
|
||||
目前网上流传的Spigot服务端现成的Jar版本, 绝大多数都是基于BuildTool编译后的成品Jar文件. 实际上在SpigotMC社区官方网站上不提供这些成品Jar文件.
|
||||
|
||||
## 其他的各种服务端
|
||||
|
||||
后来又有许多服务端基于Spigot进行修改, 创造出了其他各种各样的服务端. 例如`Paper`服务端, 它是基于Spigot服务端的社区优化版本.
|
||||
如果你运行了一个Paper服务端服务器, 你会发现服务端目录下会有`bukkit.yml`、`spigot.yml`、`paper.yml`这三个配置文件, 足以看出这背后的故事.
|
||||
|
||||
最早时还有`MCPC+`服务端. 其开发者将Spigot与Forge整合在一起, 使服务器既可以装MOD又可以装插件. 后来`MCPC+`改为了`Cauldron`, 又衍生出了`KCauldron`, 但这三款服务端都停在了1.7.10版本不再更新.
|
||||
社区还出现了`CatServer`、`Uranium`、`Arclight`、`Mohist`等服务端, 它们可以也可以实现开出插件+MOD服的功能.
|
||||
|
||||
> 社区中部分服务端存在极大争议, 并因此发生过一些影响深远的故事.
|
||||
> 本教程功能仅为介绍, 如果没有纳入某些常用的服务端不能代表作者对这些服务端持有任何形式的不良想法, 服务端名称的排序没有先后, 不能认为某款服务端的名字排在前面即是作者对该款服务端存在某些偏向性指向或理解.
|
||||
|
||||
## 关于本教程
|
||||
|
||||
本教程正如其名, 是Bukkit插件开发教程.
|
||||
这意味着理论上应当支持Bukkit服务端、Spigot服务端和各种衍生服务端. Sponge服务端由于使用的API体系与Bukkit完全不一样, 本教程不考虑Sponge服务端.
|
||||
|
||||
BukkitAPI由于发展原因变动很多, 本教程尽可能提及. 这意味着本教程的内容肯定是不能支持全部版本的BukkitAPI版本. 但是问题不大, 变动虽然多但是不大, 思路一致, 如果你足够清晰BukkitAPI, 你应当可以在你需要开发的版本中找到你想要的API用法.
|
||||
41
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/4-信息检索.md
Normal file
41
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/4-信息检索.md
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# 检索需要的信息
|
||||
|
||||
在实际开发中你肯定需要检索需要的信息.
|
||||
笔者在各个QQ群里、论坛里最经常看到的问题莫过于一些新开发者问的诸如 "XXX应该监听那个事件?"、"怎么设置玩家昵称?"、"怎么设置方块的Material?" 的问题.
|
||||
实际上, 这些问题会被人视作"劣质问题". **因为这些问题的答案就是一查就能查到**. 说心里话, **有问问题的时间, 不如自己翻一下JavaDoc自己找到答案**.
|
||||
当然, 要是真的找不到答案, 还是应该问一下.
|
||||
|
||||
本教程不涉及JavaDoc的基础使用, 仅作为指向提醒作用.
|
||||
|
||||
## Bukkit各部分以包划类, 类名即表示其作用
|
||||
|
||||
> 假如你想问的是`玩家移动应该监听什么事件?`这个问题.
|
||||
|
||||
首先, 你想问的是监听什么事件, 请打开JavaDoc看一看BukkitAPI给出的所有的包.
|
||||
显然, 根据名称即可判断出你应当从`org.bukkit.event`包内寻找才对, 因为其他包跟"事件"这二字一点关系也没有.
|
||||
然后你会发现`org.bukkit.event`包还分为若干子包, 你同样可以按照名称判断出与玩家有关的事件应该都在`org.bukkit.event.player`包.
|
||||
|
||||
打开`org.bukkit.event.player`包, 你会发现与玩家有关的事件基本上都是按照`PlayerXxxxxEvent`的格式命名的. 仔细看一看便知道, `PlayerMoveEvent`事件的名称与我们想要的玩家移动这一功能即为一致, 它很有可能就是我们想要的.
|
||||
|
||||
打开它的详细介绍, 看看它的描述, 是
|
||||
|
||||

|
||||
|
||||
```
|
||||
Holds information for player movement events
|
||||
```
|
||||
|
||||
所以, 这就是我们需要的玩家移动事件了.
|
||||
|
||||
<br>
|
||||
|
||||
> 假如你想问的是`怎么获取玩家的飞行速度?`
|
||||
|
||||
这与玩家有关, 肯定要考虑获取玩家飞行速度的方法在`Player`类中. 我们打开`Player`类的详细介绍寻找答案.
|
||||
检索这一类的方法, 根据名称和方法描述, 可以得知我们想找的方法是`getFlySpeed`方法.
|
||||
34
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/5-服务端与客户端.md
Normal file
34
docs/mcguide/28-电脑网络游戏/课程3:编写Bukkit插件/1-基本概念/5-服务端与客户端.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# 服务端与客户端
|
||||
|
||||
## 永远不能相信客户端
|
||||
|
||||
有人说, 从游戏行业诞生的那一刻, 也是游戏反作弊诞生的那一刻.
|
||||
客户端给的数据不能轻易相信. 在开发插件时一定要注意, 如果你的插件要接收某个信息, 这个信息不是你自己指定的, 而是服主设置配置文件自己设定的或者是客户端发来的, 那你一定要仔细思考, 多加留意.
|
||||
|
||||
早前在GitHub上, 一个来自俄罗斯的账户发布了一个作弊MOD.
|
||||
这款作弊MOD的作者研究了各大主流MOD的协议包漏洞, 发现这些知名的MOD的协议包或多或少在接收到玩家客户端数据时, **对玩家客户端发来的数据的合理性判定极度缺失, 甚至是根本没有**.
|
||||
(不恰当的比方)玩家客户端说自己有一百万个钻石, 服务端真的就认为玩家客户端有一百万个钻石. 因此, 这款作弊MOD针对主流的大MOD的这些协议包问题, 有针对性的对每个MOD都开发了作弊方案.
|
||||
|
||||
可见开发者对客户端的警惕意识有多么重要.
|
||||
|
||||
我们要编写的是服务端插件.
|
||||
服务端插件根本上面向于这一服务器的玩家, 最直接的使用者是这一服务器的服主. 那么, 服主能不能正确配置配置文件? 玩家的数据信息真的正确吗?
|
||||
也许你说, 你写的又不是反作弊插件, 不可能做到处处提防玩家. 诚然如此, 但是警惕意识绝对不能丢.
|
||||
|
||||
**先虑忧患, 享于安乐.**
|
||||
|
||||
## 理清楚客户端和服务端的关系
|
||||
|
||||
如果你有经验你应该知道, 装上`Resdience`插件后, 创建一个领地, 关闭领地所有玩家的移动权限, 把一个玩家扔进去, 玩家在里面试图移动的话, 效果并不是完全动不了, 而是玩家仍然可以运动, 但是在一个间隔时间之后会被“弹回来”. 这是为什么?
|
||||
|
||||
为什么最终的效果不是"玩家一点都动不了"呢?
|
||||
|
||||
事实上, 我们无法在服务端取消玩家一点也不能移动. 客户端移动玩家时, 会在客户端显示出移动后的样子, 然后才会传递给服务器玩家移动的信号, 服务端收到客户端的信号后, 服务器才会做出响应.
|
||||
|
||||
也就是说, 客户端与服务端之间, **客户端往往都是"先斩后奏"的**. 客户端不管你服务端想干什么, 先那么显示出来再说. 因为毕竟玩家在服务器里完全动不了不是MC原版的设定之一.
|
||||
Reference in New Issue
Block a user