7月31日同步更新

This commit is contained in:
MCNeteaseDevs
2025-07-31 17:53:14 +08:00
parent f5c6bdba2e
commit cf061270d3
799 changed files with 27437 additions and 494 deletions

View File

@@ -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/)

View File

@@ -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/)

View File

@@ -0,0 +1,16 @@
---
front:
hard: 入门
time: 5分钟
---
# Vault介绍
`Vault` 插件是一个关于权限、聊天以及经济插件的前置插件,他能让这些插件快速地与 `Vault` 插件挂钩而不需要依赖于其他个别插件。
多数关于注册和权限的前置插件配置过于繁琐且缺乏大部分功能,于是这个插件便诞生了。
`Vault` 插件可以通过更加直观明了的方式解决这些问题,并为这些插件提供他们可能所需要的支持与依赖服务。
> Vault虽然能够通过API管控经济方面的特性但是他本身不存在任何存储功能
[Vault的JavaDocs](https://milkbowl.github.io/VaultAPI/)

View 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;
}
}
```

View File

@@ -0,0 +1,16 @@
---
front:
hard: 入门
time: 5分钟
---
# Vault介绍
`Vault` 插件是一个关于权限、聊天以及经济插件的前置插件,他能让这些插件快速地与 `Vault` 插件挂钩而不需要依赖于其他个别插件。
多数关于注册和权限的前置插件配置过于繁琐且缺乏大部分功能,于是这个插件便诞生了。
`Vault` 插件可以通过更加直观明了的方式解决这些问题,并为这些插件提供他们可能所需要的支持与依赖服务。
> Vault虽然能够通过API管控经济方面的特性但是他本身不存在任何存储功能
[Vault的JavaDocs](https://milkbowl.github.io/VaultAPI/)

View 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基本开发思路并且能够独立的开发一个中小型插件.
> 工具库始终只是为了你开发更灵活而建设的

View File

@@ -0,0 +1,102 @@
---
front:
hard: 入门
time: 10分钟
---
# 快速上手
## 创建项目
打开 IDEA -> Plugins -> 搜索 Taboo Development -> 安装此插件
![](../images/0_0.png)
> https://plugins.jetbrains.com/plugin/25210-taboolib-development
新建项目中选择 Taboo Development .
选择项目名称和项目位置.
![](../images/0_1.png)
输入插件名、 主类、 版本等信息
选择需要用到的模块
![](../images/0_2.png)
> 模块化是`TabooLib`特点之一,开发者无需下载不需要的前置库,各取所需即可
> 如果还不确定自己会用到什么模块也不要着急,后续仍然可以在`Gradle`配置文件中配置Install
接下来输入插件基本信息
![](../images/0_3.png)
## 认识目录
![](../images/0_4.png)
### 修改项目名
`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呢您可以看看这个图
![](../images/0_5.png)
**节省了将近一半的编译时间**
### 构建配置
在`build.gradle.kts`,这个是构建配置文件,非常重要
![](../images/0_6.png)
如果你需要使用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"
}
}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB