feat: add docs package

Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
2020-03-04 02:04:02 +08:00
parent d608e2c066
commit 41d2edc719
19 changed files with 533 additions and 0 deletions

View File

@ -0,0 +1,8 @@
## 开发者部分
本教程默认开发者已掌握下列技能
- `Git` 代码版本控制工具
- `Java` 各种服务端开发语言
- `TypeScript` 类型化 `JavaScript`
- 熟悉需要开发的服务端的对应的 API

View File

@ -0,0 +1,26 @@
## 前提条件
本教程默认开发者已掌握下列技能
- `Git` 代码版本控制工具
- `Java` 各种服务端开发语言
- `TypeScript` 类型化 `JavaScript`
- 熟悉需要开发的服务端的对应的 API
## 开发 IDE
- VSCode
- Coding WebIDE
## 开发环境准备
- 安装 `NodeJS``Yarn`
- 拉取代码
- `git clone https://github.com/circlecloud/ms.git`
- 进入目录 `ms`
- 安装依赖包
- `yarn`
- 建立内部依赖链接
- `yarn bs`
- 编译一次生成对应的类库
- `yarn build`

View File

@ -0,0 +1,36 @@
### 项目结构
```txt
└─packages
├─api 全平台兼容的接口
├─core 核心代码 用于引导加载
├─common 公共类库代码 例如 http reflect 模块
├─client NodeJS 的 Minecraft 客户端 用于调试插件
├─container IOC容器 用于注入具体实现
├─docs Gitbook 文档源代码
├─ployfill Nashorn 的一些自定义增强
├─nashorn Nashorn 的类型定义
├─bungee BungeeCord API内部实现
├─bukkit Bukkit API内部实现
├─sponge Sponge API内部实现
├─nukkit Nukkit API内部实现
├─plugin 插件管理器
├─websocket Netty的WebSocket注入
├─type Java的类型定义
| ├─bungee BungeeCord 类型定义
| ├─bukkit Bukkit 类型定义
| ├─sponge Sponge 类型定义
| └─nukkit Nukkit 类型定义
└─plugins 这里当然是插件啦
├─bungee 只兼容 BungeeCord 的插件
├─bukkit 只兼容 Bukkit 的插件
├─sponge 只兼容 Sponge 的插件
└─nukkit 只兼容 Nukkit 的插件
```
代码仓库
- Github: https://github.com/circlecloud/ms
- Coding: https://502647092.coding.net/p/ms/d/ms/git
- YUMC: https://git.yumc.pw/circlecloud/ms

View File

@ -0,0 +1,129 @@
## 基本插件框架
### HelloWorld 示例插件
先来一个 `HelloWorld.ts` 插件示范!
```ts
/// <reference types="@ms/types" />
import { server } from '@ms/api';
import { inject } from '@ms/container';
import { plugin, interfaces, cmd, listener, tab } from '@ms/plugin'
@plugin({ name: 'HelloWorld', version: '1.0.0', author: 'MiaoWoo', source: __filename })
export class HelloWorld extends interfaces.Plugin {
@inject(server.Server)
private Server: server.Server
@config()
private config = {
version: 1.0.0
}
load() {
this.logger.log('Plugin load from MiaoScript Plugin System...');
}
enable() {
this.logger.log('Plugin enable from MiaoScript Plugin System...');
}
disable() {
this.logger.log('Plugin disable from MiaoScript Plugin System...');
}
bukkitload() {
this.logger.log('Load When ServerType is Bukkit!')
}
bukkitenable() {
this.logger.log('Enable When ServerType is Bukkit!')
}
bukkitdisable() {
this.logger.log('Disable When ServerType is Bukkit!')
}
spongeload() {
this.logger.log('Load When ServerType is Sponge!')
}
spongeenable() {
this.logger.log('Enable When ServerType is Sponge!')
}
spongedisable() {
this.logger.log('Disable When ServerType is Sponge!')
}
bungeeload() {
this.logger.log('Load When ServerType is BungeeCord!')
}
bungeeenable() {
this.logger.log('Enable When ServerType is BungeeCord!')
}
bungeedisable() {
this.logger.log('Disable When ServerType is BungeeCord!')
}
nukkitload() {
this.logger.log('Load When ServerType is Nukkit!')
}
nukkitenable() {
this.logger.log('Enable When ServerType is Nukkit!')
}
nukkitdisable() {
this.logger.log('Disable When ServerType is Nukkit!')
}
@cmd()
hello(sender: any, command: string, args: string[]) {
this.logger.log(sender, command, args);
sender.sendMessage(JSON.stringify({ command, ...args }))
}
@tab()
tabhello(_sender: any, _command: string, _args: string[]) {
return ['world']
}
// bukkit nukkit 大部分API神似 可以直接用
@listener({ servers: ['bukkit', 'nukkit'] })
PlayerJoin(event: org.bukkit.event.player.PlayerJoinEvent) {
let plyaer = event.getPlayer();
this.logger.console(`§cBukkit §aPlayerJoinEvent: §b${plyaer.getName()}`)
setTimeout(() => this.sendWelcome(plyaer), 10);
}
@listener({ servers: ['sponge'] })
ClientConnectionEvent$Join(event: org.spongepowered.api.event.network.ClientConnectionEvent.Join) {
this.logger.console(`§cSponge §aClientConnectionEvent.Join: §b${event.getTargetEntity().getName()}`)
setTimeout(() => this.sendWelcome(event.getTargetEntity()), 10);
}
private sendWelcome(player: any) {
this.logger.sender(player, `§a欢迎来到 §bMiaoScript §a的世界!`)
this.logger.sender(player, `§6当前版本: §c${this.Server.getVersion()}`)
}
@listener({ servers: ['bungee'] })
ServerConnected(e: any) {
let event = e as net.md_5.bungee.api.event.ServerConnectedEvent
this.logger.console(`§cBungeeCord §aServerConnectedEvent: §b${event.getPlayer().getDisplayName()}`)
setTimeout(() => this.logger.sender(event.getPlayer(), `§a欢迎来到 §bMiaoScript §a的世界 §6来自 §cBungeeCord §6的问候!`), 10);
}
}
```
- 进入 `ms` 目录
- 执行编译 `yarn build:plugins`
-`packages/plugins/dist` 中复制 `HelloWorld.js``HelloWorld.js.map`(可选 用于显示插件原有行数) 文件 到对应的插件目录
- Bungee: plugins/MiaoScript/plugins/
- Bukkit: plugins/MiaoScript/plugins/
- Sponge: config/miaoscript/plugins/
- Nukkit: plugins/MiaoScript/plugins/
- 重载 `MiaoScript`
- 打开客户端进入游戏 预览一下效果
- 从 Spigot 服务端进入
![image.png](https://i.loli.net/2019/09/22/2BZuwF65WV1xGnv.png)
![image.png](https://i.loli.net/2019/09/22/m2CftwbalnXsxvg.png)
- 从 Sponge 服务端进入
![image.png](https://i.loli.net/2019/09/22/QD1jrShtJpPXyVl.png)
![image.png](https://i.loli.net/2019/09/22/GzLFVC3sjAJ4obm.png)
- 从 Nukkit 服务端进入
![image.png](https://i.loli.net/2020/03/03/Xvr7SZJ5YdICgko.png)
![image.png](https://i.loli.net/2020/03/03/Q28AW9b7pIVL1j6.png)

View File

@ -0,0 +1,26 @@
## 插件生命周期
MiaoScript 的生命周期遵循了 Bukkit 的生命周期
![MiaoScript 生命周期](https://www.plantuml.com/plantuml/svg/0/VL7BJi9G5DptA-uVi8TD5xhJbLzGe98cfP2sk3QcLH2aO7W542H2g0e5GuG4ql8pFRUtVs6X3I0-Dht9d9apCwUq93EYd4dow9nZKXSnaKlBoAbqeMn2MSVjBaLj6HGLnhbth6aepMSId20XifY0fKIeC5XlJd42zy_4DB7sQA_cH6dYzYYoaz2-1k6PJeOl6xoZm6hfay7es5P-ioVRnxKnabZnYXKb1DeDhauHAIx0geCM63XDnPSTR8-bX4ik4MpVFA0ENFN1CGsShTdh9nWtt5M367qVt2g7f5T0PoacZjp671kVUn3dNk6Z-cCMM2NZ8LfceeTcjmNlMFQg7oAz0QZw0Pld99aLMF4xsrxclVnEgmobqTxsL62YFFjNckCfMRUyacHTyZX78AWpjpxUWNv_v5U7x3GuJEqkkE5CTolNAFWLsnvxzFUa9vpqNzJZCSKASOgYlMyc-GK0 "MiaoScript 生命周期")
### load 加载阶段
此阶段通常用于初始化基础配置 数据库链接等
某些对外提供功能的插件 需要在此阶段初始化完成
### enable 启动阶段
此阶段通常用于注册命令 注册事件等
由于命令和事件 MiaoScript 已经托管了 所以开发者可以直接用注解实现
### disable 关闭阶段
此阶段通常用于注销命令 注销事件等
由于命令和事件 MiaoScript 已经托管了 所以开发者可以直接用注解实现
### 扩展的生命周期
MiaoScript 针对不同的服务端 提供了扩展的周期
以服务端类型开头阶段名结束 例如 `bukkitload` `spongeenbale` `bungeedisable`
扩展的生命周期只会在特定的服务器执行

View File

@ -0,0 +1,3 @@
## @plugin 注解
TODO

View File

@ -0,0 +1,3 @@
## @cmd/@tab 注解
TODO

View File

@ -0,0 +1,3 @@
## @listener 注解
TODO

View File

@ -0,0 +1,3 @@
## @config 注解
TODO

View File

@ -0,0 +1,27 @@
@startuml MiaoScript 生命周期
start
:扫描 plugins 路径;
:循环加载插件脚本;
:扫描 @plugin 注解;
:构建插件实例;
:判断 servers 参数 获得可加载的插件;
:扫描 @config 注解 注入配置或保存默认配置;
:执行 Load 阶段;
:执行 扩展 Load 阶段;
:扫描 @cmd/@tab 注解 注册命令/补全;
:扫描 @listener 注解 注册事件监听;
:执行 Enable 阶段;
:执行 扩展 Enable 阶段;
:进入运行阶段;
:进入关闭阶段;
:保存 配置到配置文件;
:注销 插件命令;
:注销 事件监听;
:执行 Disable 阶段;
:执行 扩展 Disable 阶段;
end
@endum