mirror of
https://github.com/CarmJos/UserPrefix.git
synced 2026-06-05 09:01:39 +08:00
Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e90890c67 | |||
| 7e4ca870b5 | |||
| 42b71714aa | |||
| 0d6247b0f2 | |||
| 1b9f4f3e55 | |||
| b76081bb6b | |||
| b8d6862b17 | |||
| 46fb39d7bb | |||
| 523a4f872b | |||
| 5151f1f917 | |||
| 296339ca6f | |||
| 63b69defcc | |||
| 857ce5c27b | |||
| a5189ff314 | |||
| bacb0b1bed | |||
| 1826f08575 | |||
| 4df2a49c5b | |||
| cbb9928232 | |||
| 967984e0c3 | |||
| ad780a00bd | |||
| 43c2c14cb3 | |||
| 8521d87c46 | |||
| 378e518e72 | |||
| 84cbe0c61a | |||
| 90f7f7f2e5 | |||
| 48147aec16 | |||
| e7c8ce284c | |||
| e8b603debc | |||
| 72730fad1a | |||
| a87e97f744 | |||
| b2f7338ba6 | |||
| f91a2aa198 | |||
| 124ee0f9c3 | |||
| 9f738ff1ae | |||
| f23fa03f7a | |||
| cf749bf5c0 | |||
| 01e321686f | |||
| deba26c713 | |||
| 5b4d49f6ed | |||
| 2e5250dd36 | |||
| 88730c98f2 | |||
| e003a543f5 | |||
| 07edaeb401 | |||
| 2357699324 | |||
| c2fa1a1e95 | |||
| 3b03ec4616 | |||
| 1a2644210b |
@@ -0,0 +1,70 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '44 6 * * 4'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'java' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
|
||||
# Learn more about CodeQL language support at https://git.io/codeql-language-support
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_TOKEN
|
||||
- name: "Deploy"
|
||||
run: mvn -B deploy --file pom.xml
|
||||
run: mvn -B deploy --file pom.xml -DskipTests
|
||||
env:
|
||||
MAVEN_USERNAME: ${{ github.repository_owner }}
|
||||
MAVEN_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
||||
@@ -0,0 +1,84 @@
|
||||
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
|
||||
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
|
||||
|
||||
name: Javadoc
|
||||
|
||||
on:
|
||||
# 支持手动触发构建
|
||||
workflow_dispatch:
|
||||
release:
|
||||
# 创建release的时候触发
|
||||
types: [ published ]
|
||||
|
||||
jobs:
|
||||
api-website:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout the repo
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up the Java JDK
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: Generate docs
|
||||
run: mvn package -DskipTests
|
||||
|
||||
- name: Copy to Location
|
||||
run: |
|
||||
rm -rf docs
|
||||
mkdir -vp docs
|
||||
cp -vrf target/apidocs/* docs/
|
||||
cp -vrf JAVADOC-README.md docs/README.md
|
||||
|
||||
# - name: Tidy up
|
||||
# id: tidy
|
||||
# uses: cicirello/javadoc-cleanup@v1
|
||||
# with:
|
||||
# base-url-path: https://carmjos.github.io/userprefix
|
||||
# path-to-root: docs
|
||||
#
|
||||
# - name: Log output
|
||||
# run: |
|
||||
# echo "modified-count = ${{ steps.tidy.outputs.modified-count }}"
|
||||
|
||||
- name: Generate the sitemap
|
||||
id: sitemap
|
||||
uses: cicirello/generate-sitemap@v1
|
||||
with:
|
||||
base-url-path: https://carmjos.github.io/userprefix
|
||||
path-to-root: docs
|
||||
|
||||
- name: Output stats
|
||||
run: |
|
||||
echo "sitemap-path = ${{ steps.sitemap.outputs.sitemap-path }}"
|
||||
echo "url-count = ${{ steps.sitemap.outputs.url-count }}"
|
||||
echo "excluded-count = ${{ steps.sitemap.outputs.excluded-count }}"
|
||||
|
||||
- name: Configure Git
|
||||
env:
|
||||
DEPLOY_PRI: ${{secrets.DEPLOY_PRI}}
|
||||
run: |
|
||||
sudo timedatectl set-timezone "Asia/Shanghai"
|
||||
mkdir -p ~/.ssh/
|
||||
echo "$DEPLOY_PRI" > ~/.ssh/id_rsa
|
||||
chmod 600 ~/.ssh/id_rsa
|
||||
ssh-keyscan github.com >> ~/.ssh/known_hosts
|
||||
git config --global user.name 'CarmJos'
|
||||
git config --global user.email 'carm@carm.cc'
|
||||
|
||||
- name: Commit documentation changes
|
||||
run: |
|
||||
cd docs
|
||||
git init
|
||||
git remote add origin git@github.com:CarmJos/UserPrefix.git
|
||||
git checkout -b gh-pages
|
||||
git add -A
|
||||
git commit -m "API Document generated."
|
||||
- name: Push javadocs
|
||||
run: |
|
||||
cd docs
|
||||
git push origin HEAD:gh-pages --force
|
||||
|
||||
@@ -34,5 +34,5 @@ jobs:
|
||||
- name: "Upload artifact"
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: artifact
|
||||
name: Artifact
|
||||
path: staging
|
||||
@@ -0,0 +1,3 @@
|
||||
# UserPrefix Javadoc
|
||||
|
||||
请访问 [JavaDoc](https://carmjos.github.io/UserPrefix) 。
|
||||
@@ -109,11 +109,22 @@ type `/papi info UserPrefix` to see all the placeholders.
|
||||
Notice: The default configuration is based on Chinese. You can find
|
||||
the [English Version here](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/en_US/config.yml).
|
||||
|
||||
<details>
|
||||
<summary>Click to see plugin configuration</summary>
|
||||
|
||||
|
||||
```yaml
|
||||
version: ${project.version} # DO NOT EDIT IT
|
||||
|
||||
debug: false #DEBUG OUT PUT
|
||||
|
||||
custom-storage:
|
||||
# Custom storage location
|
||||
# default location is "./prefixes"
|
||||
# Support absolute file path , such as "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false
|
||||
path: "prefixes/" # Must be a folder!
|
||||
|
||||
GUI:
|
||||
title: "&f&lMy Prefixes List" # Title of the GUI
|
||||
items:
|
||||
@@ -188,8 +199,13 @@ defaultPrefix:
|
||||
- "§a✔ Selected"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### [Messages Configuration](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/en_US/messages.yml) (messages.yml)
|
||||
|
||||
<details>
|
||||
<summary>Click to see messages configuration</summary>
|
||||
|
||||
```yaml
|
||||
selected:
|
||||
- "&7You have selected the &f%(name) &7as current prefix."
|
||||
@@ -213,12 +229,17 @@ list-value:
|
||||
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### [Prefixes Configuration](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/en_US/example-prefix.yml) (/prefixes/*.yml)
|
||||
|
||||
All prefixes are separate configuration files, stored in the `<Data Folder>/prefixes/` for easy management.
|
||||
|
||||
Some symbols in file name may affect reading, please avoid using them.
|
||||
|
||||
<details>
|
||||
<summary>Example prefix configuration.</summary>
|
||||
|
||||
```yaml
|
||||
# identifier [Necessary]
|
||||
# This will be used for data-storage.
|
||||
@@ -292,6 +313,8 @@ itemNoPermission:
|
||||
- "§e✯ Buy the VIP to use it!"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## Support and Donation
|
||||
|
||||
This project is support by the [YourCraft(你的世界)](https://www.ycraft.cn) .
|
||||
|
||||
@@ -36,8 +36,8 @@ The **English version** of the introduction is [here](https://github.com/CarmJos
|
||||
- 当玩家权限变更时会实时监测前缀,若权限不足则自动更换前缀并提示
|
||||
- 可配置的声音、消息!
|
||||
- 前缀图标可配置“选中”、“有权限”与“无权限”三种状态的物品
|
||||
- 物品的配置通过ItemStack原生配置,支持MC所有的设定!
|
||||
- 具体的设定请参考其他文档哦~
|
||||
- 物品的配置通过ItemStack原生配置,支持MC所有的设定!
|
||||
- 具体的设定请参考其他文档哦~
|
||||
- TabList自动按照前缀的权重排序 (如有冲突可关掉)
|
||||
- 玩家头顶前缀显示 (如有冲突可关掉) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/nametag/UserNameTag.java)
|
||||
- 简单的聊天变量修改功能!(不推荐使用) [✈](https://github.com/CarmJos/UserPrefix/blob/master/src/main/java/cc/carm/plugin/userprefix/listener/ChatListener.java)
|
||||
@@ -99,11 +99,22 @@ The **English version** of the introduction is [here](https://github.com/CarmJos
|
||||
|
||||
### [基础配置文件](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/config.yml) (config.yml)
|
||||
|
||||
<details>
|
||||
<summary>展开查看详细基础配置文件</summary>
|
||||
|
||||
```yaml
|
||||
version: 1.0.0-SNAPSHOT # 配置文件版本,一般不会动。
|
||||
version: 2.1.9 # 配置文件版本,一般不会动。
|
||||
|
||||
debug: false #debug输出,开发者用的
|
||||
|
||||
custom-storage:
|
||||
# 自定义存储位置
|
||||
# 默认存储位置为 “插件文件夹”/prefixes
|
||||
# 可以规定到远程文件夹中去寻找前缀相关的设定
|
||||
# 支持绝对文件路径,如 "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false # 是否启用
|
||||
path: "prefixes/" # 一定要指向一个文件夹!
|
||||
|
||||
functions:
|
||||
OnNamePrefix: true # 是否给头顶上添加前缀,该方法用到了头顶的那个计分板,如有冲突请关掉哦~
|
||||
autoUsePrefix: true # 自动前缀显示 当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个
|
||||
@@ -175,7 +186,13 @@ defaultPrefix:
|
||||
- "§a✔ 您正在使用该前缀"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### [消息配置文件](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/messages.yml) (messages.yml)
|
||||
|
||||
<details>
|
||||
<summary>展开查看详细消息配置文件</summary>
|
||||
|
||||
```yaml
|
||||
selected:
|
||||
- "&7您选择了 &f%(name) &7作为当前显示的前缀。"
|
||||
@@ -198,11 +215,18 @@ list-value:
|
||||
- "&8- &7内容示例&r %(content) %(sender_name)"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### [前缀配置文件](https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/prefixes/example-prefix.yml) (prefixes/*.yml)
|
||||
|
||||
所有前缀均为单独的配置文件,存放于 `插件配置目录/prefixes` 下,便于管理。
|
||||
|
||||
文件名理论上可以随便取,推荐使用英文,部分符号可能会影响正常读取,请避免使用。
|
||||
|
||||
|
||||
<details>
|
||||
<summary>展开查看示例前缀配置文件</summary>
|
||||
|
||||
```yaml
|
||||
# 唯一标识 [必须]
|
||||
# 将用于记录玩家所选的前缀,以及用于数据的缓存。
|
||||
@@ -283,6 +307,7 @@ itemNoPermission:
|
||||
- "§e✯ 加入Pro+会员以使用该前缀!"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
## 支持与捐赠
|
||||
|
||||
@@ -293,12 +318,15 @@ itemNoPermission:
|
||||
|
||||
感谢您成为开源项目的支持者!
|
||||
|
||||
<img height=25% width=25% src="https://raw.githubusercontent.com/CarmJos/CarmJos/main/img/donate-code.jpg" />
|
||||
<img height=25% width=25% src="https://raw.githubusercontent.com/CarmJos/CarmJos/main/img/donate-code.jpg" alt=""/>
|
||||
|
||||
## 开源协议
|
||||
|
||||
本项目源码采用 [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) 开源协议。
|
||||
> ### 关于 GPL 协议
|
||||
|
||||
<details>
|
||||
<summary>关于 GPL 协议</summary>
|
||||
|
||||
> GNU General Public Licence (GPL) 有可能是开源界最常用的许可模式。GPL 保证了所有开发者的权利,同时为使用者提供了足够的复制,分发,修改的权利:
|
||||
>
|
||||
> #### 可自由复制
|
||||
@@ -311,5 +339,17 @@ itemNoPermission:
|
||||
> 如果你想添加或删除某个功能,没问题,如果你想在别的项目中使用部分代码,也没问题,唯一的要求是,使用了这段代码的项目也必须使用 GPL 协议。
|
||||
>
|
||||
> 需要注意的是,分发的时候,需要明确提供源代码和二进制文件,另外,用于某些程序的某些协议有一些问题和限制,你可以看一下 @PierreJoye 写的 Practical Guide to GPL Compliance 一文。使用 GPL 协议,你必须在源代码代码中包含相应信息,以及协议本身。
|
||||
>
|
||||
>
|
||||
> *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。*
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
```text
|
||||
_ _ _____ __ _
|
||||
| | | | | __ \ / _|(_)
|
||||
| | | | ___ ___ _ __ | |__) |_ __ ___ | |_ _ __ __
|
||||
| | | |/ __| / _ \| '__|| ___/| '__|/ _ \| _|| |\ \/ /
|
||||
| |__| |\__ \| __/| | | | | | | __/| | | | > <
|
||||
\____/ |___/ \___||_| |_| |_| \___||_| |_|/_/\_\
|
||||
```
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>cc.carm.plugin</groupId>
|
||||
<artifactId>userprefix</artifactId>
|
||||
<version>2.1.6</version>
|
||||
<version>2.2.1</version>
|
||||
|
||||
<name>UserPrefix</name>
|
||||
<description>轻便、高效、实时的用户前缀系统。</description>
|
||||
@@ -88,6 +88,7 @@
|
||||
</repositories>
|
||||
|
||||
<distributionManagement>
|
||||
<downloadUrl>${project.url}/releases</downloadUrl>
|
||||
<repository>
|
||||
<id>github</id>
|
||||
<name>GitHub Packages</name>
|
||||
@@ -119,10 +120,17 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>2.2.1</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13</version>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
@@ -140,6 +148,9 @@
|
||||
</links>
|
||||
<detectJavaApiLink>true</detectJavaApiLink>
|
||||
<encoding>UTF-8</encoding>
|
||||
<charset>UTF-8</charset>
|
||||
<docencoding>UTF-8</docencoding>
|
||||
<locale>zh_CN</locale>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
@@ -195,6 +206,13 @@
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
<!-- Replace this with your package! -->
|
||||
<shadedPattern>cc.carm.plugin.userprefix.bstats</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
<filters>
|
||||
<filter>
|
||||
<artifact>*:*</artifact>
|
||||
|
||||
@@ -14,93 +14,139 @@ import cc.carm.plugin.userprefix.manager.UserManager;
|
||||
import cc.carm.plugin.userprefix.util.ColorParser;
|
||||
import cc.carm.plugin.userprefix.util.MessageUtil;
|
||||
import net.luckperms.api.event.user.UserDataRecalculateEvent;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bstats.charts.SingleLineChart;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.PluginCommand;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class Main extends JavaPlugin {
|
||||
|
||||
private static Main instance;
|
||||
private static Main instance;
|
||||
private static Metrics metrics;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " &7开始加载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
log(getName() + " " + getDescription().getVersion() + " &7开始加载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
log("加载配置文件...");
|
||||
ConfigManager.initConfig();
|
||||
PrefixManager.init();
|
||||
|
||||
log("加载配置文件...");
|
||||
ConfigManager.initConfig();
|
||||
PrefixManager.init();
|
||||
log("注册指令...");
|
||||
registerCommand("UserPrefix", new UserPrefixCommand());
|
||||
registerCommand("UserPrefixAdmin", new UserPrefixAdminCommand());
|
||||
|
||||
log("注册指令...");
|
||||
Bukkit.getPluginCommand("UserPrefix").setExecutor(new UserPrefixCommand());
|
||||
Bukkit.getPluginCommand("UserPrefixAdmin").setExecutor(new UserPrefixAdminCommand());
|
||||
log("注册监听器...");
|
||||
regListener(new UserListener());
|
||||
regListener(new ChatListener());
|
||||
ServiceManager.getService().getEventBus().subscribe(this, UserDataRecalculateEvent.class, UserNodeUpdateProcessor::process);
|
||||
|
||||
log("注册监听器...");
|
||||
regListener(new UserListener());
|
||||
regListener(new ChatListener());
|
||||
ServiceManager.getService().getEventBus().subscribe(this, UserDataRecalculateEvent.class, UserNodeUpdateProcessor::process);
|
||||
if (MessageUtil.hasPlaceholderAPI()) {
|
||||
log("注册变量...");
|
||||
new UserPrefixExpansion(getInstance()).register();
|
||||
} else {
|
||||
log("未安装 PlaceholderAPI 不进行变量注册...");
|
||||
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
||||
}
|
||||
|
||||
if (MessageUtil.hasPlaceholderAPI()) {
|
||||
log("注册变量...");
|
||||
new UserPrefixExpansion(getInstance()).register();
|
||||
} else {
|
||||
log("未安装 PlaceholderAPI 不进行变量注册...");
|
||||
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
||||
}
|
||||
if (PrefixConfig.METRICS.get()) {
|
||||
log("启用统计数据...");
|
||||
metrics = new Metrics(this, 13776);
|
||||
metrics.addCustomChart(new SingleLineChart("active_prefixes", () -> PrefixManager.getPrefixes().size()));
|
||||
}
|
||||
|
||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
|
||||
showAD();
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() > 0) {
|
||||
Bukkit.getOnlinePlayers().forEach(UserManager::initPlayer); // 适配热重载
|
||||
}
|
||||
|
||||
|
||||
log("加载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
}
|
||||
|
||||
showAD();
|
||||
@Override
|
||||
public void onDisable() {
|
||||
showPluginName();
|
||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
|
||||
if (Bukkit.getOnlinePlayers().size() > 0) {
|
||||
Bukkit.getOnlinePlayers().forEach(UserManager::initPlayer); // 适配热重载
|
||||
}
|
||||
log("卸载监听器...");
|
||||
Bukkit.getServicesManager().unregisterAll(this);
|
||||
|
||||
}
|
||||
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
log(getName() + " " + getDescription().getVersion() + " 开始卸载...");
|
||||
long startTime = System.currentTimeMillis();
|
||||
showAD();
|
||||
|
||||
log("卸载监听器...");
|
||||
Bukkit.getServicesManager().unregisterAll(this);
|
||||
}
|
||||
|
||||
log("卸载完成 ,共耗时 " + (System.currentTimeMillis() - startTime) + " ms 。");
|
||||
/**
|
||||
* 注册监听器
|
||||
*
|
||||
* @param listener 监听器
|
||||
*/
|
||||
public static void regListener(Listener listener) {
|
||||
Bukkit.getPluginManager().registerEvents(listener, getInstance());
|
||||
}
|
||||
|
||||
showAD();
|
||||
public static void log(String message) {
|
||||
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
|
||||
}
|
||||
|
||||
}
|
||||
public static void debug(String message) {
|
||||
if (PrefixConfig.DEBUG.get()) {
|
||||
log("[DEBUG] " + message);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册监听器
|
||||
*
|
||||
* @param listener 监听器
|
||||
*/
|
||||
public static void regListener(Listener listener) {
|
||||
Bukkit.getPluginManager().registerEvents(listener, getInstance());
|
||||
}
|
||||
public static void error(String message) {
|
||||
log("&c[ERROR] &r" + message);
|
||||
}
|
||||
|
||||
public static void log(String message) {
|
||||
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
|
||||
}
|
||||
|
||||
public static void debug(String message) {
|
||||
if (PrefixConfig.DEBUG.get()) {
|
||||
log("[DEBUG] " + message);
|
||||
}
|
||||
}
|
||||
public static JavaPlugin getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static JavaPlugin getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private void showAD() {
|
||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||
}
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor) {
|
||||
registerCommand(commandName, executor, null);
|
||||
}
|
||||
|
||||
public static void registerCommand(String commandName,
|
||||
@NotNull CommandExecutor executor,
|
||||
@Nullable TabCompleter tabCompleter) {
|
||||
PluginCommand command = Bukkit.getPluginCommand(commandName);
|
||||
if (command == null) return;
|
||||
command.setExecutor(executor);
|
||||
if (tabCompleter != null) command.setTabCompleter(tabCompleter);
|
||||
}
|
||||
|
||||
private void showPluginName() {
|
||||
log("&b _ _ &f _____ __ _ ");
|
||||
log("&b| | | | &f| __ \\ / _|(_) ");
|
||||
log("&b| | | | ___ ___ _ __ &f| |__) |_ __ ___ | |_ _ __ __");
|
||||
log("&b| | | |/ __| / _ \\| '__|&f| ___/| '__|/ _ \\| _|| |\\ \\/ /");
|
||||
log("&b| |__| |\\__ \\| __/| | &f| | | | | __/| | | | > < ");
|
||||
log("&b \\____/ |___/ \\___||_| &f|_| |_| \\___||_| |_|/_/\\_\\");
|
||||
log("&8 ");
|
||||
log("&8> &f" + getDescription().getWebsite());
|
||||
}
|
||||
|
||||
private void showAD() {
|
||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cc.carm.plugin.userprefix.command;
|
||||
|
||||
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -14,6 +15,15 @@ public class UserPrefixCommand implements CommandExecutor {
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] strings) {
|
||||
if (sender instanceof Player) {
|
||||
PrefixSelectGUI.open((Player) sender);
|
||||
} else {
|
||||
if (strings.length != 1) {
|
||||
sender.sendMessage("输入 /prefix <ID> 为玩家打开前缀GUI。");
|
||||
} else {
|
||||
Player player = Bukkit.getPlayer(strings[0]);
|
||||
if (player != null) {
|
||||
PrefixSelectGUI.open(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -9,65 +9,75 @@ import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class PrefixConfig {
|
||||
|
||||
public static ConfigValue<Boolean> DEBUG = new ConfigValue<>("debug", Boolean.class, false);
|
||||
public static ConfigValue<Boolean> DEBUG = new ConfigValue<>("debug", Boolean.class, false);
|
||||
|
||||
public static class Functions {
|
||||
public static ConfigValue<Boolean> METRICS = new ConfigValue<>("metrics", Boolean.class, true);
|
||||
|
||||
public static ConfigValue<Boolean> NAME_PREFIX = new ConfigValue<>("functions.OnNamePrefix", Boolean.class, true);
|
||||
public static ConfigValue<Boolean> AUTO_USE = new ConfigValue<>("functions.autoUsePrefix", Boolean.class, true);
|
||||
public static class CustomStorage {
|
||||
|
||||
public static class Chat {
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("custom-storage.enable", Boolean.class, false);
|
||||
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("functions.chat.enable", Boolean.class, false);
|
||||
public static ConfigValue<String> FORMAT = new ConfigValue<>("functions.chat.format", String.class, "<%1$s> %2$s");
|
||||
public static ConfigValue<String> PATH = new ConfigValue<>("custom-storage.path", String.class, "prefixes/");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public static class Functions {
|
||||
|
||||
public static class GUI {
|
||||
public static ConfigValue<Boolean> NAME_PREFIX = new ConfigValue<>("functions.OnNamePrefix", Boolean.class, true);
|
||||
public static ConfigValue<Boolean> AUTO_USE = new ConfigValue<>("functions.autoUsePrefix", Boolean.class, true);
|
||||
|
||||
public static ConfigValue<String> TITLE = new ConfigValue<>("GUI.title", String.class, "&f&l我的前缀 &8| 列表");
|
||||
public static class Chat {
|
||||
|
||||
public static class Items {
|
||||
public static ConfigValue<Boolean> ENABLE = new ConfigValue<>("functions.chat.enable", Boolean.class, false);
|
||||
public static ConfigValue<String> FORMAT = new ConfigValue<>("functions.chat.format", String.class, "<%1$s> %2$s");
|
||||
|
||||
public static ConfigValue<ItemStack> NEXT_PAGE = new ConfigValue<>("GUI.items.next-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("下一页")
|
||||
.addLore("&7&o右键可前往最后一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
public static ConfigValue<ItemStack> PREVIOUS_PAGE = new ConfigValue<>("GUI.items.previous-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("上一页")
|
||||
.addLore("&7&o右键可前往第一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public static class GUI {
|
||||
|
||||
public static class Messages {
|
||||
public static ConfigValue<String> TITLE = new ConfigValue<>("GUI.title", String.class, "&f&l我的前缀 &8| 列表");
|
||||
|
||||
public static ConfigMessageList SELECTED = new ConfigMessageList("selected");
|
||||
public static ConfigMessageList EXPIRED = new ConfigMessageList("expired");
|
||||
public static class Items {
|
||||
|
||||
public static ConfigMessageList RELOAD = new ConfigMessageList("reload");
|
||||
public static ConfigMessageList HELP = new ConfigMessageList("help");
|
||||
public static ConfigValue<ItemStack> NEXT_PAGE = new ConfigValue<>("GUI.items.next-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("下一页")
|
||||
.addLore("&7&o右键可前往最后一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
public static ConfigValue<ItemStack> PREVIOUS_PAGE = new ConfigValue<>("GUI.items.previous-page", ItemStack.class,
|
||||
new ItemStackFactory(Material.ARROW)
|
||||
.setDisplayName("上一页")
|
||||
.addLore("&7&o右键可前往第一页哦")
|
||||
.toItemStack()
|
||||
);
|
||||
|
||||
public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title");
|
||||
public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value");
|
||||
}
|
||||
}
|
||||
|
||||
public static class Sounds {
|
||||
}
|
||||
|
||||
public static ConfigSound GUI_OPEN = new ConfigSound("Sounds.openGUI");
|
||||
public static ConfigSound GUI_CLICK = new ConfigSound("Sounds.guiClick");
|
||||
public static ConfigSound PREFIX_CHANGE = new ConfigSound("Sounds.prefixChange");
|
||||
public static ConfigSound PREFIX_EXPIRED = new ConfigSound("Sounds.prefixExpired");
|
||||
public static class Messages {
|
||||
|
||||
}
|
||||
public static ConfigMessageList SELECTED = new ConfigMessageList("selected");
|
||||
public static ConfigMessageList EXPIRED = new ConfigMessageList("expired");
|
||||
|
||||
public static ConfigMessageList RELOAD = new ConfigMessageList("reload");
|
||||
public static ConfigMessageList HELP = new ConfigMessageList("help");
|
||||
|
||||
public static ConfigMessageList LIST_TITLE = new ConfigMessageList("list-title");
|
||||
public static ConfigMessageList LIST_VALUE = new ConfigMessageList("list-value");
|
||||
}
|
||||
|
||||
public static class Sounds {
|
||||
|
||||
public static ConfigSound GUI_OPEN = new ConfigSound("Sounds.openGUI");
|
||||
public static ConfigSound GUI_CLICK = new ConfigSound("Sounds.guiClick");
|
||||
public static ConfigSound PREFIX_CHANGE = new ConfigSound("Sounds.prefixChange");
|
||||
public static ConfigSound PREFIX_EXPIRED = new ConfigSound("Sounds.prefixExpired");
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -10,62 +10,64 @@ import org.bukkit.entity.Player;
|
||||
public class ConfigSound {
|
||||
|
||||
|
||||
FileConfig source;
|
||||
String configSection;
|
||||
FileConfig source;
|
||||
String configSection;
|
||||
|
||||
Sound defaultValue;
|
||||
Sound defaultValue;
|
||||
|
||||
public ConfigSound(String configSection) {
|
||||
this(configSection, null);
|
||||
}
|
||||
public ConfigSound(String configSection) {
|
||||
this(configSection, null);
|
||||
}
|
||||
|
||||
public ConfigSound(String configSection, Sound defaultValue) {
|
||||
this(ConfigManager.getPluginConfig(), configSection, defaultValue);
|
||||
}
|
||||
public ConfigSound(String configSection, Sound defaultValue) {
|
||||
this(ConfigManager.getPluginConfig(), configSection, defaultValue);
|
||||
}
|
||||
|
||||
public ConfigSound(FileConfig source, String configSection, Sound defaultValue) {
|
||||
this.source = source;
|
||||
this.configSection = configSection;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
public ConfigSound(FileConfig source, String configSection, Sound defaultValue) {
|
||||
this.source = source;
|
||||
this.configSection = configSection;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public FileConfiguration getConfiguration() {
|
||||
return this.source.getConfig();
|
||||
}
|
||||
public FileConfiguration getConfiguration() {
|
||||
return this.source.getConfig();
|
||||
}
|
||||
|
||||
public void set(Sound value, float volume) {
|
||||
getConfiguration().set(this.configSection, value.name() + ":" + volume);
|
||||
this.save();
|
||||
}
|
||||
public void set(Sound value, float volume) {
|
||||
getConfiguration().set(this.configSection, value.name() + ":" + volume);
|
||||
this.save();
|
||||
}
|
||||
|
||||
public void set(Sound value, float volume, float pitch) {
|
||||
getConfiguration().set(this.configSection, value.name() + ":" + volume + ":" + pitch);
|
||||
this.save();
|
||||
}
|
||||
public void set(Sound value, float volume, float pitch) {
|
||||
getConfiguration().set(this.configSection, value.name() + ":" + volume + ":" + pitch);
|
||||
this.save();
|
||||
}
|
||||
|
||||
public void play(Player player) {
|
||||
Sound finalSound = defaultValue;
|
||||
float pitch = 1;
|
||||
float volume = 1;
|
||||
String soundString = getConfiguration().getString(this.configSection);
|
||||
if (soundString != null) {
|
||||
String[] args = soundString.contains(":") ? soundString.split(":") : new String[]{soundString};
|
||||
try {
|
||||
if (args.length >= 1) finalSound = Sound.valueOf(args[0]);
|
||||
if (args.length >= 2) volume = Float.parseFloat(args[1]);
|
||||
if (args.length >= 3) volume = Float.parseFloat(args[2]);
|
||||
} catch (Exception exception) {
|
||||
Main.log("声音 " + this.configSection + " 配置错误,不存在 " + soundString + " ,请检查。");
|
||||
}
|
||||
}
|
||||
if (finalSound != null) {
|
||||
player.playSound(player.getLocation(), finalSound, volume, pitch);
|
||||
}
|
||||
public void play(Player player) {
|
||||
Sound finalSound = defaultValue;
|
||||
float pitch = 1;
|
||||
float volume = 1;
|
||||
String soundString = getConfiguration().getString(this.configSection);
|
||||
if (soundString != null) {
|
||||
String[] args = soundString.contains(":") ? soundString.split(":") : new String[]{soundString};
|
||||
try {
|
||||
if (args.length >= 1) finalSound = Sound.valueOf(args[0]);
|
||||
if (args.length >= 2) volume = Float.parseFloat(args[1]);
|
||||
if (args.length >= 3) volume = Float.parseFloat(args[2]);
|
||||
} catch (Exception exception) {
|
||||
Main.error("声音 " + this.configSection + " 配置错误,不存在 " + soundString + " ,请检查。");
|
||||
Main.error("There's no sound matches in " + this.configSection + " , please check the configuration");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
if (finalSound != null) {
|
||||
player.playSound(player.getLocation(), finalSound, volume, pitch);
|
||||
}
|
||||
|
||||
public void save() {
|
||||
this.source.save();
|
||||
}
|
||||
}
|
||||
|
||||
public void save() {
|
||||
this.source.save();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,8 +32,13 @@ public class ConfigValue<V> {
|
||||
}
|
||||
|
||||
public V get() {
|
||||
Object val = getConfiguration().get(this.configSection, this.defaultValue);
|
||||
return this.clazz.isInstance(val) ? this.clazz.cast(val) : this.defaultValue;
|
||||
if (getConfiguration().contains(this.configSection)) {
|
||||
Object val = getConfiguration().get(this.configSection, this.defaultValue);
|
||||
return this.clazz.isInstance(val) ? this.clazz.cast(val) : this.defaultValue;
|
||||
} else {
|
||||
// 如果没有默认值,就把配置写进去,便于配置
|
||||
return setDefault();
|
||||
}
|
||||
}
|
||||
|
||||
public void set(V value) {
|
||||
@@ -45,4 +50,9 @@ public class ConfigValue<V> {
|
||||
this.source.save();
|
||||
}
|
||||
|
||||
public V setDefault() {
|
||||
set(this.defaultValue);
|
||||
return this.defaultValue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -10,23 +10,23 @@ import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
|
||||
public class ChatListener implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onChat(AsyncPlayerChatEvent event) {
|
||||
if (!PrefixConfig.Functions.Chat.ENABLE.get()) return;
|
||||
String format = PrefixConfig.Functions.Chat.FORMAT.get();
|
||||
if (format == null || format.length() < 1) return;
|
||||
@EventHandler
|
||||
public void onChat(AsyncPlayerChatEvent event) {
|
||||
if (!PrefixConfig.Functions.Chat.ENABLE.get()) return;
|
||||
String format = PrefixConfig.Functions.Chat.FORMAT.get();
|
||||
if (format == null || format.length() < 1) return;
|
||||
|
||||
if (!MessageUtil.hasPlaceholderAPI()) return;
|
||||
if (!MessageUtil.hasPlaceholderAPI()) return;
|
||||
|
||||
try {
|
||||
event.setFormat(PlaceholderAPI.setPlaceholders(event.getPlayer(), format));
|
||||
} catch (Exception exception) {
|
||||
Main.log("Please check the chat configuration.");
|
||||
Main.log("请检查配置文件中聊天相关是否配置正确。");
|
||||
exception.printStackTrace();
|
||||
}
|
||||
try {
|
||||
event.setFormat(PlaceholderAPI.setPlaceholders(event.getPlayer(), format));
|
||||
} catch (Exception exception) {
|
||||
Main.error("请检查配置文件中聊天相关是否配置正确。");
|
||||
Main.error("Please check the chat configuration.");
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package cc.carm.plugin.userprefix.manager;
|
||||
|
||||
import cc.carm.plugin.userprefix.Main;
|
||||
import cc.carm.plugin.userprefix.configuration.PrefixConfig;
|
||||
import cc.carm.plugin.userprefix.model.ConfiguredPrefix;
|
||||
import cc.carm.plugin.userprefix.util.ItemStackFactory;
|
||||
import org.bukkit.Material;
|
||||
@@ -20,135 +21,150 @@ import java.util.stream.Collectors;
|
||||
|
||||
public class PrefixManager {
|
||||
|
||||
public static ConfiguredPrefix defaultPrefix;
|
||||
public static HashMap<String, ConfiguredPrefix> prefixes = new HashMap<>();
|
||||
public static ConfiguredPrefix defaultPrefix;
|
||||
public static HashMap<String, ConfiguredPrefix> prefixes = new HashMap<>();
|
||||
|
||||
private static final String FOLDER_NAME = "prefixes";
|
||||
private static final String FOLDER_NAME = "prefixes";
|
||||
|
||||
public static void init() {
|
||||
loadPrefixes();
|
||||
Main.log("共加载了 " + prefixes.size() + " 个前缀。");
|
||||
}
|
||||
public static void init() {
|
||||
loadPrefixes();
|
||||
Main.log("共加载了 " + prefixes.size() + " 个前缀。");
|
||||
}
|
||||
|
||||
public static void loadPrefixes() {
|
||||
loadDefaultPrefix();
|
||||
loadConfiguredPrefixes();
|
||||
}
|
||||
public static void loadPrefixes() {
|
||||
loadDefaultPrefix();
|
||||
loadConfiguredPrefixes();
|
||||
}
|
||||
|
||||
public static void loadConfiguredPrefixes() {
|
||||
public static void loadConfiguredPrefixes() {
|
||||
|
||||
File prefixDataFolder = new File(Main.getInstance().getDataFolder() + File.separator + FOLDER_NAME);
|
||||
if (!prefixDataFolder.isDirectory() || !prefixDataFolder.exists()) {
|
||||
prefixDataFolder.mkdir();
|
||||
}
|
||||
File prefixDataFolder = getStorageFolder();
|
||||
if (!prefixDataFolder.isDirectory() || !prefixDataFolder.exists()) {
|
||||
prefixDataFolder.mkdir();
|
||||
}
|
||||
|
||||
String[] filesList = prefixDataFolder.list();
|
||||
if (filesList == null || filesList.length < 1) {
|
||||
Main.log("配置文件中暂无任何前缀配置,请检查。");
|
||||
Main.log("There's no configured prefix.");
|
||||
return;
|
||||
}
|
||||
List<File> files = Arrays.stream(filesList)
|
||||
.map(s -> new File(prefixDataFolder, s))
|
||||
.filter(File::isFile)
|
||||
.collect(Collectors.toList());
|
||||
String[] filesList = prefixDataFolder.list();
|
||||
if (filesList == null || filesList.length < 1) {
|
||||
Main.error("配置文件夹中暂无任何前缀配置问,请检查。");
|
||||
Main.error("There's no configured prefix.");
|
||||
Main.error("Path: " + prefixDataFolder.getAbsolutePath());
|
||||
return;
|
||||
}
|
||||
|
||||
HashMap<String, ConfiguredPrefix> dataPrefixes = new HashMap<>();
|
||||
List<File> files = Arrays.stream(filesList)
|
||||
.map(s -> new File(prefixDataFolder, s))
|
||||
.filter(File::isFile)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (files.size() > 0) {
|
||||
for (File file : files) {
|
||||
try {
|
||||
ConfiguredPrefix prefix = new ConfiguredPrefix(file);
|
||||
Main.log("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName());
|
||||
dataPrefixes.put(prefix.getIdentifier(), prefix);
|
||||
} catch (Exception ex) {
|
||||
Main.log("Error occurred when loading prefix #" + file.getAbsolutePath() + " !");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
HashMap<String, ConfiguredPrefix> dataPrefixes = new HashMap<>();
|
||||
|
||||
PrefixManager.prefixes.clear();
|
||||
PrefixManager.prefixes = dataPrefixes;
|
||||
}
|
||||
if (files.size() > 0) {
|
||||
for (File file : files) {
|
||||
try {
|
||||
ConfiguredPrefix prefix = new ConfiguredPrefix(file);
|
||||
Main.log("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName());
|
||||
Main.log("Successfully loaded " + prefix.getIdentifier() + " : " + prefix.getName());
|
||||
dataPrefixes.put(prefix.getIdentifier(), prefix);
|
||||
} catch (Exception ex) {
|
||||
Main.error("在加载前缀 " + file.getAbsolutePath() + " 时出错,请检查配置!");
|
||||
Main.error("Error occurred when loading prefix #" + file.getAbsolutePath() + " !");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void loadDefaultPrefix() {
|
||||
PrefixManager.defaultPrefix = null;
|
||||
ConfigurationSection defaultPrefixSection = ConfigManager.getPluginConfig().getConfig().getConfigurationSection("defaultPrefix");
|
||||
if (defaultPrefixSection != null) {
|
||||
try {
|
||||
String name = defaultPrefixSection.getString("name", "默认前缀");
|
||||
String content = defaultPrefixSection.getString("content", "&r");
|
||||
ItemStack itemNotUsing = defaultPrefixSection.getItemStack(
|
||||
"itemNotUsing",
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a➥ 点击切换到该前缀")
|
||||
.toItemStack()
|
||||
);
|
||||
ItemStack itemUsing = defaultPrefixSection.getItemStack("itemUsing",
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a✔ 您正在使用该前缀")
|
||||
.addEnchant(Enchantment.DURABILITY, 1, false)
|
||||
.addFlag(ItemFlag.HIDE_ENCHANTS)
|
||||
.toItemStack()
|
||||
);
|
||||
PrefixManager.defaultPrefix = new ConfiguredPrefix("default", name, content, 0, null, itemNotUsing, null, itemUsing);
|
||||
} catch (Exception ex) {
|
||||
Main.log("在加载默认前缀时出错,请检查配置!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
PrefixManager.defaultPrefix = new ConfiguredPrefix("default", "默认前缀", "&r", 0, null,
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a➥ 点击切换到该前缀")
|
||||
.toItemStack(),
|
||||
null,
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a✔ 您正在使用该前缀")
|
||||
.addEnchant(Enchantment.DURABILITY, 1, false)
|
||||
.addFlag(ItemFlag.HIDE_ENCHANTS)
|
||||
.toItemStack()
|
||||
);
|
||||
}
|
||||
PrefixManager.prefixes.clear();
|
||||
PrefixManager.prefixes = dataPrefixes;
|
||||
}
|
||||
|
||||
Main.log("完成默认前缀加载 " + defaultPrefix.getName());
|
||||
}
|
||||
public static void loadDefaultPrefix() {
|
||||
PrefixManager.defaultPrefix = null;
|
||||
ConfigurationSection defaultPrefixSection = ConfigManager.getPluginConfig()
|
||||
.getConfig().getConfigurationSection("defaultPrefix");
|
||||
if (defaultPrefixSection != null) {
|
||||
try {
|
||||
String name = defaultPrefixSection.getString("name", "默认前缀");
|
||||
String content = defaultPrefixSection.getString("content", "&r");
|
||||
ItemStack itemNotUsing = defaultPrefixSection.getItemStack(
|
||||
"itemNotUsing",
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a➥ 点击切换到该前缀")
|
||||
.toItemStack()
|
||||
);
|
||||
ItemStack itemUsing = defaultPrefixSection.getItemStack("itemUsing",
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a✔ 您正在使用该前缀")
|
||||
.addEnchant(Enchantment.DURABILITY, 1, false)
|
||||
.addFlag(ItemFlag.HIDE_ENCHANTS)
|
||||
.toItemStack()
|
||||
);
|
||||
PrefixManager.defaultPrefix = new ConfiguredPrefix("default", name, content, 0, null, itemNotUsing, null, itemUsing);
|
||||
} catch (Exception ex) {
|
||||
Main.error("在加载默认前缀时出错,请检查配置!");
|
||||
Main.error("Error occurred when loading default prefix, please check the configuration.");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
PrefixManager.defaultPrefix = new ConfiguredPrefix("default", "默认前缀", "&r", 0, null,
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a➥ 点击切换到该前缀")
|
||||
.toItemStack(),
|
||||
null,
|
||||
new ItemStackFactory(Material.NAME_TAG)
|
||||
.setDisplayName("&f默认前缀")
|
||||
.addLore(" ")
|
||||
.addLore("§a✔ 您正在使用该前缀")
|
||||
.addEnchant(Enchantment.DURABILITY, 1, false)
|
||||
.addFlag(ItemFlag.HIDE_ENCHANTS)
|
||||
.toItemStack()
|
||||
);
|
||||
}
|
||||
|
||||
public static List<ConfiguredPrefix> getVisiblePrefix() {
|
||||
return PrefixManager.getPrefixes().values().stream()
|
||||
.filter(ConfiguredPrefix::isVisibleNoPermission)
|
||||
.sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
Main.log("完成默认前缀加载 " + defaultPrefix.getName());
|
||||
Main.log("Successfully loaded default prefix " + defaultPrefix.getName());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static ConfiguredPrefix getDefaultPrefix() {
|
||||
return defaultPrefix;
|
||||
}
|
||||
public static List<ConfiguredPrefix> getVisiblePrefix() {
|
||||
return PrefixManager.getPrefixes().values().stream()
|
||||
.filter(ConfiguredPrefix::isVisibleNoPermission)
|
||||
.sorted(Comparator.comparingInt(ConfiguredPrefix::getWeight))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static HashMap<String, ConfiguredPrefix> getPrefixes() {
|
||||
return prefixes;
|
||||
}
|
||||
@NotNull
|
||||
public static ConfiguredPrefix getDefaultPrefix() {
|
||||
return defaultPrefix;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static ConfiguredPrefix getPrefix(String identifier) {
|
||||
if (identifier == null) {
|
||||
return null;
|
||||
} else if (identifier.equalsIgnoreCase("default")) {
|
||||
return getDefaultPrefix();
|
||||
} else {
|
||||
return getPrefixes().get(identifier);
|
||||
}
|
||||
}
|
||||
@NotNull
|
||||
public static HashMap<String, ConfiguredPrefix> getPrefixes() {
|
||||
return prefixes;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static ConfiguredPrefix getPrefix(String identifier) {
|
||||
if (identifier == null) {
|
||||
return null;
|
||||
} else if (identifier.equalsIgnoreCase("default")) {
|
||||
return getDefaultPrefix();
|
||||
} else {
|
||||
return getPrefixes().get(identifier);
|
||||
}
|
||||
}
|
||||
|
||||
private static File getStorageFolder() {
|
||||
if (PrefixConfig.CustomStorage.ENABLE.get()) {
|
||||
return new File(PrefixConfig.CustomStorage.PATH.get());
|
||||
} else {
|
||||
return new File(Main.getInstance().getDataFolder() + File.separator + FOLDER_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -2,122 +2,158 @@ package cc.carm.plugin.userprefix.model;
|
||||
|
||||
import cc.carm.plugin.userprefix.util.ColorParser;
|
||||
import cc.carm.plugin.userprefix.util.ItemStackFactory;
|
||||
import cc.carm.plugin.userprefix.util.MessageUtil;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
public class ConfiguredPrefix {
|
||||
|
||||
@Nullable
|
||||
private File dataFile;
|
||||
@Nullable
|
||||
private FileConfiguration configuration;
|
||||
@Nullable
|
||||
private File dataFile;
|
||||
@Nullable
|
||||
private FileConfiguration configuration;
|
||||
|
||||
String identifier;
|
||||
String identifier;
|
||||
|
||||
String name;
|
||||
String content;
|
||||
String name;
|
||||
String content;
|
||||
|
||||
int weight;
|
||||
int weight;
|
||||
|
||||
String permission;
|
||||
String permission;
|
||||
|
||||
ItemStack itemHasPermission;
|
||||
ItemStack itemNoPermission;
|
||||
ItemStack itemWhenUsing;
|
||||
ItemStack itemHasPermission;
|
||||
ItemStack itemNoPermission;
|
||||
ItemStack itemWhenUsing;
|
||||
|
||||
|
||||
public ConfiguredPrefix(@NotNull File dataFile) {
|
||||
this.dataFile = dataFile;
|
||||
this.configuration = YamlConfiguration.loadConfiguration(dataFile);
|
||||
if (getConfiguration() != null) {
|
||||
this.identifier = getConfiguration().getString("identifier", "ERROR");
|
||||
this.name = getConfiguration().getString("name", "ERROR");
|
||||
this.content = getConfiguration().getString("content", "&r");
|
||||
this.permission = getConfiguration().getString("permission");
|
||||
this.weight = getConfiguration().getInt("weight", 1);
|
||||
public ConfiguredPrefix(@NotNull File dataFile) {
|
||||
this.dataFile = dataFile;
|
||||
this.configuration = YamlConfiguration.loadConfiguration(dataFile);
|
||||
if (getConfiguration() != null) {
|
||||
this.identifier = getConfiguration().getString("identifier", "ERROR");
|
||||
this.name = getConfiguration().getString("name", "ERROR");
|
||||
this.content = getConfiguration().getString("content", "&r");
|
||||
this.permission = getConfiguration().getString("permission");
|
||||
this.weight = getConfiguration().getInt("weight", 1);
|
||||
|
||||
this.itemHasPermission = (ItemStack) getConfiguration().get("itemHasPermission",
|
||||
new ItemStackFactory(Material.STONE).setDisplayName(name).addLore(" ").addLore("§a➥ 点击切换到该前缀").toItemStack()
|
||||
);
|
||||
this.itemNoPermission = (ItemStack) getConfiguration().get("itemNoPermission", itemHasPermission);
|
||||
this.itemWhenUsing = (ItemStack) getConfiguration().get("itemUsing", itemHasPermission);
|
||||
}
|
||||
}
|
||||
this.itemHasPermission = (ItemStack) getConfiguration().get("itemHasPermission",
|
||||
new ItemStackFactory(Material.STONE).setDisplayName(name).addLore(" ").addLore("§a➥ 点击切换到该前缀").toItemStack()
|
||||
);
|
||||
this.itemNoPermission = (ItemStack) getConfiguration().get("itemNoPermission", itemHasPermission);
|
||||
this.itemWhenUsing = (ItemStack) getConfiguration().get("itemUsing", itemHasPermission);
|
||||
}
|
||||
}
|
||||
|
||||
public ConfiguredPrefix(@NotNull String identifier,
|
||||
@NotNull String name,
|
||||
@NotNull String content,
|
||||
int weight, @Nullable String permission,
|
||||
@NotNull ItemStack itemHasPermission,
|
||||
@Nullable ItemStack itemNoPermission,
|
||||
@Nullable ItemStack itemWhenUsing) {
|
||||
this.identifier = identifier;
|
||||
this.name = name;
|
||||
this.content = content;
|
||||
this.weight = weight;
|
||||
this.permission = permission;
|
||||
this.itemHasPermission = itemHasPermission;
|
||||
this.itemNoPermission = itemNoPermission;
|
||||
this.itemWhenUsing = itemWhenUsing;
|
||||
}
|
||||
public ConfiguredPrefix(@NotNull String identifier,
|
||||
@NotNull String name,
|
||||
@NotNull String content,
|
||||
int weight, @Nullable String permission,
|
||||
@NotNull ItemStack itemHasPermission,
|
||||
@Nullable ItemStack itemNoPermission,
|
||||
@Nullable ItemStack itemWhenUsing) {
|
||||
this.identifier = identifier;
|
||||
this.name = name;
|
||||
this.content = content;
|
||||
this.weight = weight;
|
||||
this.permission = permission;
|
||||
this.itemHasPermission = itemHasPermission;
|
||||
this.itemNoPermission = itemNoPermission;
|
||||
this.itemWhenUsing = itemWhenUsing;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public FileConfiguration getConfiguration() {
|
||||
return configuration;
|
||||
}
|
||||
@Nullable
|
||||
public FileConfiguration getConfiguration() {
|
||||
return configuration;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
@NotNull
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@NotNull
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getContent() {
|
||||
return ColorParser.parse(content);
|
||||
}
|
||||
@NotNull
|
||||
public String getContent() {
|
||||
return ColorParser.parse(content);
|
||||
}
|
||||
|
||||
public int getWeight() {
|
||||
return weight;
|
||||
}
|
||||
public int getWeight() {
|
||||
return weight;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public String getPermission() {
|
||||
return permission;
|
||||
}
|
||||
@Nullable
|
||||
public String getPermission() {
|
||||
return permission;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public ItemStack getItemHasPermission() {
|
||||
return itemHasPermission;
|
||||
}
|
||||
@NotNull
|
||||
public ItemStack getItemHasPermission(@Nullable Player player) {
|
||||
return parseItemStackText(this.itemHasPermission, player);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ItemStack getItemNoPermission() {
|
||||
return itemNoPermission;
|
||||
}
|
||||
@NotNull
|
||||
public ItemStack getItemHasPermission() {
|
||||
return getItemHasPermission(null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ItemStack getItemWhenUsing() {
|
||||
return itemWhenUsing;
|
||||
}
|
||||
@Nullable
|
||||
public ItemStack getItemNoPermission(@Nullable Player player) {
|
||||
return parseItemStackText(itemNoPermission, player);
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return getPermission() == null;
|
||||
}
|
||||
@Nullable
|
||||
public ItemStack getItemNoPermission() {
|
||||
return getItemNoPermission(null);
|
||||
}
|
||||
|
||||
public boolean isVisibleNoPermission() {
|
||||
return this.itemNoPermission != null;
|
||||
}
|
||||
@Nullable
|
||||
public ItemStack getItemWhenUsing(@Nullable Player player) {
|
||||
return parseItemStackText(itemWhenUsing, player);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public ItemStack getItemWhenUsing() {
|
||||
return getItemWhenUsing(null);
|
||||
}
|
||||
|
||||
public boolean isPublic() {
|
||||
return getPermission() == null;
|
||||
}
|
||||
|
||||
public boolean isVisibleNoPermission() {
|
||||
return this.itemNoPermission != null;
|
||||
}
|
||||
|
||||
|
||||
@NotNull
|
||||
private static ItemStack parseItemStackText(@NotNull ItemStack source, @Nullable Player player) {
|
||||
if (player == null) return source;
|
||||
ItemMeta meta = source.getItemMeta();
|
||||
String displayName = null;
|
||||
List<String> lore = null;
|
||||
if (meta != null) {
|
||||
if (meta.hasDisplayName()) displayName = meta.getDisplayName();
|
||||
if (meta.hasLore()) lore = meta.getLore();
|
||||
}
|
||||
|
||||
ItemStackFactory factory = new ItemStackFactory(source);
|
||||
if (displayName != null) factory.setDisplayName(MessageUtil.setPlaceholders(player, displayName));
|
||||
if (lore != null) factory.setLore(MessageUtil.setPlaceholders(player, lore));
|
||||
|
||||
return factory.toItemStack();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,9 +44,9 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
||||
|
||||
for (ConfiguredPrefix prefix : prefixList) {
|
||||
if (prefix.getIdentifier().equals(usingPrefix.getIdentifier())) {
|
||||
addItem(new GUIItem(prefix.getItemWhenUsing() != null ? prefix.getItemWhenUsing() : prefix.getItemHasPermission()));
|
||||
addItem(new GUIItem(prefix.getItemWhenUsing(player) != null ? prefix.getItemWhenUsing(player) : prefix.getItemHasPermission(player)));
|
||||
} else if (UserManager.isPrefixUsable(player, prefix)) {
|
||||
addItem(new GUIItem(prefix.getItemHasPermission()) {
|
||||
addItem(new GUIItem(prefix.getItemHasPermission(player)) {
|
||||
@Override
|
||||
public void onClick(ClickType type) {
|
||||
//再次检查,防止打开GUI后、选择前的时间段内权限消失
|
||||
@@ -63,7 +63,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
||||
}
|
||||
});
|
||||
} else {
|
||||
addItem(new GUIItem(prefix.getItemNoPermission()));
|
||||
addItem(new GUIItem(prefix.getItemNoPermission(player)));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,71 +4,99 @@ import me.clip.placeholderapi.PlaceholderAPI;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class MessageUtil {
|
||||
|
||||
public static boolean hasPlaceholderAPI() {
|
||||
return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
|
||||
}
|
||||
public static boolean hasPlaceholderAPI() {
|
||||
return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
|
||||
}
|
||||
|
||||
public static void send(CommandSender sender, List<String> messages) {
|
||||
for (String s : messages) {
|
||||
sender.sendMessage(ColorParser.parse(s));
|
||||
}
|
||||
}
|
||||
public static void send(@Nullable CommandSender sender, List<String> messages) {
|
||||
if (messages == null || messages.isEmpty() || sender == null) return;
|
||||
for (String s : messages) {
|
||||
sender.sendMessage(ColorParser.parse(s));
|
||||
}
|
||||
}
|
||||
|
||||
public static void send(CommandSender sender, String... messages) {
|
||||
send(sender, Arrays.asList(messages));
|
||||
}
|
||||
public static void send(@Nullable CommandSender sender, String... messages) {
|
||||
send(sender, Arrays.asList(messages));
|
||||
}
|
||||
|
||||
public static void sendWithPlaceholders(CommandSender sender, String... messages) {
|
||||
sendWithPlaceholders(sender, Arrays.asList(messages));
|
||||
}
|
||||
public static void sendWithPlaceholders(CommandSender sender, String... messages) {
|
||||
sendWithPlaceholders(sender, Arrays.asList(messages));
|
||||
}
|
||||
|
||||
public static void sendWithPlaceholders(CommandSender sender, List<String> messages) {
|
||||
if (messages == null || messages.isEmpty()) return;
|
||||
if (hasPlaceholderAPI() && sender instanceof Player) {
|
||||
send(sender, PlaceholderAPI.setPlaceholders((Player) sender, messages));
|
||||
} else {
|
||||
send(sender, messages);
|
||||
}
|
||||
}
|
||||
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages) {
|
||||
if (messages == null || messages.isEmpty() || sender == null) return;
|
||||
send(sender, setPlaceholders(sender, messages));
|
||||
}
|
||||
|
||||
public static void sendWithPlaceholders(CommandSender sender, List<String> messages, String param, Object value) {
|
||||
sendWithPlaceholders(sender, messages, new String[]{param}, new Object[]{value});
|
||||
}
|
||||
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String param, Object value) {
|
||||
sendWithPlaceholders(sender, messages, new String[]{param}, new Object[]{value});
|
||||
}
|
||||
|
||||
public static void sendWithPlaceholders(CommandSender sender, List<String> messages, String[] params, Object[] values) {
|
||||
sendWithPlaceholders(sender, setCustomParams(messages, params, values));
|
||||
}
|
||||
public static void sendWithPlaceholders(@Nullable CommandSender sender, List<String> messages, String[] params, Object[] values) {
|
||||
sendWithPlaceholders(sender, setCustomParams(messages, params, values));
|
||||
}
|
||||
|
||||
public static List<String> setCustomParams(List<String> messages, String param, Object value) {
|
||||
return setCustomParams(messages, new String[]{param}, new Object[]{value});
|
||||
}
|
||||
public static String setPlaceholders(@Nullable CommandSender sender, String message) {
|
||||
if (message == null) return null;
|
||||
|
||||
public static List<String> setCustomParams(List<String> messages, String[] params, Object[] values) {
|
||||
if (params.length != values.length) return messages;
|
||||
HashMap<String, Object> paramsMap = new HashMap<>();
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
paramsMap.put(params[i], values[i]);
|
||||
}
|
||||
return setCustomParams(messages, paramsMap);
|
||||
}
|
||||
message = ColorParser.parse(message);
|
||||
if (sender == null) return message;
|
||||
|
||||
if (hasPlaceholderAPI() && sender instanceof Player) {
|
||||
return PlaceholderAPI.setPlaceholders((Player) sender, message);
|
||||
} else {
|
||||
return message;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> setPlaceholders(@Nullable CommandSender sender, List<String> messages) {
|
||||
if (messages == null || messages.isEmpty()) return new ArrayList<>();
|
||||
messages = messages.stream().map(ColorParser::parse).collect(Collectors.toList());
|
||||
|
||||
if (sender == null) return messages;
|
||||
if (hasPlaceholderAPI() && sender instanceof Player) {
|
||||
return PlaceholderAPI.setPlaceholders((Player) sender, messages);
|
||||
} else {
|
||||
return messages;
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> setPlaceholders(@Nullable CommandSender sender, List<String> messages, String[] params, Object[] values) {
|
||||
return setPlaceholders(sender, setCustomParams(messages, params, values));
|
||||
}
|
||||
|
||||
public static List<String> setCustomParams(List<String> messages, String param, Object value) {
|
||||
return setCustomParams(messages, new String[]{param}, new Object[]{value});
|
||||
}
|
||||
|
||||
public static List<String> setCustomParams(List<String> messages, String[] params, Object[] values) {
|
||||
if (params.length != values.length) return messages;
|
||||
HashMap<String, Object> paramsMap = new HashMap<>();
|
||||
for (int i = 0; i < params.length; i++) {
|
||||
paramsMap.put(params[i], values[i]);
|
||||
}
|
||||
return setCustomParams(messages, paramsMap);
|
||||
}
|
||||
|
||||
|
||||
public static List<String> setCustomParams(List<String> messages, HashMap<String, Object> params) {
|
||||
List<String> list = new ArrayList<>();
|
||||
for (String message : messages) {
|
||||
String afterMessage = message;
|
||||
for (Map.Entry<String, Object> entry : params.entrySet()) {
|
||||
afterMessage = afterMessage.replace(entry.getKey(), entry.getValue().toString());
|
||||
}
|
||||
list.add(afterMessage);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
public static List<String> setCustomParams(List<String> messages, HashMap<String, Object> params) {
|
||||
List<String> list = new ArrayList<>();
|
||||
for (String message : messages) {
|
||||
String afterMessage = message;
|
||||
for (Map.Entry<String, Object> entry : params.entrySet()) {
|
||||
afterMessage = afterMessage.replace(entry.getKey(), entry.getValue().toString());
|
||||
}
|
||||
list.add(afterMessage);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,7 +1,20 @@
|
||||
version: ${project.version}
|
||||
version: ${project.version} #配置文件版本,若与插件版本不同请记得检查配置文件内容
|
||||
|
||||
debug: false
|
||||
|
||||
# 统计数据设定
|
||||
# 改选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。
|
||||
# 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。
|
||||
metrics: true
|
||||
|
||||
custom-storage:
|
||||
# 自定义存储位置
|
||||
# 默认存储位置为 “插件文件夹”/prefixes
|
||||
# 可以规定到远程文件夹中去寻找前缀相关的设定
|
||||
# 支持绝对文件路径,如 "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false # 是否启用
|
||||
path: "prefixes/" # 一定要指向一个文件夹!
|
||||
|
||||
functions:
|
||||
OnNamePrefix: true # 是否给头顶上添加前缀,该方法用到了头顶的那个计分板,如有冲突请关掉哦~
|
||||
autoUsePrefix: true # 自动前缀显示 当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个
|
||||
|
||||
@@ -2,6 +2,15 @@ version: ${project.version} # DO NOT EDIT IT
|
||||
|
||||
debug: false #DEBUG OUT PUT
|
||||
|
||||
metrics: true #Metrics stats (to help developer know the stats)
|
||||
|
||||
custom-storage:
|
||||
# Custom storage location
|
||||
# default location is "./prefixes"
|
||||
# Support absolute file path , such as "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false
|
||||
path: "prefixes/" # Must be a folder!
|
||||
|
||||
GUI:
|
||||
title: "&f&lMy Prefixes List" # Title of the GUI
|
||||
items:
|
||||
|
||||
+87
-13
@@ -67,13 +67,89 @@
|
||||
[hr]
|
||||
[size=4][b]基础配置文件 [/b][/size][color=#24292f][font=Tahoma][size=4](config.yml)[/size][/font][/color]
|
||||
[spoiler]
|
||||
[code] version: 1.0.0-SNAPSHOT # 配置文件版本,一般不会动。
|
||||
[code]
|
||||
version: ${project.version} #配置文件版本,若与插件版本不同请记得检查配置文件内容
|
||||
|
||||
debug: false #debug输出,开发者用的
|
||||
debug: false
|
||||
|
||||
custom-storage:
|
||||
# 自定义存储位置
|
||||
# 默认存储位置为 “插件文件夹”/prefixes
|
||||
# 可以规定到远程文件夹中去寻找前缀相关的设定
|
||||
# 支持绝对文件路径,如 "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false # 是否启用
|
||||
path: "prefixes/" # 一定要指向一个文件夹!
|
||||
|
||||
functions:
|
||||
OnNamePrefix: true # 是否给头顶上添加前缀,该方法用到了头顶的那个计分板,如有冲突请关掉哦~
|
||||
autoUsePrefix: true # 自动前缀显示 当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个[/code][/spoiler]
|
||||
autoUsePrefix: true # 自动前缀显示 当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个
|
||||
chat:
|
||||
# 聊天功能
|
||||
# - 我不推荐使用本插件的聊天功能,而是建议使用其他的聊天插件。
|
||||
# - 本插件仅仅提供了**最基本**的格式变量支持,不包含其他任何功能。
|
||||
# - 注意聊天格式需要遵守Bukkit原格式,即不得缺失 “%1$s” 和 “%2$s” 。
|
||||
# - 本插件的聊天功能不影响其他插件对聊天事件的操作。
|
||||
enable: false # 是否启用
|
||||
format: "<%UserPrefix_prefix%%1$s> %2$s" #聊天的格式,注意 “%1$s” 和 “%2$s” 不可缺少,分别代表 玩家名 与 消息内容 。
|
||||
|
||||
GUI:
|
||||
title: "&f&l我的前缀 &8| 列表"
|
||||
items:
|
||||
# 【必须】 GUI中可能存在的其他物品
|
||||
next-page: # 下一页物品,如果没有下一页则不显示
|
||||
==: org.bukkit.inventory.ItemStack
|
||||
type: ARROW
|
||||
meta:
|
||||
==: ItemMeta
|
||||
meta-type: UNSPECIFIC
|
||||
display-name: "§f下一页"
|
||||
lore:
|
||||
- ""
|
||||
- "§f右键可前往最后一页哦~"
|
||||
previous-page: # 上一页物品,如果没有上一页则不显示
|
||||
==: org.bukkit.inventory.ItemStack
|
||||
type: ARROW
|
||||
meta:
|
||||
==: ItemMeta
|
||||
meta-type: UNSPECIFIC
|
||||
display-name: "§f上一页"
|
||||
lore:
|
||||
- ""
|
||||
- "§f右键可前往第一页哦~"
|
||||
|
||||
Sounds: #相关的声音,注释掉则不播放声音 格式为 【声音名:音量:音调】 或 【声音名:音量】 或 【声音名】
|
||||
openGUI: "BLOCK_NOTE_BLOCK_PLING:1:1"
|
||||
guiClick: "UI_BUTTON_CLICK"
|
||||
prefixChange: "ENTITY_VILLAGER_YES"
|
||||
prefixExpired: "ENTITY_VILLAGER_NO"
|
||||
|
||||
# 默认前缀的配置
|
||||
# 默认前缀的权重为0哦
|
||||
defaultPrefix:
|
||||
name: "默认前缀"
|
||||
content: "&b"
|
||||
itemNotUsing:
|
||||
==: org.bukkit.inventory.ItemStack
|
||||
type: NAME_TAG
|
||||
meta:
|
||||
==: ItemMeta
|
||||
meta-type: UNSPECIFIC
|
||||
display-name: "§f默认玩家前缀 §f(点击切换)"
|
||||
lore:
|
||||
- ""
|
||||
- "§a➥ 点击切换到该前缀"
|
||||
itemUsing:
|
||||
==: org.bukkit.inventory.ItemStack
|
||||
type: NAME_TAG
|
||||
meta:
|
||||
==: ItemMeta
|
||||
meta-type: UNSPECIFIC
|
||||
display-name: "§f默认玩家前缀"
|
||||
lore:
|
||||
- ""
|
||||
- "§a✔ 您正在使用该前缀"
|
||||
[/code]
|
||||
[/spoiler]
|
||||
|
||||
[b][size=4][backcolor=transparent]消息配置文件[/backcolor][/size] [/b][size=4](messages.yml)[/size]
|
||||
[spoiler][code]selected:
|
||||
@@ -96,7 +172,7 @@ list-value:
|
||||
- "&8- &7显示名 &r%(name) &7权限 &r%(permission)"
|
||||
- "&8- &7内容示例&r %(content) %(sender_name)"[/code][/spoiler]
|
||||
|
||||
[size=4][backcolor=transparent][b]前缀配置文件[/b][/backcolor] (prefixes/*.yml)[/size]
|
||||
[size=4][backcolor=transparent][b]前缀配置文件[/b][/backcolor] (prefixes/*.yml) [自2.1.7可自定义目录][/size]
|
||||
[align=left][font=-apple-system, BlinkMacSystemFont, "][size=3][color=#000000]所有前缀均为单独的配置文件,存放于 [u]插件配置目录/prefixes[/u] 下,便于管理。[/color][/size][/font][/align][align=left][font=-apple-system, BlinkMacSystemFont, "][size=3][color=#000000]文件名理论上可以随便取,推荐使用英文,部分符号可能会影响正常读取,请避免使用。[/color][/size][/font][/align][align=left][spoiler][/align][code]# 唯一标识 [必须]
|
||||
# 将用于记录玩家所选的前缀,以及用于数据的缓存。
|
||||
# 必须 必须 必须 保持唯一!
|
||||
@@ -177,11 +253,14 @@ itemNoPermission:
|
||||
|
||||
[size=5][b]下载地址[/b][/size]
|
||||
[hr]
|
||||
[size=3][b]最新版本 2.1.0 [/b][/size][attach]1909962[/attach][quote][b][size=3]更新内容[/size][/b]
|
||||
[size=3][b]最新版本 [/b][/size][size=3][b]2.1.7 [/b][/size][attach]1919669[/attach][quote][b][size=3]更新内容[/size][/b]
|
||||
1. 提供自定义配置文件存储位置的功能,便于多子服共享配置。(custome-storage)
|
||||
2. 添加控制台打开玩家菜单时的反馈(来自 @Yuri南城 )。
|
||||
3. 支持由控制台为其他玩家打开GUI。
|
||||
4. 若出现新配置文件条目,将自动写入默认值,便于配置。[/quote][spoiler][size=3][b]2.1.2 [/b][/size][attach]1912028[/attach][quote][b][size=3]更新内容[/size][/b]
|
||||
1. 修复不开启插件自带的头顶前缀功能时出现的报错。[/quote]
|
||||
[size=3][b]2.1.0 [/b][/size][attach]1909962[/attach][quote][b][size=3]更新内容[/size][/b]
|
||||
1. 添加聊天相关设定,支持聊天前缀。(但不推荐使用哦~)[/quote]
|
||||
|
||||
[spoiler]
|
||||
|
||||
[size=3][b] 2.0.0 [/b][/size][attach]1905700[/attach]
|
||||
[quote][b][size=3]更新内容[/size][/b]
|
||||
1. 修复低版本可能无法读取物品的bug。
|
||||
@@ -233,8 +312,3 @@ itemNoPermission:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+8
-1
@@ -90,10 +90,17 @@ After installed the [URL='https://github.com/PlaceholderAPI/PlaceholderAPI']Plac
|
||||
Notice: The default configuration is based on Chinese. You can find the English Version [URL='https://github.com/CarmJos/UserPrefix/blob/master/src/main/resources/en_US/config.yml']here[/URL].
|
||||
|
||||
[code=YAML]
|
||||
version: ${project.version} # DO NOT EDIT IT
|
||||
version: ${project.version}
|
||||
|
||||
debug: false #DEBUG OUT PUT
|
||||
|
||||
custom-storage:
|
||||
# Custom storage location
|
||||
# default location is "./prefixes"
|
||||
# Support absolute file path , such as "/etc/minecraft/configurations/prefixes/"
|
||||
enable: false
|
||||
path: "prefixes/" # Must be a folder!
|
||||
|
||||
GUI:
|
||||
title: "&f&lMy Prefixes List" # Title of the GUI
|
||||
items:
|
||||
|
||||
Reference in New Issue
Block a user