# AnhyLibAPI: 用于 Minecraft 插件
**AnhyLibAPI** 是一套专为整合到 Minecraft 插件中的库,旨在增强其在运行 Spigot、Paper、Purpur 和其他 Spigot 派生的服务器上的能力。
需要 ProtocolLib 插件版本 5.0.0 或更高版本才能运行。
**AnhyLibAPI** 必须作为插件加载到服务器上。 重要的是要理解,**AnhyLibAPI** 作为插件,不监控任何事件,没有计时器,也不与世界或玩家交互,从而确保服务器运行和性能没有额外的负担。 **AnhyLibAPI** 的主要目的是将其 API 提供给其他插件,作为扩展其功能强大而可靠的基础。 这种设计确保 **AnhyLibAPI** 增强插件功能,而不会损害服务器效率。
### 主要功能:
* **多语言支持**: 易于整合插件的语言包。
* **NBT 标签处理**: 高级管理 NBT 标签,用于灵活的数据交互。
* **玩家持久数据**: 有效使用玩家的持久数据。
* **自定义消息**: 个性化向玩家传递消息。
* **日志记录**: 用于事件日志的独特方法。
### AnhyLibAPI 的主要功能
#### 1. 多语言支持
AnhyLibAPI 通过检查“玩家持久数据”以获取玩家选择的语言,实现统一的多语言支持标准。 如果未找到选择的语言,则默认使用玩家的 Minecraft 客户端语言。 此外,它支持包含首选语言列表,从而增强了本地化的灵活性。
#### 2. NBT 标签处理
AnhyLibAPI 简化了在物品中添加、修改和删除 NBT 标签的过程,使开发人员能够轻松管理游戏中的关键物品数据。
#### 3. 玩家持久数据
此功能允许存储、检索和修改玩家的个人数据,例如设置、状态和成就,从而提供深入的个性化和个人详细信息的保留。
#### 4. 自定义消息和日志记录
这些功能提供消息自定义和颜色编码的日志记录,用于各种消息类型。 它们增强了插件与玩家之间的通信,并促进了插件中事件的更有效跟踪和分析。
### 文档:
AnhyLibAPI 的 JavaDoc 可在以下链接获取: [AnhyLibAPI 文档](https://dev.anh.ink/anhylibapi/javadoc/)。
### 与 Gradle 和 Maven 的集成:
#### Gradle:
```groovy
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
```
```groovy
dependencies {
implementation 'com.github.AnhyDev:AnhyLibAPI:v1.4.0'
}
```
#### Maven:
```xml
jitpack.io
https://jitpack.io
```
```xml
com.github.AnhyDev
AnhyLibAPI
v1.4.0
```
### 插件编写示例:
对于一个综合、现成的插件示例,该示例实现了 AnhyLibAPI,请访问以下链接: [AnhyLibAPI 插件示例](https://github.com/AnhyDev/ResourcesHub/tree/main/AnhyLibAPI/examples/ExampleLangPlugin)。 此示例不仅仅是样本代码; 这是一个完全可运行的插件,具有多语言支持、可配置设置和玩家命令。 开发人员可以将其用作基础,进行重命名和重新打包,同时还可以添加自己的代码以扩展其功能。 它是一个在实践中应用 AnhyLibAPI 的理想起点,用于实际的插件项目。
#### 请参阅以下代码示例:
```java
package ink.anh.example;
import java.io.File;
import java.io.IOException;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin;
import ink.anh.api.LibraryManager;
import ink.anh.api.lingo.Translator;
import ink.anh.api.lingo.lang.LanguageManager;
import ink.anh.api.messages.Logger;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.md_5.bungee.api.ChatColor;
public class GlobalManager extends LibraryManager {
private static GlobalManager instance;
private ExampleLangPlugin plugin;
private LanguageManager langManager;
private String pluginName;
private String defaultLang;
private static BukkitAudiences bukkitAudiences;
private boolean debug;
private GlobalManager(ExampleLangPlugin plugin) {
super(plugin);
this.plugin = plugin;
this.saveDefaultConfig();
this.loadFields(plugin);
}
public static synchronized GlobalManager getManager(ExampleLangPlugin plugin) {
if (instance == null) {
instance = new GlobalManager(plugin);
}
return instance;
}
@Override
public Plugin getPlugin() {
return plugin;
}
@Override
public String getPluginName() {
return pluginName;
}
@Override
public BukkitAudiences getBukkitAudiences() {
return bukkitAudiences;
}
@Override
public LanguageManager getLanguageManager() {
return this.langManager;
}
@Override
public String getDefaultLang() {
return defaultLang;
}
@Override
public boolean isDebug() {
return debug;
}
private void loadFields(ExampleLangPlugin plugin) {
bukkitAudiences = BukkitAudiences.create(plugin);
defaultLang = plugin.getConfig().getString("language", "en");
pluginName = ChatColor.translateAlternateColorCodes('&',plugin.getConfig().getString("plugin_name", "ExampleLangPlugin"));
debug = plugin.getConfig().getBoolean("debug", false);
setLanguageManager();
}
private void saveDefaultConfig() {
File configFile = new File(plugin.getDataFolder(), "config.yml");
if (!configFile.exists()) {
YamlConfiguration defaultConfig = new YamlConfiguration();
defaultConfig.set("plugin_name", "ExampleLangPlugin");
defaultConfig.set("language", "en");
defaultConfig.set("debug", false);
try {
defaultConfig.save(configFile);
Logger.warn(plugin, "Default configuration created. ");
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void setLanguageManager() {
if (this.langManager == null) {
this.langManager = LangMessage.getInstance(this);;
} else {
this.langManager.reloadLanguages();
}
}
public boolean reload() {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
try {
saveDefaultConfig();
plugin.reloadConfig();
loadFields(plugin);
Logger.info(plugin, Translator.translateKyeWorld(instance, "configuration_reloaded" , new String[] {defaultLang}));
} catch (Exception e) {
e.printStackTrace();
Logger.error(plugin, Translator.translateKyeWorld(instance, "err_reloading_configuration ", new String[] {defaultLang}));
}
});
return true;
}
}
```
```java
package ink.anh.example;
import ink.anh.api.lingo.lang.LanguageManager;
public class LangMessage extends LanguageManager {
private static LangMessage instance = null;
private static final Object LOCK = new Object();
private LangMessage(GlobalManager manager) {
super(manager, "lang");
}
public static LangMessage getInstance(GlobalManager manager) {
if (instance == null) {
synchronized (LOCK) {
if (instance == null) {
instance = new LangMessage(manager);
}
}
}
return instance;
}
}
```