7月31日同步更新
@@ -0,0 +1,19 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# PlaceholderAPI介绍
|
||||
|
||||
PlaceholderAPI 是适用于 Bukkit 及其衍生服务端的插件,它允许服主以固定的格式替换占位符 (俗称变量) 显示各种对接了PlaceholderAPI插件的信息。
|
||||
|
||||
对于插件的变量支持,通常由插件自己提供,或者安装变量扩展来提供变量。变量扩展可以在游戏内通过 PAPI eCloud 下载安装。现有超过 230 个扩展可下载,可支持非常多的插件,比如 Essentials、Factions、LuckPerms、Vault 等。如果你是开发者,并且希望为你的插件添加 PlaceholderAPI 支持,请参阅 API 使用文档。
|
||||
|
||||
PlaceholderAPI 已破 170 万下载量,同时使用本插件的服务器数已超过 4.5 万,成为了各规模各类型服务器的必需品。
|
||||
|
||||
由于此篇文章偏向于如何通过接入PlaceholderAPI来开发自己插件的占位符
|
||||
|
||||
所以插件的使用方法还需要服主们自行查阅PlaceholderAPI的WIKI [**PlaceholderAPI WIKI**](https://wiki.placeholderapi.com/users/)
|
||||
|
||||
|
||||
@@ -0,0 +1,196 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 20分钟
|
||||
---
|
||||
|
||||
# 接入PlaceholderAPI
|
||||
|
||||
本篇教程针对 `PlaceholderAPI 2.10.0` 为蓝本进行教学,版本不一致时可作为参考,然后查阅相关开发API进行调整
|
||||
|
||||
## 引入库到本地项目
|
||||
|
||||
在你可以实际使用 `PlaceholderAPI` ,你首先需要将第三方库通过 Gradle 或者 Maven 导入到你的本地项目
|
||||
您可以使用下方仓库进行引入
|
||||
|
||||
### Maven
|
||||
|
||||
```xml
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>placeholderapi</id>
|
||||
<url>https://repo.extendedclip.com/releases/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>me.clip</groupId>
|
||||
<artifactId>placeholderapi</artifactId>
|
||||
<version>{version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
### Gradle
|
||||
```kotlin
|
||||
repositories {
|
||||
maven {
|
||||
url = 'https://repo.extendedclip.com/releases/'
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly 'me.clip:placeholderapi:{version}'
|
||||
}
|
||||
```
|
||||
|
||||
> 您可以通过查阅PlaceholderAPI发布页面,查阅需要引入的PlaceholderAPI版本
|
||||
> [PlaceholderAPI发行页](https://github.com/PlaceholderAPI/PlaceholderAPI/releases)
|
||||
|
||||
|
||||
## 在plugin.yml声明依赖
|
||||
|
||||
在编写插件前,你还需要在插件的`plugin.yml`中将`PlaceholderAPI` 设置为depend或者softdepend
|
||||
|
||||
具体填写格式可以查阅 Bukkit开发教程/深入plugin.yml
|
||||
|
||||
|
||||
## 解析变量
|
||||
|
||||
`PlaceholderAPI` 提供了自动解析插件内其他插件变量的能力,从而改变了开发路径。
|
||||
|
||||
以往开发者如果想要获取其他插件的一些变量,通常需要用到反射等特性才能获取到,兼容性无法得到保证,还比较麻烦。
|
||||
|
||||
但是如果想要获取的插件对接了 PlaceholderAPI 并有占位符显示的话,开发者可快速解析占位符获得内容。
|
||||
|
||||
若要在你的插件内使用来自其他插件的变量,使用 setPlaceholders 方法即可。
|
||||
|
||||
需要注意的是,任何需要插件或依赖的变量拓展必须在服务器上启用,否则变量不会被解析(返回原字符串)。
|
||||
|
||||
假设我们需要对一个玩家拥有的初级权限组发送一条自定义加入消息。
|
||||
|
||||
若要这么做,我们可以按如下步骤实现:
|
||||
|
||||
|
||||
```java
|
||||
package at.helpch.placeholderapi;
|
||||
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import me.clip.placeholderapi.PlaceholderAPI;
|
||||
|
||||
public class JoinExample extends JavaPlugin implements Listener {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
Bukkit.getPluginManager().registerEvents(this, this);
|
||||
} else {
|
||||
getLogger().warn("Invaild PlaceholderAPI! 插件已被禁用.");
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
String joinText = "%player_name% 加入了服务器! 他的级别是 %vault_rank%";
|
||||
|
||||
joinText = PlaceholderAPI.setPlaceholders(event.getPlayer(), joinText);
|
||||
event.setJoinMessage(joinText);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 创建一个新的变量
|
||||
|
||||
除了解析变量以外,开发者还可以利用到`PlaceholderAPI`创建自己插件的变量
|
||||
|
||||
你所创建的变量都是 PlaceholderExpansion 的子类,都属于拓展变量
|
||||
|
||||
新建一个类取名叫 `SomeExpansion.class`
|
||||
|
||||
按照下方格式即可创建一个新变量
|
||||
|
||||
```java
|
||||
package at.helpch.placeholderapi.example.expansion;
|
||||
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
|
||||
public class SomeExpansion extends PlaceholderExpansion {
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getAuthor() {
|
||||
return "Author"; //
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getIdentifier() {
|
||||
return "example"; //
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public String getVersion() {
|
||||
return "1.0.0"; //
|
||||
}
|
||||
|
||||
// 这些方法默认不覆写.
|
||||
// 你需要覆写其中一个.
|
||||
// onRequest 是允许离线玩家的变量
|
||||
|
||||
// onPlaceholderRequest 是允许在线玩家的变量
|
||||
|
||||
@Override
|
||||
public String onRequest(OfflinePlayer player, @NotNull String params) {
|
||||
if (params.equalsIgnoreCase("placeholder1")) {
|
||||
return "test";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onPlaceholderRequest(Player player, @NotNull String params) {
|
||||
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
### 注册变量拓展
|
||||
|
||||
创建好的变量还需要注册,否则插件无法识别你注册的变量
|
||||
|
||||
```java
|
||||
package at.helpch.placeholderapi.example;
|
||||
|
||||
import at.helpch.placeholderapi.example.expansion.SomeExpansion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class SomePlugin extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { // 检查 PlaceholderAPI 是否存在并启用,否则就会抛出报错。
|
||||
new SomeExpansion(this).register(); 注册变量。
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
现在你已经注册了一个变量了
|
||||
|
||||
当你存在需要填写变量的地方 写入 `%example_placeholder1%` 就会自动解析成 test 并显示出来
|
||||
|
||||
更多内容可以查阅官方维基百科[**PlaceholderAPI WIKI**](https://wiki.placeholderapi.com/users/)
|
||||
16
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/30-Vault/1-Vault介绍.md
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 5分钟
|
||||
---
|
||||
|
||||
# Vault介绍
|
||||
|
||||
`Vault` 插件是一个关于权限、聊天以及经济插件的前置插件,他能让这些插件快速地与 `Vault` 插件挂钩而不需要依赖于其他个别插件。
|
||||
多数关于注册和权限的前置插件配置过于繁琐且缺乏大部分功能,于是这个插件便诞生了。
|
||||
`Vault` 插件可以通过更加直观明了的方式解决这些问题,并为这些插件提供他们可能所需要的支持与依赖服务。
|
||||
|
||||
> Vault虽然能够通过API管控经济方面的特性,但是他本身不存在任何存储功能
|
||||
|
||||
[Vault的JavaDocs](https://milkbowl.github.io/VaultAPI/)
|
||||
|
||||
154
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/30-Vault/2-接入Vault.md
Normal file
@@ -0,0 +1,154 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
# 接入Vault
|
||||
|
||||
本篇教程针对 `Vault 1.7` 为蓝本进行教学,版本不一致时可作为参考,然后查阅相关开发API进行调整
|
||||
|
||||
## 引入库到本地项目
|
||||
|
||||
在你可以实际使用 `Vault` ,你首先需要将第三方库通过 Gradle 或者 Maven 导入到你的本地项目
|
||||
您可以使用下方仓库进行引入
|
||||
|
||||
### Maven
|
||||
|
||||
```xml
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.MilkBowl</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.7</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
### Gradle
|
||||
```kotlin
|
||||
repositories {
|
||||
maven {
|
||||
url 'https://jitpack.io'
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
compileOnly "com.github.MilkBowl:VaultAPI:1.7"
|
||||
}
|
||||
```
|
||||
|
||||
## 实现 Vault
|
||||
|
||||
通过一个简单的例子,从而快速了解如何获得 经济、权限、聊天 Service
|
||||
|
||||
```java
|
||||
package com.example.plugin;
|
||||
|
||||
import net.milkbowl.vault.chat.Chat;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class ExamplePlugin extends JavaPlugin {
|
||||
|
||||
private static Economy econ = null;
|
||||
private static Permission perms = null;
|
||||
private static Chat chat = null;
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
getLogger().info(String.format("[%s] Disabled Version %s", getDescription().getName(), getDescription().getVersion()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
if (!setupEconomy() ) {
|
||||
getLogger().severe(String.format("[%s] - Disabled due to no Vault dependency found!", getDescription().getName()));
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
return;
|
||||
}
|
||||
setupPermissions();
|
||||
setupChat();
|
||||
}
|
||||
|
||||
private boolean setupEconomy() {
|
||||
if (getServer().getPluginManager().getPlugin("Vault") == null) {
|
||||
return false;
|
||||
}
|
||||
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
|
||||
if (rsp == null) {
|
||||
return false;
|
||||
}
|
||||
econ = rsp.getProvider();
|
||||
return econ != null;
|
||||
}
|
||||
|
||||
private boolean setupChat() {
|
||||
RegisteredServiceProvider<Chat> rsp = getServer().getServicesManager().getRegistration(Chat.class);
|
||||
chat = rsp.getProvider();
|
||||
return chat != null;
|
||||
}
|
||||
|
||||
private boolean setupPermissions() {
|
||||
RegisteredServiceProvider<Permission> rsp = getServer().getServicesManager().getRegistration(Permission.class);
|
||||
perms = rsp.getProvider();
|
||||
return perms != null;
|
||||
}
|
||||
|
||||
public boolean onCommand(CommandSender sender, Command command, String commandLabel, String[] args) {
|
||||
if(!(sender instanceof Player)) {
|
||||
getLogger().info("Only players are supported for this Example Plugin, but you should not do this!!!");
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
|
||||
if(command.getLabel().equals("test-economy")) {
|
||||
// Lets give the player 1.05 currency (note that SOME economic plugins require rounding!)
|
||||
sender.sendMessage(String.format("You have %s", econ.format(econ.getBalance(player.getName()))));
|
||||
EconomyResponse r = econ.depositPlayer(player, 1.05);
|
||||
if(r.transactionSuccess()) {
|
||||
sender.sendMessage(String.format("You were given %s and now have %s", econ.format(r.amount), econ.format(r.balance)));
|
||||
} else {
|
||||
sender.sendMessage(String.format("An error occured: %s", r.errorMessage));
|
||||
}
|
||||
return true;
|
||||
} else if(command.getLabel().equals("test-permission")) {
|
||||
// Lets test if user has the node "example.plugin.awesome" to determine if they are awesome or just suck
|
||||
if(perms.has(player, "example.plugin.awesome")) {
|
||||
sender.sendMessage("You are awesome!");
|
||||
} else {
|
||||
sender.sendMessage("You suck!");
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static Economy getEconomy() {
|
||||
return econ;
|
||||
}
|
||||
|
||||
public static Permission getPermissions() {
|
||||
return perms;
|
||||
}
|
||||
|
||||
public static Chat getChat() {
|
||||
return chat;
|
||||
}
|
||||
}
|
||||
```
|
||||
16
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/31-TabooLib/1-署名.md
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 5分钟
|
||||
---
|
||||
|
||||
# Vault介绍
|
||||
|
||||
`Vault` 插件是一个关于权限、聊天以及经济插件的前置插件,他能让这些插件快速地与 `Vault` 插件挂钩而不需要依赖于其他个别插件。
|
||||
多数关于注册和权限的前置插件配置过于繁琐且缺乏大部分功能,于是这个插件便诞生了。
|
||||
`Vault` 插件可以通过更加直观明了的方式解决这些问题,并为这些插件提供他们可能所需要的支持与依赖服务。
|
||||
|
||||
> Vault虽然能够通过API管控经济方面的特性,但是他本身不存在任何存储功能
|
||||
|
||||
[Vault的JavaDocs](https://milkbowl.github.io/VaultAPI/)
|
||||
|
||||
27
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/31-TabooLib/2-TabooLib介绍.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
|
||||
# 署名
|
||||
|
||||
## 署名信息
|
||||
|
||||
本文作者: TabooLib社区.
|
||||
TabooLib官网: [https://www.tabooproject.org/](https://www.tabooproject.org/).
|
||||
原文: [https://taboolib.feishu.cn/wiki/Lzf8wFEsfiHclskCuGkctoUNn9b](https://taboolib.feishu.cn/wiki/Lzf8wFEsfiHclskCuGkctoUNn9b).
|
||||
特别鸣谢: 枫溪.
|
||||
|
||||
## 相关说明
|
||||
|
||||
中国版对文章部分内容有所改动.
|
||||
本文主体内容以 `TabooLib 6` 为蓝本进行教学.
|
||||
|
||||
## 建议
|
||||
|
||||
虽然`Taboolib`能够使开发者能够更快速的开发Bukkit可运行的插件.
|
||||
但是在使用之前,需要确保你已经较为熟练的掌握Bukkit基本开发思路,并且能够独立的开发一个中小型插件.
|
||||
|
||||
> 工具库始终只是为了你开发更灵活而建设的
|
||||
102
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/31-TabooLib/3-快速上手.md
Normal file
@@ -0,0 +1,102 @@
|
||||
---
|
||||
front:
|
||||
hard: 入门
|
||||
time: 10分钟
|
||||
---
|
||||
|
||||
|
||||
# 快速上手
|
||||
|
||||
## 创建项目
|
||||
|
||||
打开 IDEA -> Plugins -> 搜索 Taboo Development -> 安装此插件
|
||||
|
||||

|
||||
|
||||
> https://plugins.jetbrains.com/plugin/25210-taboolib-development
|
||||
|
||||
新建项目中选择 Taboo Development .
|
||||
选择项目名称和项目位置.
|
||||
|
||||

|
||||
|
||||
输入插件名、 主类、 版本等信息
|
||||
选择需要用到的模块
|
||||
|
||||

|
||||
|
||||
> 模块化是`TabooLib`特点之一,开发者无需下载不需要的前置库,各取所需即可
|
||||
> 如果还不确定自己会用到什么模块也不要着急,后续仍然可以在`Gradle`配置文件中配置Install
|
||||
|
||||
接下来输入插件基本信息
|
||||
|
||||

|
||||
|
||||
|
||||
## 认识目录
|
||||
|
||||

|
||||
|
||||
### 修改项目名
|
||||
|
||||
在`settings.gradle.kts`中.
|
||||
你会看到 `rootProject.name = "TestProject"`.
|
||||
|
||||
修改后同步Gradle可以快速修改项目名.
|
||||
|
||||
### 修改基础信息
|
||||
|
||||
在`gradle.properties`中.
|
||||
您可以在这里面修改插件的基础信息
|
||||
|
||||
```java-properties
|
||||
group=top.maplex.testproject
|
||||
version=1.0.0
|
||||
kotlin.incremental=true
|
||||
kotlin.incremental.java=true
|
||||
kotlin.caching.enabled=true
|
||||
kotlin.parallel.tasks.in.project=true
|
||||
kotlin.experimental.tryK2=true
|
||||
kapt.use.k2=true
|
||||
```
|
||||
|
||||
这其中包括了是否开启Kotlin2
|
||||
|
||||
> 为什么要用Kotlin2呢,您可以看看这个图
|
||||
|
||||

|
||||
|
||||
**节省了将近一半的编译时间**
|
||||
|
||||
### 构建配置
|
||||
|
||||
在`build.gradle.kts`,这个是构建配置文件,非常重要
|
||||
|
||||

|
||||
|
||||
如果你需要使用Kotlin2
|
||||
在构建配置中 id("org.jetbrains.kotlin.jvm") version "1.9.22" 版本设置成 1.9.22
|
||||
|
||||
```kotlin
|
||||
|
||||
plugins {
|
||||
java
|
||||
id("io.izzel.taboolib") version "2.0.6"
|
||||
id("org.jetbrains.kotlin.jvm") version "1.9.22"
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
然后再代码块中新增一个信息
|
||||
|
||||
```kotlin
|
||||
|
||||
kotlin {
|
||||
sourceSets.all {
|
||||
languageSettings {
|
||||
languageVersion = "2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
0
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/README.md
Normal file
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_0.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_1.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_2.png
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_3.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_4.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_5.png
Normal file
|
After Width: | Height: | Size: 268 KiB |
BIN
mcguide/28-电脑网络游戏/课程4:常见第三方库教程/images/0_6.png
Normal file
|
After Width: | Height: | Size: 238 KiB |