From 3dd6398afaef16314af2aef5574456c3bf191c6a Mon Sep 17 00:00:00 2001 From: carm Date: Fri, 17 Sep 2021 18:53:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8B=B1=E6=96=87=E7=89=88?= =?UTF-8?q?=E4=BB=8B=E7=BB=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-en.md | 213 +++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 + img/logo 96x96.png | Bin 0 -> 15802 bytes 3 files changed, 215 insertions(+) create mode 100644 README-en.md create mode 100644 img/logo 96x96.png diff --git a/README-en.md b/README-en.md new file mode 100644 index 0000000..3c4b2d8 --- /dev/null +++ b/README-en.md @@ -0,0 +1,213 @@ +![BANNER](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/banner.png) + +# UserPrefix Plugin + +[![CodeFactor](https://www.codefactor.io/repository/github/carmjos/userprefix/badge?s=b76fec1f64726b5f19989aace6adb5f85fdab840)](https://www.codefactor.io/repository/github/carmjos/userprefix) +[![Java CI with Maven](https://github.com/CarmJos/UserPrefix/actions/workflows/maven.yml/badge.svg?branch=master)](https://github.com/CarmJos/UserPrefix/actions/workflows/maven.yml) +![](https://visitor-badge.glitch.me/badge?page_id=userprefix.readme) + +Lightweight, efficient, and real-time user prefix system. + +This plugin is implemented based on Spigot ,**Theoretically** support ALL MineCraft Versions. + +The development of this plugin is based on Chinese which purpose is to help Chinese developers learn Bukkit plugin +development. + +本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503) 上发布,欢迎中文用户来这里下载。 + +## Examples + +![example](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/using-example.png) + +## Dependencies + +- **[Necessary]** Plugin developed based on [Spigot-API](https://hub.spigotmc.org/stash/projects/SPIGOT) + and [BukkitAPI](http://bukkit.org/). +- **[Necessary]** Plugin data storage base on [LuckPerms](https://www.spigotmc.org/resources/luckperms.28140/). +- **[Recommend]** Placeholders based on [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) . + +For development dependencies, please see [Dependencies](https://github.com/CarmJos/UserPrefix/network/dependencies) . + +## Features + +- **Theoretically** support ALL MineCraft Versions. +- Reloading the configuration will automatically refresh the prefix of all players. +- Real-time judgment and feedback to the player when permissions are changed. +- Configurable sounds and messages. +- The prefix icon can be configured as "Selected", "Has Permission" and “No Permission”. + - Item configuration is natively configured through ItemStack, which supports all MC settings! +- TabList is automatically sorted according to the weight of the prefix (if there is a conflict, it can be turned off) +- The prefix display on the player name (can be turned off if there is a conflict) +- GUI with automatic sorting and page turning! +- Support PlaceholderAPI variables! +- Support Hex color! (Version 1.16 and above) `&(#Color)` + - Example: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)` + +## Notice + +### 1. Version support issues + +This plugin theoretically supports all versions. + +If the icon does not load, the sound cannot be played, etc., +please check whether the type of the item and sound in the configuration file exists in the current version. + +Take the SOUND as an example. +The sound that the villager said "OK" is "`VILLAGER_YES`" in the lower version, but it becomes "`ENTITY_VILLAGER_YES`" in the higher version. + +### 2. Scoreboard exception problem + +The display of the prefix on the head and the sorting of the TabList both use the scoreboard API. + +Please turn of the `functions.OnNamePrefix` in the configuration if there is a conflict. + +### 3. Item icon configuration problem + +Items are read through the ItemStack serialization method provided by Bukkit. For related configuration methods, please refer to [ItemStack Serialization](https://www.spigotmc.org/wiki/itemstack-serialization/). + +## Commands + +This plugin's Commands are based on Chinese! +**May support multi-language in the future.** + +```text +/UserPrefix or /prefix #Open prefix GUI +/UserPrefixAdmin # View Admin Command Help +/UserPrefixAdmin reload # Reload Config +/UserPrefixAdmin list # List all configured prefixes.~~~~ +``` + +## Placeholders (PlaceholderAPI) + +After installed the [PlaceholderAPI](https://github.com/PlaceholderAPI/PlaceholderAPI) , you can +type `/papi info UserPrefix` to see all the placeholders. + +```text +# %UserPrefix_prefix% +- Get the content of the current prefix +# %UserPrefix_weight% +- Get the weight of the current prefix. +# %UserPrefix_identifier% +- Get the identifier of the current prefix. +# %UserPrefix_name% +- Get the name of the current prefix. +# %UserPrefix_has_% +- Determine whether the player has a certain prefix(true/false) +``` + +## Sample configuration file + +```yaml +version: 1.0.0-SNAPSHOT # DO NOT EDIT IT + +debug: false #DEBUG OUT PUT + +functions: + # Whether to add a prefix to the top of the head, + # this method uses the scoreboard above the head, + # please turn it off if there is a conflict. + OnNamePrefix: true + # Automatic prefix select. + # When the player does not choose a prefix by himself, + # the prefix with the highest weight will be used automatically + autoUsePrefix: true + +messages: + selected: + - "&7You have selected the &f%(name) &7as current prefix." + expired: + - "&7Your prefix &f%(oldName) &7has expired," + - "&7Now the prefix is changed to &f%(newName) &7." + +Sounds: + # Format is [SOUND_NAME:Volume:Pitch] or [SOUND_NAME:Volume] or [SOUND_NAME] + openGUI: "BLOCK_NOTE_BLOCK_PLING:1:1" + guiClick: "UI_BUTTON_CLICK" + prefixChange: "ENTITY_VILLAGER_YES" + prefixExpired: "ENTITY_VILLAGER_NO" + +# The default prefix's weight is 0. +defaultPrefix: + name: "Default prefix" + content: "&b" + itemNotUsing: + ==: org.bukkit.inventory.ItemStack + type: NAME_TAG + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: "§fThe default prefix §f(Click to select)" + lore: + - "" + - "§a➥ Click to use" + itemUsing: + ==: org.bukkit.inventory.ItemStack + type: NAME_TAG + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: "§fThe default prefix" + lore: + - "" + - "§a✔ Selected" + +prefixes: + VIP: + name: "&b&lPro&b" # [Necessary] Name (Using in messages) + content: "§b§lPro §b" # [Necessary] What to display before the name + # [Necessary] Weight, used for sorting in the GUI + # (the larger is displayed at the back) and the automatic prefix display + weight: 1 + # [Necessary] If there is no permission for detection, everyone can use it, + # which means there is no need to configure "itemNoPermission" + # (because it is impossible to display items without permission at all) + permission: "yc.pro" + itemHasPermission: + # [Necessary] This Item will be displayed when player has permission + ==: org.bukkit.inventory.ItemStack + type: DIAMOND + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: "§b§lVIP Prefix" + lore: + - "" + - "§a➥ Click to use" + itemUsing: + # [Not Necessary] This Item will be displayed when the prefix is selected. + # If there is no such configuration, it will automatically display "itemHasPermission". + ==: org.bukkit.inventory.ItemStack + type: DIAMOND + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: "§b§lVIP Prefix" + enchants: + PROTECTION_ENVIRONMENTAL: 1 #Add an enchantment so it looks like it’s selected + lore: + - "" + - "§a✔ Selected" + itemNoPermission: + # [Not Necessary] If player doesn't have the permission,this item will be displayed. + # If this item is not configured, it will not be displayed in the GUI when the player does not have permission to use it. + ==: org.bukkit.inventory.ItemStack + type: INK_SACK + damage: 8 + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: "§b§lVIP §c(Buy it!)" + lore: + - "" + - "§e✯ Buy the VIP to use it!" +``` + +## Support and Donation + +This project is support by the [YourCraft(你的世界)](https://www.ycraft.cn) . +![TeamLogo](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/team-logo.png) + +## Open source agreement + +The source code of this project uses [GNU General Public License v3.0](https://opensource.org/licenses/GPL-3.0) License. + diff --git a/README.md b/README.md index 666cc6f..7266643 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ 本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503) 上发布。 +The English version of the introduction is [here](https://github.com/CarmJos/UserPrefix/blob/master/README-en.md). + ## 示例 ![example](https://raw.githubusercontent.com/CarmJos/UserPrefix/master/img/using-example.png) diff --git a/img/logo 96x96.png b/img/logo 96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..1e818b6fa2dd3e2c781adce35bfe752d39f6728d GIT binary patch literal 15802 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