Compare commits

1 Commits

Author SHA1 Message Date
Coldsmile_7
6452226151 feat: 实现 ProtocolLib 自定义标题 2026-04-15 03:07:25 +08:00
67 changed files with 15000 additions and 1383 deletions

View File

@@ -1,35 +0,0 @@
name: Release
on:
push:
tags:
- 'v*'
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Java
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: maven
- name: 构建插件
run: mvn clean package -B
- name: 创建发行版
uses: softprops/action-gh-release@v1
with:
files: target/essentialsc-*.jar
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

15
.gitignore vendored
View File

@@ -13,6 +13,18 @@
*.tar.gz *.tar.gz
*.rar *.rar
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
# Gradle # Gradle
.gradle/ .gradle/
build/ build/
@@ -56,8 +68,5 @@ Thumbs.db
# Test server (不要上传测试服务器文件) # Test server (不要上传测试服务器文件)
test-server/ test-server/
# Reference files (不要上传参考资料)
references/
# Plugin build output # Plugin build output
*.jar.asc *.jar.asc

View File

@@ -0,0 +1,20 @@
#
# 你可以在这里添加自定义的指令简写
# 你可以用各种变量, 比如 [playerName] 代表指令发送者的名字
# 你可以在语言文件里找到可用的变量
# 你也可以给指令添加延迟,格式如下
# delay! 5
# 这将会延迟执行下一个指令,时间是秒
# 对于简写的指令,如果你需要添加变量,你需要标注出变量的位置
# 例如: /cmi heal Zrips
# 可以被自定义简写成 /h zrips 但是简写指令应该为
# cmi heal $1
# 如果你需要添加不止一个变量, 你需要使用 $1- 数字代表着简写指令的位置
# 例如: cmi tppos $1-
# 如果玩家指令参数输入错误, 可在简写中添加问号 ?
# 例如: ca ?
# 如果玩家输错了指令/ca下面的参数比如 /ca wrongsub or /ca anotherwrong
# 该指令下面的正确指令会被执行,或者显示帮助信息

View File

@@ -0,0 +1,23 @@
<AutoPage>
&6玩家守则:
&61. &e不许作弊
&62. &e不许聊天刷屏
&63. &e不许发广告
&64. &e不许骂人
&65. &e不许欺凌其他玩家
&66. &e不许拥有已被封禁的物品
&67. &e不准向管理员索要OP或者物品
&68. &e尊重其他玩家
&69. &e遵守管理员制定的规则
&610. &e不许地域黑
&611. &e不许安装作弊mod
&612. &e不许发无意义聊天
&614. &e不许在脚下搭柱子升高
&613. &e不许在主城周围建筑
<NextPage>
&6管理员守则:
&61. 了解并践行自己的作为管理员的规则
&62. 不许给玩家多余的物品和方块
&63. 只出售合法的物品
&64. 只许用合法的物品和方块帮助玩家建筑
&65. 不许滥用权力

View File

@@ -0,0 +1,76 @@
# 玩家必须拥有相应权限才能使用相应礼包: cmi.kit.[礼包名]
# 比如 cmi.kit.newbie 将可以让玩家使用 newbie 礼包
# 可用变量: {USERNAME} {DISPLAYNAME} {WORLDNAME} {KITNAME} {RANDOMPLAYER}
# 你可以在游戏内使用 /cmi kiteditor 来编辑礼包
Newbie:
CommandName: Newbie
Description:
- '&e你可以获得一些有用的东西'
- '&e每过一段时间可以再次使用'
# 再次使用此礼包的时间
Delay: 36000
# 需花费金钱和经验
MoneyCost: 100
ExpCost: 30
Group: 'groupName'
Items:
'1':
v: 2730
type: STONE
amount: 70
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §3石头
lore:
- §2玩家 §3{USERNAME}
- §3玩家显示名 §2{DISPLAYNAME}
- §2礼包名 §3{KITNAME}
- §3世界名 §2{WORLDNAME}
- §3这是变量测试
enchants:
ARROW_DAMAGE: 3
THORNS: 5
'3':
v: 2730
type: OAK_PLANKS
amount: 30
Commands:
- 'asConsole! msg! [playerName] &e你获得了 &6{KITNAME} &e礼包'
Conditions:
- cmi.kit.get
- cmi.command.fly
Advanced:
Delay: 36000
Items:
'1':
v: 2730
type: STONE
Ad2:
CommandName: Ad
Weight: 2
Delay: 36060
Group: resources
Items:
'1':
v: 2730
type: OAK_PLANKS
amount: 10
Ad1:
CommandName: Ad
Weight: 1
Delay: 36000
Group: resources
Items:
'1':
v: 2730
type: STONE
amount: 10
Ad3:
Delay: 36001
Group: resources
Items:
'1':
v: 2730
type: DIRT
amount: 10

View File

@@ -0,0 +1,2 @@
# 这里列出的是你要禁止掉的附魔名称,你可以使用指令 /cmi disableenchant 来操作
List: []

View File

View File

View File

View File

View File

View File

View File

@@ -0,0 +1,248 @@
# 可在游戏中使用 /cmi setworth 直接设置某物品收购价格
worth:
ACACIA_LEAVES: '0.5'
ACACIA_LOG: '0.6'
OAK_SAPLING: '0.22'
ACACIA_STAIRS: '1.09'
ACTIVATOR_RAIL: '1.0'
POPPY: '0.2'
ANVIL: '17.25'
APPLE: '1.76'
ARROW: '0.1'
BAKED_POTATO: '0.92'
BEACON: '1120.66'
BEEF: '0.17'
OAK_LEAVES: '0.11'
OAK_LOG: '0.66'
BIRCH_STAIRS: '0.3'
WHITE_CARPET: '1.06'
WHITE_STAINED_GLASS: '0.59'
WHITE_STAINED_GLASS_PANE: '0.22'
WHITE_TERRACOTTA: '0.22'
BLAZE_POWDER: '0.15'
BLAZE_ROD: '0.22'
BONE: '0.22'
BOOK: '1.18'
BOOKSHELF: '5.11'
BOWL: '0.15'
BREAD: '0.36'
BREWING_STAND: '1.94'
BRICK: '1.05'
STONE_SLAB: '0.53'
BRICK_STAIRS: '5.59'
BROWN_MUSHROOM_BLOCK: '2.2'
BUCKET: '5.45'
CACTUS: '0.5'
CAKE: '56.64'
CARROT: '0.4'
CARROT_ON_A_STICK: '0.91'
CAULDRON: '5.71'
CHEST: '1.6'
CHEST_MINECART: '5.74'
CHICKEN: '0.17'
STONE_BRICKS: '0.91'
CLAY: '2.42'
CLAY_BALL: '0.55'
CLOCK: '12.71'
COAL: '1.17'
COAL_BLOCK: '4.36'
COAL_ORE: '1.1'
COBBLESTONE: '0.22'
COBBLESTONE_STAIRS: '0.36'
COBBLESTONE_WALL: '4.26'
COBWEB: '3.0'
COMPARATOR: '2.42'
COMPASS: '14.64'
COOKED_BEEF: '0.4'
COOKED_CHICKEN: '0.4'
COOKED_COD: '4.07'
COOKED_PORKCHOP: '0.8'
COOKIE: '0.36'
CRAFTING_TABLE: '0.8'
DANDELION: '0.2'
DARK_OAK_STAIRS: '1.09'
DAYLIGHT_DETECTOR: '2.63'
DETECTOR_RAIL: '1.0'
DIAMOND: '44.0'
DIAMOND_BLOCK: '435.6'
DIAMOND_HORSE_ARMOR: '100.0'
DIAMOND_ORE: '88.0'
DIRT: '0.11'
DISPENSER: '2.58'
DRAGON_EGG: '2750.0'
DROPPER: '1.69'
EGG: '1.1'
EMERALD: '4.4'
EMERALD_BLOCK: '20.56'
EMERALD_ORE: '10.0'
ENCHANTED_BOOK: '30.0'
ENCHANTED_BOOK>PROTECTION_ENVIRONMENTALx2: '10.000000000000002'
ENCHANTING_TABLE: '136.82'
ENDER_CHEST: '20.99'
ENDER_EYE: '1.27'
ENDER_PEARL: '0.55'
END_STONE: '0.55'
EXPERIENCE_BOTTLE: '1.8'
FEATHER: '0.22'
FERMENTED_SPIDER_EYE: '4.18'
FIREWORK_ROCKET: '0.1'
FIREWORK_STAR: '1.0'
FIRE_CHARGE: '1.39'
FISHING_ROD: '0.57'
FLINT: '0.22'
FLINT_AND_STEEL: '0.5'
FLOWER_POT: '3.45'
FURNACE: '1.94'
FURNACE_MINECART: '5.11'
GHAST_TEAR: '165.0'
GLASS: '0.48'
GLASS_BOTTLE: '1.0'
GLASS_PANE: '0.2'
GLISTERING_MELON_SLICE: '0.4'
GLOWSTONE: '1.94'
GLOWSTONE_DUST: '0.44'
GOLDEN_APPLE: '251.1'
GOLDEN_CARROT: '3.35'
GOLDEN_HORSE_ARMOR: '100.0'
GOLD_BLOCK: '28.31'
GOLD_INGOT: '2.86'
GOLD_NUGGET: '0.35'
GOLD_ORE: '2.2'
GRASS_BLOCK: '0.22'
GRAVEL: '0.11'
GUNPOWDER: '0.22'
HAY_BLOCK: '1.09'
HEAVY_WEIGHTED_PRESSURE_PLATE: '3.63'
HOPPER: '10.83'
HOPPER_MINECART: '21.9'
ICE: '1.43'
INK_SAC: '0.08'
IRON_BARS: '0.68'
IRON_BLOCK: '16.34'
IRON_DOOR: '3.63'
IRON_HORSE_ARMOR: '100.0'
IRON_INGOT: '1.65'
IRON_ORE: '1.1'
ITEM_FRAME: '1.24'
JACK_O_LANTERN: '1.98'
JUKEBOX: '40.0'
JUNGLE_STAIRS: '0.3'
LADDER: '0.26'
LAPIS_BLOCK: '1.09'
LAPIS_ORE: '2.2'
SUNFLOWER: '0.01'
LAVA_BUCKET: '7.7'
LEAD: '0.85'
LEATHER: '0.24'
PUFFERFISH: '3.3'
LEVER: '0.35'
LIGHT_WEIGHTED_PRESSURE_PLATE: '6.29'
LILY_PAD: '1.1'
MAGMA_CREAM: '0.63'
MAP: '18.55'
MELON: '0.01'
MELON_SEEDS: '0.22'
MILK_BUCKET: '1.0'
MOSSY_COBBLESTONE: '3.87'
MUSHROOM_STEW: '0.65'
MUSIC_DISC_11: '1.0'
MUSIC_DISC_13: '1.0'
MUSIC_DISC_BLOCKS: '1.0'
MUSIC_DISC_CAT: '1.0'
MUSIC_DISC_CHIRP: '1.0'
MUSIC_DISC_FAR: '1.0'
MUSIC_DISC_MALL: '1.0'
MUSIC_DISC_MELLOHI: '1.0'
MUSIC_DISC_STAL: '1.0'
MUSIC_DISC_STRAD: '1.0'
MUSIC_DISC_WAIT: '1.0'
MUSIC_DISC_WARD: '1.0'
MUTTON: '3.3'
MYCELIUM: '0.88'
NAME_TAG: '110.0'
NETHERRACK: '0.22'
NETHER_BRICK: '0.68'
NETHER_BRICK_FENCE: '2.95'
NETHER_BRICK_STAIRS: '1.24'
NETHER_QUARTZ_ORE: '0.88'
NETHER_STAR: '990.0'
NETHER_WART: '1.1'
NOTE_BLOCK: '1.72'
OAK_BOAT: '1.0'
OAK_BUTTON: '0.2'
OAK_DOOR: '0.4'
OAK_FENCE: '0.49'
OAK_FENCE_GATE: '0.84'
OAK_PRESSURE_PLATE: '0.4'
OAK_SLAB: '0.1'
OAK_STAIRS: '0.3'
OAK_TRAPDOOR: '0.6'
OBSIDIAN: '8.8'
PACKED_ICE: '3.3'
PAINTING: '1.24'
PAPER: '0.28'
PISTON: '3.5'
POISONOUS_POTATO: '2.2'
POTATO: '0.44'
POTION: '1.29'
POWERED_RAIL: '1.0'
PRISMARINE: '10.0'
PRISMARINE_CRYSTALS: '2.2'
PRISMARINE_SHARD: '2.2'
PUMPKIN: '1.65'
PUMPKIN_PIE: '3.33'
PUMPKIN_SEEDS: '0.22'
QUARTZ: '0.22'
QUARTZ_BLOCK: '1.06'
QUARTZ_STAIRS: '1.6'
RABBIT: '3.3'
RABBIT_FOOT: '4.4'
RABBIT_HIDE: '3.3'
RAIL: '0.69'
REDSTONE: '0.11'
REDSTONE_BLOCK: '1.09'
REDSTONE_LAMP: '2.61'
REDSTONE_ORE: '2.0'
REDSTONE_TORCH: '0.23'
RED_MUSHROOM_BLOCK: '2.2'
REPEATER: '2.88'
ROTTEN_FLESH: '0.33'
SADDLE: '30.0'
SAND: '0.03'
SANDSTONE: '0.16'
SANDSTONE_STAIRS: '0.05'
SEA_LANTERN: '10.0'
SHEARS: '3.63'
OAK_SIGN: '0.44'
SLIME_BALL: '1.1'
SLIME_BLOCK: '10.89'
SNOWBALL: '0.01'
SNOW_BLOCK: '0.05'
SOUL_SAND: '0.11'
SPAWNER>PIG: '650.0'
SPIDER_EYE: '3.3'
SPONGE: '36.74'
SPRUCE_STAIRS: '0.3'
STICK: '0.1'
STICKY_PISTON: '5.06'
STONE: '0.39'
STONE_BRICK_STAIRS: '1.24'
STONE_BUTTON: '0.75'
STONE_PRESSURE_PLATE: '1.5'
STRING: '0.11'
SUGAR: '0.28'
SUGAR_CANE: '0.4'
TERRACOTTA: '0.22'
TNT: '1.36'
TNT_MINECART: '11.47'
TORCH: '0.15'
TRAPPED_CHEST: '2.93'
TRIPWIRE_HOOK: '1.06'
VINE: '1.0'
WATER_BUCKET: '6.6'
WHEAT: '0.4'
WHEAT_SEEDS: '0.2'
WHITE_BED: '1.69'
WHITE_WOOL: '0.48'
WRITABLE_BOOK: '1.67'
WRITTEN_BOOK: '5.0'

View File

@@ -0,0 +1,109 @@
Afk:
# 启用AFK离开系统
Enabled: false
# 玩家处在离开状态时显示title消息
TitleMessage: true
# 玩家处在离开状态时显示subtitle消息
SubTitleMessage: true
# 当玩家一直在原地跳,同样算作离开
# 此设置为了避免玩家使用活塞挂机,或者流水挂机
PreventJumping: true
# 当玩家处于离开状态时,免疫伤害
PreventDamage: true
# 当玩家处于离开状态时,免疫怪物伤害
PreventMobDamage: true
# 插件每过多少秒会检查玩家是否处于离开状态
CheckInterval: 10
# 设置为 true, 玩家处于离开状态期间不算作游戏时间playtime
StopPlayTime: false
# 当玩家多少秒没移动以后,进入离开状态
# 玩家需要权限 cmi.command.afk.auto 来自动进入离开状态
AutoAfkIn: 300
# 当玩家自动进入离开状态后执行的控制台指令
AutoAfkCmds:
- cmi broadcast !&6[playerDisplayName] &e刚刚离开了
# 当玩家手动输入 /cmi afk 并进入离开状态时执行的控制台指令
ManualAfkCmds:
- cmi broadcast !&6[playerDisplayName] &e刚刚离开了
LeaveCmds:
# 当玩家手动进入AFK状态后退出离开状态后执行的控制台指令
Manual:
- cmi broadcast !&6[playerDisplayName] &e回来了
# 当玩家自动进入AFK状态后退出离开状态后执行的控制台指令
Auto:
- cmi broadcast !&6[playerDisplayName] &e回来了
AutoKickTimes:
# 玩家停止移动多少秒后自动踢出玩家
# 也就是说玩家停止移动以后经过AutoAfkIn的时间加上AutoKickIn的时间将会被踢出
# 设置为 -1 则不踢出
# 有该权限的玩家不会被踢出 cmi.command.afk.kickbypass
# 也可以给玩家这个权限 cmi.command.afk.kickOutIn.[秒数] 来自定义玩家的被踢限时,此权限优先级更高
Default: -1
# 自动踢出机制开始运作,需要的最少玩家数
# 设置为0则不管多少玩家在线都会开始运作此机制
# 建议值: 1229
FromPlayerCount: 0
# 全服玩家达到多少时,自动踢出的秒数设置 ([达到玩家数]-[踢出秒数])
# 只有第一项设置的不是 -1 时才生效
# 在线玩家数向下取值例如设置了30-400 和 40-350 当全服有35个玩家在线时400秒后会踢出而非350秒
# 计数时间以玩家进入AFK模式时为开始
ByPlayerCount:
- 10-600
- 20-500
- 30-400
- 40-350
- 50-300
# 经过多少秒后会再一次执行踢出指令
RepeatingAutoKickInterval: 300
# 设置为 true, 每过 RepeatingAutoKickInterval 的时间,插件就会执行自动踢出一次
RepeatKickCommand: false
# 当玩家被踢出时,执行的控制台指令
# 如果玩家没有被踢出,那么这个指令每过 RepeatingAutoKickInterval 时间就会重复触发一次
AutoKickCmds:
- cmi kick [playerName] &e你因为 [time] 没有移动而被踢出
# 禁用离开状态的世界
DisabledWorlds:
- oneTestWorld
- secondTestWorld
# 玩家与方块交互则退出离开状态
DisableOnInteract: true
# 防止玩家使用“鼠标连点器”等挂机脚本来重复与某一方块或物品交互来避免进入离开状态
SmartInteractCheck: true
# 防止玩家使用“挂机池”等能让玩家重复进行规律性运动的东西来避免进入离开状态
AntiAfkMachines: true
# 启用此项处于AFK离开状态的玩家将不能被鱼钩移动位置
PreventHook: true
# 【此功能尚在开发】玩家处于离开状态时不会被其他玩家推挤移动位置
# 请注意此机制为推挤后会自动归位,而非完全不可交互
PreventPushing: false
# 玩家点击背包内物品则退出离开状态
DisableOnInventoryClick: true
# 玩家扔出物品则退出离开状态
DisableOnitemDrop: true
# 玩家使用指令则退出离开状态
DisableOnCommand: true
# 玩家发公共聊天则退出离开状态
DisableOnPublicChat: true
# 玩家发私聊则退出离开状态
DisableOnPrivateChat: true
# 玩家移动则退出离开状态
DisableOnMove: true
# 玩家移动游戏视角则退出离开状态
DisableOnLookAround: false
# 玩家甩杆钓鱼则退出离开状态
DisableFishing: false
# 玩家捡起物品则退出离开状态,不建议开启
DisableItemPickup: false
PreventMobSpawning:
# 当玩家正处于离开状态时,是否阻止怪物在其周围生成
Enabled: false
# 防止怪物自然生成
Natural: false
# 防止怪物从刷怪笼生成(避免玩家制作刷怪塔)
Spawners: true
# 防止铁傀儡生成(避免玩家挂机刷铁锭)
VillageDefence: true
# 当玩家正处于离开状态时,是否阻止其捡起经验球
# 请注意由于原版Minecraft的奇葩处理经验球的机制本机制的运行原理是将经验球设置为0exp并让其被玩家吸收
# 也就是说经验球还是能捡起的,但经验是 0
DisableExpPickup: false

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,230 @@
Chat:
ModifyChatFormat:
# 按照本插件的格式显示聊天内容,而非使用原版聊天内容
Enabled: false
# 监听公共聊天这一事件的优先度
# 要更改此项,必须重启服务器,可选: LOWEST, LOW, NORMAL, HIGH, HIGHEST
# 默认为: NORMAL
Priority: NORMAL
# 设置为 true, 公共聊天和私聊消息当把鼠标放在上面时将会显示悬停消息PlaceholderAPI变量支持可点击快速回复
# 想要修改鼠标悬停消息请至语言文件
ClickHoverMessages: true
DiscordSRV:
# DiscordSRV插件支持
Enabled: true
# 在DiscordSRV配置里的公共频道名称
GlobalChannel: global
# 聊天中的辨识符以标明此消息来自Discord而非来自游戏内可在聊天中使用变量 {discord} 显示
Label: '&2[&7D&2]'
UnlinkedLabel: '&4[&cD&4]'
# 启用此项同时又启用了聊天显示范围的功能所有消息都会被发送至DiscordSRV
# 禁用此项,只有“呼喊”消息,以及拥有权限 cmi.chat.rangebypass 的玩家发送的消息才会被发送至DiscordSRV
RangedMessages: true
# DynMap 聊天支持
DynMapChat: true
# 设置为 false, 每次你使用指令 /r 将会回复你上一个私聊的人,如果你没有私聊过别人,将会回复上一个私聊你的人
# 设置为 true, 每次你使用指令 /r 将会回复上一个私聊你的人,如果你同时在跟好几个人私聊的话可能会比较混乱
ReplyToLastMessenger: false
# 可回复的私聊信息多长时间过期(即超时)
# 只有 ReplyToLastMessenger 设置为 false 时,这个设定才需要被考虑
# 比如你在120秒默认时间内有玩家私聊你哪怕在这个时间内有第三个人私聊你你回复的还是120秒内私聊你的那个人
# 但如果超时了120秒范围谁的私聊离你时间最近就会回复谁
LastMessengerTimeOut: 120
# 设置为 true 玩家只有拥有 cmi.command.msg.[权限组名].send 权限才能给相应权限组的玩家发送私聊
PrivateMessagesGroups: false
# 设置为 false, 聊天中的网址不会被缩写
TranslateLink: true
# 在聊天中被提到的网址将被缩写成下面这串正则的格式,不懂不建议修改
# 例如:
# (https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9]\.[^\s]{2,})
# ((http|https|ftp|ftps)\:\/\/)?[a-zA-Z0-9\-]+\.[a-zA-Z]{2,3}(\/\S*)?
# ((http|https|ftp|ftps)\:\/\/)?[a-zA-Z0-9\-]+\.[a-zA-Z]{2,3}(\/\S*)?([^\s]+)
LinkRegex: (^| )((http|https|ftp|ftps)\:\/\/)?[a-zA-Z0-9\-]+\.[a-zA-Z]{2,3}(\/\S*)?([^\s|^\)]+)
# 设置为true可以在聊天里输入变量来指代手里拿着的物品
# 适合在聊天中展示物品
HoverItems:
Enabled: true
# 会被替换为物品名称的变量列表只有当CMI聊天悬浮框启用时才可生效
ItemRegex:
- (\[item\])
- (([&§]\S)+)?\[(([&§]\S)+)?i(([&§]\S)+)?t(([&§]\S)+)?e(([&§]\S)+)?m(([&§]\S)+)?\]
Bungee:
# 跨群组服私聊,你需要先下载插件 CMI Bungee (可至作者官网 zrips.net 下载)
# 下载地址 https://www.zrips.net/cmi/
Messages: true
# 跨群组服公共聊天
# 玩家需要拥有权限 cmi.bungee.publicmessages.[子服名] 才能发消息至相应子服
PublicMessages: true
# 启用此项,艾特特定玩家的消息将不会向全群组服发送
# 仅当服务器里有1个以上玩家且聊天范围设置为全服时才生效
PublicMessagesSingleIgnore: false
# 跨群组服OP聊天
StaffMessages: true
# 聊天格式,可用变量: {displayName} {world} {prefix} {suffix} {group} {shout} {message}. 同时支持 PlaceHolderAPI 变量,例如 %player_server%
# 请注意,不要给 {message} 部分添加HEX颜色代码想设置这个请在 GeneralMessageFormat 里设置
GeneralFormat: '{prefix}&f{displayName}&7: &r{message}'
# 这是消息“本身”的设置, 你可以给它添加彩色代码等
# 请注意务必包含聊天内容变量本身 {message} ,否则这个设置将毫无意义
# 对于1.16+服务器可以使用更为丰富的彩色代码,比如 '{#b3a28f>}{message}{#d7b8e6<}'
# 你可以在聊天中显示两种渐变色,并把聊天内容分成两段显示,例如 '{#b3a28f>}{message}{#5c6999<>}{message}{#d7b8e6<}'
GeneralMessageFormat: '{message}'
Ranged:
# 设置公共聊天可见的范围,即在发消息者一定半径范围内才可见消息
# 设置为 -1 禁用限制
General: -1
# 设置“呼喊”消息可见的范围
# “呼喊”的消息必须以英文感叹号 ! 开头,且玩家必须拥有权限 cmi.shout
# 上面的设置项 GeneralRange 必须是开启状态
# 设置为 0 代表本世界均可以听见呼喊, 设置为 -1 禁用限制
Shout: 200
# 呼喊消息的颜色
ShoutColor: ''
# 设置“呼喊”消息一次需要花费的金钱
ShoutCost: 0
# 公共聊天可见范围和全服玩家总数挂钩
# 例如全服有20个玩家时聊天消息可见范围是该玩家500格以内
Dynamic:
Use: false
Limits:
- 1-0
- 10-1000
- 20-500
- 30-400
- 40-300
- 50-200
# 如果玩家此时正在聊天室里聊天,他需要在聊天内容前加一个 ! 来将聊天暂时切换至公共聊天
# 设置为空,则禁用
ChatRoomShout: '!'
# 无人聊天的聊天室多少秒后会被移除
# 此时间从最后一位聊天玩家离开聊天开始计时
ChatRoomLife: 3600
# 当你在点击公共聊天、私人聊天等等内容时, 显示的建议内容。 [playerName] 或者 [playerDisplayName] 变量可被用来展示玩家名
ClickSuggestions:
pubmsg: '/msg [playerNickName] '
privmsg: '/msg [playerNickName] '
staffmsg: '/msg [playerNickName] '
helpop: '/msg [playerNickName] '
chatroom: '/msg [playerNickName] '
discord: '/msg [playerNickName] '
# 当玩家点击聊天中的玩家名时,执行的指令(每次触发只执行一条指令)
# 若设置了下面这些,那么上面的 ClickSuggestions 部分将变成Shift+左键点击后显示
# 默认指令将以玩家身份执行,如果你想让指令以控制台身份执行,请在指令前面加 asConsole!
ClickCommands:
pubmsg: ''
privmsg: ''
staffmsg: ''
helpop: ''
chatroom: ''
discord: ''
# 拥有特定权限的玩家,其聊天格式与一般人不同
# 你可以添加更多序号,序号必须为数字
# 权限 : cmi.chatgroup.[序号]
# 如果玩家拥有不只一个权限,序号大的那个会优先显示
# 请注意,不要给 {message} 部分添加HEX颜色代码想设置这个请在 GeneralMessageFormat 里设置
GroupFormat:
'1': '{prefix}&f{displayName}&f: &r{message}'
'2': '{prefix}&f{displayName}&7: &r{message}'
'3': '{prefix}&f{displayName}&8: &r{message}'
# 拥有特定权限的玩家,其聊天内容本身与一般人不同
# 如果玩家拥有不只一个权限,序号大的那个会优先显示
# 权限cmi.chatmessagegroup.[序号]
# 例如: cmi.chatmessagegroup.2
GroupMessageFormat:
'1': '{message}'
'2': '{message}'
'3': '{message}'
Colors:
# 设置为 true ,所有公共聊天都将禁用彩色符号,但是有权限的玩家可以使用彩色聊天
# 权限 cmi.colors.publicmessage.[颜色英文]
# 颜色英文可选: black(&0), darkblue(&1), darkgreen(&2), darkaqua(&3), darkred(&4), darkpurple(&5), gold(&6), gray(&7), darkgray(&8), blue(&9), green(&a), aqua(&b), red(&c), lightpurple(&d), yellow(&e), white(&f), magic(&k), bold(&l), strikethrough(&m), underline(&n), italic(&o), reset(&r)
PublicMessage: true
# 设置为 true ,所有私人聊天都将禁用彩色符号,但是有权限的玩家可以使用彩色聊天
# 权限 cmi.colors.privatemessage.[颜色英文]
PrivateMessage: true
# 设置为 true ,用 /me 发出的消息将无视里面包含的彩色符号,但是将按照玩家所拥有的权限显示其实际颜色
# 权限 cmi.colors.me.[颜色英文]
me: true
# 设置为true如果玩家没有权限使用彩色代码其聊天内容中的彩色代码会被抹去
# 公共聊天/私人聊天/me消息/木牌
CleanUp:
publicmessage: true
privatemessage: true
me: true
signs: false
books: true
itemname: true
itemlore: true
# 如果玩家的聊天内容中含有以下内容,以下内容可以受到彩色代码影响并显示为彩色,无视权限限制
# 仅限公共聊天/私人聊天
WhiteList:
- '&c❤&7'
# 设置为true玩家昵称将不受彩色代码影响
# cmi.colors.nickname.[颜色英文]
NickName: true
# 使用指令切换聊天颜色 /cmi catcolor ,玩家可以使用的颜色取决于他们的权限 cmi.colors.publicmessages.[颜色代码] ,颜色代码的变量为 %cmi_user_chatcolor%
Picker:
- '&f'
- '&2'
- '&3'
- '&7'
- '&8'
- '&a'
- '&b'
- '&c'
- '&e'
- '&6'
- '{#00e625}'
- '{#brown}'
# 设置为true被你无视的玩家的公共聊天将不会显示
IgnorePublicMessage: true
Tag:
# 启用艾特系统,若有聊天内容中提到 @某玩家 ,该玩家将会收到消息
Enabled: true
# 如果设置为true若玩家在聊天中被提及此聊天会变成彩色且被提及的玩家会收到消息
# 会加重服务器负担,不建议开启
HardCoreMode: false
# 被艾特的玩家名/昵称会以什么颜色显示,聊天发送者需要拥有权限 cmi.tag.color
Color: '&c'
# 被艾特时自动执行的指令
# 变量 [playerName] 可指代被艾特的玩家名
# 变量 [senderName] 可指代发送艾特的玩家名
CommandsOnTag:
- asConsole! cmi sound BLOCK_NOTE_BLOCK_HARP:3:1 [playerName] -s
# 只有玩家处于离开AFK状态时才触发艾特自动执行指令
OnlyWhenAfk: false
# 如果设置为true, 艾特玩家时,符号 @ 会被抹去
RemoveEta: false
#
# 以下设置项只在 MC1.19.4 及之后版本可用
#
ChatBubble:
# 开启公共聊天气泡功能
# 每个玩家可以使用 /options 指令关闭它
PublicMessages: true
# 监听气泡消息的优先度
# 要更改此项,必须重启服务器,
# 可选: LOWEST, LOW, NORMAL, HIGH, HIGHEST, MONITOR
# 默认为: MONITOR
Priority: MONITOR
# 聊天气泡高度
Offset: 2.5
# 聊天气泡显示的时间,单位秒
ShowFor: 5
# 一次显示的聊天气泡最大条数
MaxShowFor: 10
# 根据一句话里包含字母的数量,增加这条消息显示的时间
# 使得短的消息显示时间短,长的消息显示时间长
ExtraTime: 0.02
# 聊天气泡的大小,默认为 1
PlateScale: 1
# 每行文字宽度,超出该宽度则另起一行
LineWidth: 255
Background:
# 默认文字背景颜色,如果文字本身自带颜色则该设置项被覆盖
# 可留空,显示的即为默认颜色
# 以下是范例颜色: {#black}
Color: '{#black}'
# 文字背景色深浅度设置在0和1之间0代表完全没有背景色1则代表背景色完全不透明
Opacity: 0.5
# 添加文字阴影
Shadow: true

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,67 @@
Combat:
# 战斗模式会持续多长时间
Timer: 15
# 若启用这个哪怕玩家处在安全区内若其想要PVP将允许打出伤害
safeZoneDamage: false
Player:
# 设置为true, 进入战斗状态的玩家会终止fly飞行状态
# 也就是说如果玩家此时正在飞行中,他会掉下来
# 但需注意,若玩家有权限飞行且战斗模式中已设置允许使用指令,玩家依然可以使用指令恢复飞行
# 若玩家有此权限 cmi.pvp.PFlyBypass 则不受限制
DisableFlight: false
# 设置为 true, 被攻击者也会进入战斗模式,即便他没有还手
# 设置为 false, 仅攻击者会进入战斗模式
IncludeVictim: true
# 设置为true当进入战斗状态的玩家被强制终止飞行时掉下来不会有掉落伤害仅这一次
# 只在PVP中有效
DisableFallDamage: false
# 设置为true玩家将看到bossbar显示还有多长时间战斗模式结束
# 只在PVP中有效
ShowBossBar: false
# 当攻击玩家时,使用悬浮文字展示伤害数值
ShowDamageNumbers: true
DamageNumbersFormat: '&c⚔[damage]'
# 正在上帝模式中的玩家无法进行PVP
# 有此权限者无视该设置 cmi.pvp.godBypass
noGodDamage: false
# 上方设定了上帝模式中的玩家无法攻击别人,若此机制触发,是否发消息提示管理
noGodDamageInform: false
# 设置为true玩家战斗模式中只允许使用下列列表中的指令
BlockCommands: false
AllowedCommands:
- msg
- r
- tell
# 设置为 true则上面的 AllowedCommands 白名单反转为黑名单,只有以上指令不可使用
MakeBlackList: false
Mob:
# 设置为 true, 进入战斗状态的玩家会终止fly飞行状态
# 若玩家有此权限 cmi.pvp.MFlyBypass 则不受限制
DisableFlight: false
# 设置为 true, 被攻击者也会进入战斗模式,即便他没有还手
IncludeVictim: false
# 设置为true当进入战斗状态的玩家被强制终止飞行时掉下来不会有掉落伤害仅这一次
# 只在PVE中有效
DisableFallDamage: false
# 设置为true玩家将看到bossbar显示还有多长时间战斗模式结束
# 只在PVE中有效
ShowBossBar: false
# 设置为true来自环境的伤害也会被计入伤害计算之中
# 例如仙人掌、岩浆块、窒息、燃烧、摔落,等等
IncludeEnvironment: true
# 当攻击生物时,使用悬浮文字展示伤害数值
ShowDamageNumbers: true
DamageNumbersFormat: '&c⚔[damage]'
# 上帝模式的玩家不能伤害生物
# 有此权限 cmi.pve.godBypass permission 则无视限制
noGodDamage: false
# 当玩家处于上帝模式时,是否提醒玩家其不能伤害生物
noGodDamageInform: false
# 设置为true玩家PVE战斗模式中只允许使用下列列表中的指令
BlockCommands: false
AllowedCommands:
- msg
- r
- tell
# 设置为 true则上面的 AllowedCommands 白名单反转为黑名单,只有以上指令不可使用
MakeBlackList: false

View File

@@ -0,0 +1,16 @@
Enabled: false
# 举例: - 'cmi heal:100.5:true'
# 执行指令时消耗金钱
# 金钱数字务必是正数
# 金钱后面第一个true/false意思是你可以决定是否告知玩家已经扣钱了
# 第二个true/false意思是是否让玩家执行指令之前有一个简短的确认玩家会看到确认信息包括所需金钱并需要输入特定内容或者点击确认信息来确认执行
# 另外,请不要在这里使用指令简写(比如 /heal 请务必使用指令全称,比如 /cmi heal
# 例外的是自定义指令简写customAlias在这里是可用的
# 此外有一点需要注意,原生的 CMI 指令一定会先检查指令是否成功执行,之后才会执行扣钱,所以不需要担心指令执行失败又扣钱的问题
# 但是自定义指令简写customAlias没有这一机制所以有可能会存在指令执行失败又扣钱的情况
Commands:
- cmi heal:100.5:true:true
- cmi feed:100.5:true:true
- cmi home :30:true:true
- cmi warp :10:true:true

View File

@@ -0,0 +1,528 @@
# 当玩家使用带有“抢夺”附魔的武器击杀生物时有更高几率掉落头颅
# 几率用百分比计算
# 例如玩家原本击杀生物掉头几率为 1% 若使用附魔了抢夺3的武器增幅 30%击杀则掉头几率变为1.3%
# 只对生物的头颅掉落几率有效
# 你可以自由地添加等级, 直接新建新的行即可,比如:
# Lvl33: 35.5
LootMobBonus:
Enabled: true
Lvl1: 5.0
Lvl2: 15.0
Lvl3: 30.0
# 使用默认的头颅的Lore如果头颅没有自定义lore的话
useDefaultHeadLore: true
# 头颅默认的lore
defaultHeadLore:
- '&7被玩家 &6[playerName] &7击杀'
PlayerHead:
# 玩家头颅是否有lore
UseLore: true
# 可以使用击杀者和被击杀者的变量
# 当然其它全局变量也可以显示但是会以被击杀者作为各种变量的“接收者”source
Lore:
- '&7Killed by &6[playerName]'
HeadHandling:
Maintain:
# 当头颅被当成方块放置,再挖掉,是否继续保留该头颅的名称
# 原版MC会在方块放置再挖掉后抹去方块所有信息但下面的设置项可以帮助保留头颅名称/lore/附魔
Name: false
Lore: false
Enchants: false
# 搬运者注记以下部分迁移自Combat.yml
Player:
# 击杀玩家是否掉头
Drop: false
# 玩家掉落头颅的几率,范围是 0 到 100可以使用小数比如 0.2
# 100 几率代表百分百掉落头颅
Percentage: 1.0
# 当玩家尝试第二次杀死并获取同一玩家的头颅,减少其掉头概率
# 注意,此设置项每次服务器重启都会重置
LowerChanceOfterDrop: 50.0
# 启用此项,当玩家被带有“抢夺”附魔的武器杀死,有更大几率掉头
# 概率增幅按照原掉头几率的百分比来计算 %
# 例如玩家原本掉头几率为 1% 若被附魔了抢夺3的武器增幅 30%杀死则掉头几率变为1.3%
# 只对玩家的头颅掉落几率有效
# 你可以自由地添加等级, 直接新建新的行即可,比如:
# Lvl33: 35.5
LootBonus:
Enabled: true
Lvl1: 5.0
Lvl2: 15.0
Lvl3: 30.0
# 生效的世界,设置为空则默认全部世界
Worlds: []
Mob:
# 击杀各种生物是否掉落头颅
# 请参照 customHeads.yml 来设置不同的生物掉落头颅几率
Drop: false
# 生效的世界,设置为空则默认全部世界
Worlds: []
# 每种生物的自定义头颅
# 格式是 [掉落几率]:[头颅材质]
# 强烈建议将至少一种头颅的掉落几率设置为 100% 因为如果不这样有可能造成玩家本该获得头颅结果没有获得的情况
# 你可以在网络上在线查找头颅的材质
# 如果你给同一种生物设置了不止一种头颅材质, 材质将随机选择
# 自定义头颅名称可以这样设置 [几率]:[头颅名称]:c-[options]:lore{"[lore]"}:[材质]
# 详细教程参 www.zrips.net/cmi/extra/custom-mob-heads/
# 如果你嫌头颅材质代码太长,可以把前一部分代码删去: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUv 因为如果这段乱码没有加在开头,插件会自动加上
EntityHeads:
elder_guardian:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MWM3OTc0ODJhMTRiZmNiODc3MjU3Y2IyY2ZmMWI2ZTZhOGI4NDEzMzM2ZmZiNGMyOWE2MTM5Mjc4YjQzNmIifX19
wither_skeleton:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Nzk1M2I2YzY4NDQ4ZTdlNmI2YmY4ZmIyNzNkNzIwM2FjZDhlMWJlMTllODE0ODFlYWQ1MWY0NWRlNTlhOCJ9fX0=
- 100:Default:ZjVlYzk2NDY0NWE4ZWZhYzc2YmUyZjE2MGQ3Yzk5NTYzNjJmMzJiNjUxNzM5MGM1OWMzMDg1MDM0ZjA1MGNmZiJ9fX0=
- 100:Default:NDk2YmM4ZWJkNGUxM2Y0OTZkOGQ3NGM1NjVkZDU2ZTk5YTRhZjJlMmVhN2EyN2E5NmMxYWJkMjg0MTg0YiJ9fX0=
stray:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NzhkZGY3NmU1NTVkZDVjNGFhOGEwYTVmYzU4NDUyMGNkNjNkNDg5YzI1M2RlOTY5ZjdmMjJmODVhOWEyZDU2In19fQ==
husk:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Nzc3MDY4MWQxYTI1NWZiNGY3NTQ3OTNhYTA1NWIyMjA0NDFjZGFiOWUxMTQxZGZhNTIzN2I0OTkzMWQ5YjkxYyJ9fX0=
zombie_villager:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MzdlODM4Y2NjMjY3NzZhMjE3YzY3ODM4NmY2YTY1NzkxZmU4Y2RhYjhjZTljYTRhYzZiMjgzOTdhNGQ4MWMyMiJ9fX0=
- 100:Default:Y2ZmMDQ4MmZkMzJmYWIyY2U5ZjVmYTJlMmQ5YjRkYzc1NjFkYTQyMjE1MmM5OWZjODA0YjkxMzljYWYyNTZiIn19fQ==
- 100:Default:OTYxZjE5ZmZkOGFlNDI1NzkyYzRiMTgxNzU2YWRmZjhkNDgxNzRhZWVmNThhMGYzMjdhMjhjNzQyYzcyNDQyIn19fQ==
- 100:Default:YTE2MTU1ZmNmMzY2Y2Y0ZTA2Y2U1ZGZmYzQ4Y2E1NGU4ZWE0OGRmZTUyNTM1OGI2MTJkYzQ0ZmQ0MzIifX19
- 100:Default:NDRmMDhlYmQ0ZTI1Y2RhM2FkZTQ1Yjg2MzM3OGFkMzc3ZjE4YzUxMGRiNGQyOGU4MmJiMjQ0NTE0MzliMzczNCJ9fX0=
- 100:Default:NTI4YzJiYWQ1Mzg5Y2IzNTkyYjU2NWIzYzQ3ZWNjMTg5ZTA1NDJhODc4MzUwMjhkNjE0OGJiZTMzNDU2NDUifX19
skeleton_horse:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NDdlZmZjZTM1MTMyYzg2ZmY3MmJjYWU3N2RmYmIxZDIyNTg3ZTk0ZGYzY2JjMjU3MGVkMTdjZjg5NzNhIn19fQ==
zombie_horse:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZDIyOTUwZjJkM2VmZGRiMThkZTg2ZjhmNTVhYzUxOGRjZTczZjEyYTZlMGY4NjM2ZDU1MWQ4ZWI0ODBjZWVjIn19fQ==
donkey:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZGZiNmMzYzA1MmNmNzg3ZDIzNmEyOTE1ZjgwNzJiNzdjNTQ3NDk3NzE1ZDFkMmY4Y2JjOWQyNDFkODhhIn19fQ==
mule:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YTA0ODZhNzQyZTdkZGEwYmFlNjFjZTJmNTVmYTEzNTI3ZjFjM2IzMzRjNTdjMDM0YmI0Y2YxMzJmYjVmNWYifX19
evoker:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YTAwZDNmZmYxNmMyZGNhNTliOWM1OGYwOTY1MjVjODY5NzExNjZkYmFlMTMzYjFiMDUwZTVlZTcxNjQ0MyJ9fX0=
vex:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NWU3MzMwYzdkNWNkOGEwYTU1YWI5ZTk1MzIxNTM1YWM3YWUzMGZlODM3YzM3ZWE5ZTUzYmVhN2JhMmRlODZiIn19fQ==
vindicator:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YTAwZDNmZmYxNmMyZGNhNTliOWM1OGYwOTY1MjVjODY5NzExNjZkYmFlMTMzYjFiMDUwZTVlZTcxNjQ0MyJ9fX0=
illusioner:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MmYyODgyZGQwOTcyM2U0N2MwYWI5NjYzZWFiMDgzZDZhNTk2OTI3MzcwNjExMGM4MjkxMGU2MWJmOGE4ZjA3ZSJ9fX0=
- 100:Default:NTEyNTEyZTdkMDE2YTIzNDNhN2JmZjFhNGNkMTUzNTdhYjg1MTU3OWYxMzg5YmQ0ZTNhMjRjYmViODhiIn19fQ==
creeper:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZjQyNTQ4MzhjMzNlYTIyN2ZmY2EyMjNkZGRhYWJmZTBiMDIxNWY3MGRhNjQ5ZTk0NDQ3N2Y0NDM3MGNhNjk1MiJ9fX0=
- 100:Default:YTNmMTcyZDI5Y2Y5NGJjODk1NjA4YjdhNWRjMmFmMGRlNDljNzg4ZDViZWNiMTYwNWYxZjUzNDg4YTAxNzBiOCJ9fX0=
- 100:Charged Creeper:c-powered:ZjJjZWIzOWRkNGRlMjRhN2FkZmUyOTFhM2EwY2ZjN2NmNGY2NDVkZTU5YjYwM2ZjZmUwNmM2YjVhMDZlMjYifX19
skeleton:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MzAxMjY4ZTljNDkyZGExZjBkODgyNzFjYjQ5MmE0YjMwMjM5NWY1MTVhN2JiZjc3ZjRhMjBiOTVmYzAyZWIyIn19fQ==
- 100:Default:Yjk1MDc4ZDNiM2IxNzAxZDQ1NzI5ZDNhMTQyMjQ2N2IyOWRiYjJlMWE5MTI4MTMzYTJmMTYzZWJlODVkMmRiOSJ9fX0=
spider:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Y2Q1NDE1NDFkYWFmZjUwODk2Y2QyNThiZGJkZDRjZjgwYzNiYTgxNjczNTcyNjA3OGJmZTM5MzkyN2U1N2YxIn19fQ==
giant:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZWM0NTViMzgzNjhkYWU3MzBlZjE0ODNjMWRmMjVjZDg3YjQxYmVlNDQxZWYzYWIxZjNjNjBmMjFiZmUwZTUxMSJ9fX0=
zombie:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NTZmYzg1NGJiODRjZjRiNzY5NzI5Nzk3M2UwMmI3OWJjMTA2OTg0NjBiNTFhNjM5YzYwZTVlNDE3NzM0ZTExIn19fQ==
- 100:Default:MzExZGQ5MWVlNGQzMWRkZDU5MWQyODMyZWExZWMwODBmMmVkZWQzM2FiODllZTFkYjhiMDRiMjZhNjhhIn19fQ==
slime:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MTZhZDIwZmMyZDU3OWJlMjUwZDNkYjY1OWM4MzJkYTJiNDc4YTczYTY5OGI3ZWExMGQxOGM5MTYyZTRkOWI1In19fQ==
ghast:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:OGI2YTcyMTM4ZDY5ZmJiZDJmZWEzZmEyNTFjYWJkODcxNTJlNGYxYzk3ZTVmOTg2YmY2ODU1NzFkYjNjYzAifX19
zombified_piglin:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:N2VhYmFlY2M1ZmFlNWE4YTQ5Yzg4NjNmZjQ4MzFhYWEyODQxOThmMWEyMzk4ODkwYzc2NWUwYThkZTE4ZGE4YyJ9fX0=
enderman:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:N2E1OWJiMGE3YTMyOTY1YjNkOTBkOGVhZmE4OTlkMTgzNWY0MjQ1MDllYWRkNGU2YjcwOWFkYTUwYjljZiJ9fX0=
cave_spider:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NDE2NDVkZmQ3N2QwOTkyMzEwN2IzNDk2ZTk0ZWViNWMzMDMyOWY5N2VmYzk2ZWQ3NmUyMjZlOTgyMjQifX19
silverfish:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZGE5MWRhYjgzOTFhZjVmZGE1NGFjZDJjMGIxOGZiZDgxOWI4NjVlMWE4ZjFkNjIzODEzZmE3NjFlOTI0NTQwIn19fQ==
blaze:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Yjc4ZWYyZTRjZjJjNDFhMmQxNGJmZGU5Y2FmZjEwMjE5ZjViMWJmNWIzNWE0OWViNTFjNjQ2Nzg4MmNiNWYwIn19fQ==
magma_cube:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Mzg5NTdkNTAyM2M5MzdjNGM0MWFhMjQxMmQ0MzQxMGJkYTIzY2Y3OWE5ZjZhYjM2Yjc2ZmVmMmQ3YzQyOSJ9fX0=
ender_dragon:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZmZjZGFlNTg2YjUyNDAzYjkyYjE4NTdlZTQzMzFiYWM2MzZhZjA4YmFiOTJiYTU3NTBhNTRhODMzMzFhNjM1MyJ9fX0=
wither:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YTQzNTE2NGMwNWNlYTI5OWEzZjAxNmJiYmVkMDU3MDZlYmI3MjBkYWM5MTJjZTQzNTFjMjI5NjYyNmFlY2Q5YSJ9fX0=
- 100:Default:M2U0ZjQ5NTM1YTI3NmFhY2M0ZGM4NDEzM2JmZTgxYmU1ZjJhNDc5OWE0YzA0ZDlhNGRkYjcyZDgxOWVjMmIyYiJ9fX0=
- 100:Default:Y2RmNzRlMzIzZWQ0MTQzNjk2NWY1YzU3ZGRmMjgxNWQ1MzMyZmU5OTllNjhmYmI5ZDZjZjVjOGJkNDEzOWYifX19
- 100:Default:OTY0ZTFjM2UzMTVjOGQ4ZmZmYzM3OTg1YjY2ODFjNWJkMTZhNmY5N2ZmZDA3MTk5ZThhMDVlZmJlZjEwMzc5MyJ9fX0=
- 100:Default:ZGRhZmIyM2VmYzU3ZjI1MTg3OGU1MzI4ZDExY2IwZWVmODdiNzljODdiMjU0YTdlYzcyMjk2ZjkzNjNlZjdjIn19fQ==
bat:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NGNmMWIzYjNmNTM5ZDJmNjNjMTcyZTk0Y2FjZmFhMzkxZThiMzg1Y2RkNjMzZjNiOTkxYzc0ZTQ0YjI4In19fQ==
witch:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODllOGI1ZjE1YTliMjlhMWUzODljOTUyMThmZDM3OTVmMzI4NzJlNWFlZTk0NjRhNzY0OTVjNTI3ZDIyNDUifX19
endermite:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODRhYWZmYTRjMDllMmVhZmI4NWQzNTIyMTIyZGIwYWE0NTg3NGJlYTRlM2Y1ZTc1NjZiNGQxNjZjN2RmOCJ9fX0=
guardian:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZGZiNjc1Y2I1YTdlM2ZkMjVlMjlkYTgyNThmMjRmYzAyMGIzZmE5NTAzNjJiOGJjOGViMjUyZTU2ZTc0In19fQ==
shulker:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MWU3MzgzMmUyNzJmODg0NGM0NzY4NDZiYzQyNGEzNDMyZmI2OThjNThlNmVmMmE5ODcxYzdkMjlhZWVhNyJ9fX0=
pig:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YzNhYmQ0NGFlNjdkOWM5MjU0ZDE3N2U5NjU4ZGE4NDg0MzM4OWQ1ZTFmZmQyYWYxZmI1MTIxN2M3NWMyOTgifX19
- 100:Default:NjIxNjY4ZWY3Y2I3OWRkOWMyMmNlM2QxZjNmNGNiNmUyNTU5ODkzYjZkZjRhNDY5NTE0ZTY2N2MxNmFhNCJ9fX0=
sheep:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Magenta Sheep:c-magenta:MTgzNjU2NWM3ODk3ZDQ5YTcxYmMxODk4NmQxZWE2NTYxMzIxYTBiYmY3MTFkNDFhNTZjZTNiYjJjMjE3ZTdhIn19fQ==
- 100:Brown Sheep:c-brown:YTU1YWQ2ZTVkYjU2OTJkODdmNTE1MTFmNGUwOWIzOWZmOWNjYjNkZTdiNDgxOWE3Mzc4ZmNlODU1M2I4In19fQ==
- 100:Purple Sheep:c-purple:YWU1Mjg2N2FmZWYzOGJiMTRhMjZkMTQyNmM4YzBmMTE2YWQzNDc2MWFjZDkyZTdhYWUyYzgxOWEwZDU1Yjg1In19fQ==
- 100:Pink Sheep:c-pink:MmFjNzRhMmI5YjkxNDUyZTU2ZmExZGRhNWRiODEwNzc4NTZlNDlmMjdjNmUyZGUxZTg0MWU1Yzk1YTZmYzVhYiJ9fX0=
- 100:Green Sheep:c-green:YTAxNzIxNWM3ZjhkYjgyMDQwYWEyYzQ3Mjk4YjY2NTQxYzJlYjVmN2Y5MzA0MGE1ZDIzZDg4ZjA2ODdkNGIzNCJ9fX0=
- 100:Lime Sheep:c-lime:OTJhMjQ0OGY1OGE0OTEzMzI0MzRlODVjNDVkNzg2ZDg3NDM5N2U4MzBhM2E3ODk0ZTZkOTI2OTljNDJiMzAifX19
- 100:Cyan Sheep:c-cyan:MWM4YTk3YTM4ODU2NTE0YTE2NDEzZTJjOTk1MjEyODlmNGM1MzYzZGM4MmZjOWIyODM0Y2ZlZGFjNzhiODkifX19
- 100:Orange Sheep:c-orange:ZjA5ODM5N2EyNzBiNGMzZDJiMWU1NzRiOGNmZDNjYzRlYTM0MDkwNjZjZWZlMzFlYTk5MzYzM2M5ZDU3NiJ9fX0=
- 100:Blue Sheep:c-blue:ZDllYzIyODE4ZDFmYmZjODE2N2ZiZTM2NzI4YjI4MjQwZTM0ZTE2NDY5YTI5MjlkMDNmZGY1MTFiZjJjYTEifX19
- 100:Light Blue Sheeep:c-light_blue:NDZmNmM3ZTdmZDUxNGNlMGFjYzY4NTkzMjI5ZTQwZmNjNDM1MmI4NDE2NDZlNGYwZWJjY2NiMGNlMjNkMTYifX19
- 100:Yellow Sheep:c-yellow:MjZhNDExMmRmMWU0YmNlMmE1ZTI4NDE3ZjNhYWZmNzljZDY2ZTg4NWMzNzI0NTU0MTAyY2VmOGViOCJ9fX0=
- 100:Light Gray Sheep:c-light_gray:Y2UxYWM2ODM5OTNiZTM1NTEyZTFiZTMxZDFmNGY5OGU1ODNlZGIxNjU4YTllMjExOTJjOWIyM2I1Y2NjZGMzIn19fQ==
- 100:Red Sheep:c-red:ODM5YWY0NzdlYjYyNzgxNWY3MjNhNTY2MjU1NmVjOWRmY2JhYjVkNDk0ZDMzOGJkMjE0MjMyZjIzZTQ0NiJ9fX0=
- 100:Black Sheep:c-black:MzI2NTIwODNmMjhlZDFiNjFmOWI5NjVkZjFhYmYwMTBmMjM0NjgxYzIxNDM1OTUxYzY3ZDg4MzY0NzQ5ODIyIn19fQ==
- 100:Gray Sheep:c-gray:NDI4N2ViNTAxMzkxZjI3NTM4OWYxNjZlYzlmZWJlYTc1ZWM0YWU5NTFiODhiMzhjYWU4N2RmN2UyNGY0YyJ9fX0=
- 100:White Sheep:c-white:ZjMxZjljY2M2YjNlMzJlY2YxM2I4YTExYWMyOWNkMzNkMThjOTVmYzczZGI4YTY2YzVkNjU3Y2NiOGJlNzAifX19
cow:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NWQ2YzZlZGE5NDJmN2Y1ZjcxYzMxNjFjNzMwNmY0YWVkMzA3ZDgyODk1ZjlkMmIwN2FiNDUyNTcxOGVkYzUifX19
- 100:Default:YzVhOWNkNThkNGM2N2JjY2M4ZmIxZjVmNzU2YTJkMzgxYzlmZmFjMjkyNGI3ZjRjYjcxYWE5ZmExM2ZiNWMifX19
chicken:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MTYzODQ2OWE1OTljZWVmNzIwNzUzNzYwMzI0OGE5YWIxMWZmNTkxZmQzNzhiZWE0NzM1YjM0NmE3ZmFlODkzIn19fQ==
squid:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MDE0MzNiZTI0MjM2NmFmMTI2ZGE0MzRiODczNWRmMWViNWIzY2IyY2VkZTM5MTQ1OTc0ZTljNDgzNjA3YmFjIn19fQ==
wolf:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NjlkMWQzMTEzZWM0M2FjMjk2MWRkNTlmMjgxNzVmYjQ3MTg4NzNjNmM0NDhkZmNhODcyMjMxN2Q2NyJ9fX0=
- 100:Angry Wolf:c-angry:ZTk1Y2JiNGY3NWVhODc2MTdmMmY3MTNjNmQ0OWRhYzMyMDliYTFiZDRiOTM2OTY1NGIxNDU5ZWExNTMxNyJ9fX0=
mushroom_cow:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZDBiYzYxYjk3NTdhN2I4M2UwM2NkMjUwN2EyMTU3OTEzYzJjZjAxNmU3YzA5NmE0ZDZjZjFmZTFiOGRiIn19fQ==
snowman:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MWZkZmQxZjc1MzhjMDQwMjU4YmU3YTkxNDQ2ZGE4OWVkODQ1Y2M1ZWY3MjhlYjVlNjkwNTQzMzc4ZmNmNCJ9fX0=
ocelot:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YWI4ODFjMzliM2FmZGNjNzlmOTFmZTVkZTNjZGQwMTViYzMzNTM4NDNmNTkxZjRkMjNjZDMwMjdkZTRlNiJ9fX0=
- 100:Default:NTY1N2NkNWMyOTg5ZmY5NzU3MGZlYzRkZGNkYzY5MjZhNjhhMzM5MzI1MGMxYmUxZjBiMTE0YTFkYjEifX19
- 100:Default:YTc1NWU3ZGYwNGQxOGIzMWQ2M2MxN2Y0YTdiNGM3MzkyNGJkNjI2NWRhNjllMTEzZWRkZDk3NTE2ZmM3In19fQ==
- 100:Default:ZjJhNjYyZjJhZTdkZWJlZTY1MjkyYzJiZjQyZmJiMDliOTdiMmZmYmRiMjcwNTIwYzJkYjk2ZTUxZDg5NDUifX19
iron_golem:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODkwOTFkNzllYTBmNTllZjdlZjk0ZDdiYmE2ZTVmMTdmMmY3ZDQ1NzJjNDRmOTBmNzZjNDgxOWE3MTQifX19
horse:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NjE5MDI4OTgzMDg3MzBjNDc0NzI5OWNiNWE1ZGE5YzI1ODM4YjFkMDU5ZmU0NmZjMzY4OTZmZWU2NjI3MjkifX19
rabbit:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Yzk3N2EzMjY2YmYzYjllYWYxN2U1YTAyZWE1ZmJiNDY4MDExNTk4NjNkZDI4OGI5M2U2YzEyYzljYiJ9fX0=
- 100:Default:NzJjNTgxMTZhMTQ3ZDFhOWEyNjI2OTIyNGE4YmUxODRmZThlNWYzZjNkZjliNjE3NTEzNjlhZDg3MzgyZWM5In19fQ==
- 100:Default:Y2I4Y2ZmNGIxNWI4Y2EzN2UyNTc1MGYzNDU3MThmMjg5Y2IyMmM1YjNhZDIyNjI3YTcxMjIzZmFjY2MifX19
polar_bear:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZDQ2ZDIzZjA0ODQ2MzY5ZmEyYTM3MDJjMTBmNzU5MTAxYWY3YmZlODQxOTk2NjQyOTUzM2NkODFhMTFkMmIifX19
llama:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NGQ2N2ZkNGJmZjI5MzI2OWNiOTA4OTc0ZGNhODNjMzM0ODVlNDM1ZWQ1YThlMWRiZDY1MjFjNjE2ODcxNDAifX19
- 100:Default:ODAyNzdlNmIzZDlmNzgxOWVmYzdkYTRiNDI3NDVmN2FiOWE2M2JhOGYzNmQ2Yjg0YTdhMjUwYzZkMWEzNThlYiJ9fX0=
- 100:Default:YzJiMWVjZmY3N2ZmZTNiNTAzYzMwYTU0OGViMjNhMWEwOGZhMjZmZDY3Y2RmZjM4OTg1NWQ3NDkyMTM2OCJ9fX0=
- 100:Default:Y2YyNGU1NmZkOWZmZDcxMzNkYTZkMWYzZTJmNDU1OTUyYjFkYTQ2MjY4NmY3NTNjNTk3ZWU4MjI5OWEifX19
parrot:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:Yjc4ZTFjNWY0OGE3ZTEyYjI2Mjg1MzU3MWVmMWY1OTdhOTJlZjU4ZGE4ZmFhZmUwN2JiN2MwZTY5ZTkzIn19fQ==
- 100:Default:ZGFjNjcwM2RlZDQ2ZDkzOWE2MjBmZTIyYzQzZTE4Njc0ZTEzZDIzYzk3NDRiZTAzNmIzNDgzYzFkMWNkZCJ9fX0=
- 100:Default:M2Q2ZjRhMjFlMGQ2MmFmODI0Zjg3MDhhYzYzNDEwZjFhMDFiYmI0MWQ3ZjRhNzAyZDk0NjljNjExMzIyMiJ9fX0=
- 100:Default:ZjBiZmE4NTBmNWRlNGIyOTgxY2NlNzhmNTJmYzJjYzdjZDdiNWM2MmNhZWZlZGRlYjljZjMxMWU4M2Q5MDk3In19fQ==
- 100:Default:ZjhhODJjOGI3NWRkMWMyY2U4MTMzYzBiYTkzOWI4YzUyZTQ3ZDNlYzM3NDk1MGY0N2RkZGJiZTM0NWUyMCJ9fX0=
- 100:Default:YTRiYThkNjZmZWNiMTk5MmU5NGI4Njg3ZDZhYjRhNTMyMGFiNzU5NGFjMTk0YTI2MTVlZDRkZjgxOGVkYmMzIn19fQ==
- 100:Default:YWI5YTM2YzU1ODlmM2EyZTU5YzFjYWE5YjNiODhmYWRhNzY3MzJiZGI0YTc5MjYzODhhOGMwODhiYmJjYiJ9fX0=
- 100:Default:YWNhNTgwYjA1MWM2M2JlMjlkYTU0NWE5YWE3ZmY3ZTEzNmRmNzdhODFjNjdkYzFlZTllNjE3MGMxNGZiMzEwIn19fQ==
- 100:Default:MmI5NGYyMzZjNGE2NDJlYjJiY2RjMzU4OWI5YzNjNGEwYjViZDVkZjljZDVkNjhmMzdmOGM4M2Y4ZTNmMSJ9fX0=
villager:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODIyZDhlNzUxYzhmMmZkNGM4OTQyYzQ0YmRiMmY1Y2E0ZDhhZThlNTc1ZWQzZWIzNGMxOGE4NmU5M2IifX19
turtle:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MGE0MDUwZTdhYWNjNDUzOTIwMjY1OGZkYzMzOWRkMTgyZDdlMzIyZjlmYmNjNGQ1Zjk5YjU3MThhIn19fQ==
phantom:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YWQyZmE1NjE4NDQ3NzYyZTI2MTExZTA2MGRjNTkzZWE2MjJkNWRkZmMzODVkN2U0MjUzMmU0NjMyN2Y4MDdjMCJ9fX0=
- 100:Default:NDExZDI1YmNkYWJhZmFkNWZkNmUwMTBjNWIxY2Y3YTAwYzljY2E0MGM1YTQ2NzQ3ZjcwNmRjOWNiM2EifX19
cod:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NmY5OWI1ODBkNDVhNzg0ZTdhOTY0ZTdkM2IxZjk3Y2VjZTc0OTExMTczYmQyMWMxZDdjNTZhY2RjMzg1ZWQ1In19fQ==
salmon:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YWRmYzU3ZDA5MDU5ZTQ3OTlmYTkyYzE1ZTI4NTEyYmNmYWExMzE1NTc3ZmUzYTI3YWVkMzg5ZTRmNzUyMjg5YSJ9fX0=
pufferfish:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YTk1NTkzODg5OTNmZTc4MmY2N2JkNThkOThjNGRmNTZiY2Q0MzBlZGNiMmY2NmVmNTc3N2E3M2MyN2RlMyJ9fX0=
tropical_fish:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MzZkMTQ5ZTRkNDk5OTI5NjcyZTI3Njg5NDllNjQ3Nzk1OWMyMWU2NTI1NDYxM2IzMjdiNTM4ZGYxZTRkZiJ9fX0=
drowned:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NTZkYWY1MGVhZjc2YzNhNmQ1YWQzOWM5NjZmMjk4NzdiOTFkOTUwZGQxZTM3MTIyZTljODE5NTg1Yzg5ZDkyZSJ9fX0=
- 100:Default:YzNmN2NjZjYxZGJjM2Y5ZmU5YTYzMzNjZGUwYzBlMTQzOTllYjJlZWE3MWQzNGNmMjIzYjNhY2UyMjA1MSJ9fX0=
- 100:Default:MWY4YmFhNDhiOGY1MTE5OTBlNDdkYjk2ODMyNGMxNTJiZDExNjc3MzFkZGYwMzQ1MzAwNDQ3MzVhNmJkMmVkNCJ9fX0=
- 100:Default:YzFhNzMyNTI0MDFhNmU5NDZmNjFkYmFjMGUwMjdkMTgzZTBhY2U1ODc1MmZhMTVhNjRkMjQ0OWZjZjUwODdiNyJ9fX0=
- 100:Default:ZmIxNTMxYzA0ZTI1ZDdmYTY0NTc2OTgyNjg0OTFjYjg5NmQzMzAyZDI2ODg0ZmNmZGYxYTBiMmY5MmQ3N2M4ZiJ9fX0=
- 100:Default:Yzg0ZGY3OWM0OTEwNGIxOThjZGFkNmQ5OWZkMGQwYmNmMTUzMWM5MmQ0YWI2MjY5ZTQwYjdkM2NiYmI4ZTk4YyJ9fX0=
dolphin:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:OGU5Njg4Yjk1MGQ4ODBiNTViN2FhMmNmY2Q3NmU1YTBmYTk0YWFjNmQxNmY3OGU4MzNmNzQ0M2VhMjlmZWQzIn19fQ==
cat:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NTg4MDNmMDI3MGY4Y2RmNGUwZmU5NzMyZDQ5NjdjY2NjMGEyZjRmY2QxMThjZDE1MDAwOTc5YjE4ODg1MTQ0ZiJ9fX0=
- 100:Default:N2M5Yjc0MDllN2I1MzgzYzE5YjM2MmIyYTBjYjQzZDUwOTNiMTNlMmIyMzRlOGExODkxNTYzZTU1ZWFlOWQ2OCJ9fX0=
panda:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZDE4OGM5ODBhYWNmYTk0Y2YzMzA4ODUxMmIxYjk1MTdiYTgyNmIxNTRkNGNhZmMyNjJhZmY2OTc3YmU4YSJ9fX0=
pillager:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NGFlZTZiYjM3Y2JmYzkyYjBkODZkYjVhZGE0NzkwYzY0ZmY0NDY4ZDY4Yjg0OTQyZmRlMDQ0MDVlOGVmNTMzMyJ9fX0=
ravager:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MWNiOWYxMzlmOTQ4OWQ4NmU0MTBhMDZkOGNiYzY3MGM4MDI4MTM3NTA4ZTNlNGJlZjYxMmZlMzJlZGQ2MDE5MyJ9fX0=
- 100:Default:M2I2MjUwMWNkMWI4N2IzN2Y2MjgwMTgyMTBlYzU0MDBjYjY1YTRkMWFhYjc0ZTZhM2Y3ZjYyYWE4NWRiOTdlZSJ9fX0=
trader_llama:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODQyNDc4MGIzYzVjNTM1MWNmNDlmYjViZjQxZmNiMjg5NDkxZGY2YzQzMDY4M2M4NGQ3ODQ2MTg4ZGI0Zjg0ZCJ9fX0=
- 100:Default:YmU0ZDhhMGJjMTVmMjM5OTIxZWZkOGJlMzQ4MGJhNzdhOThlZTdkOWNlMDA3MjhjMGQ3MzNmMGEyZDYxNGQxNiJ9fX0=
- 100:Default:NzA4N2E1NTZkNGZmYTk1ZWNkMjg0NGYzNTBkYzQzZTI1NGU1ZDUzNWZhNTk2ZjU0MGQ3ZTc3ZmE2N2RmNDY5NiJ9fX0=
wandering_trader:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NWYxMzc5YTgyMjkwZDdhYmUxZWZhYWJiYzcwNzEwZmYyZWMwMmRkMzRhZGUzODZiYzAwYzkzMGM0NjFjZjkzMiJ9fX0=
fox:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MjRhMDM0NzQzNjQzNGViMTNkNTM3YjllYjZiNDViNmVmNGM1YTc4Zjg2ZTkxODYzZWY2MWQyYjhhNTNiODIifX19
- 100:Default:YjZmZWI3NjFiMmY1OWZhYmU1Y2MzY2M4MmE5MzRiNTM0ZWE5OWVkYjkxMzJjY2RhOWY0ODRiZDU5ODZkNyJ9fX0=
- 100:Default:MTZkYjdkNTA3Mzg5YTE0YmJlYzM5ZGU2OTIyMTY1YjMyZDQzNjU3YmNiNmFhZjRiNTE4MjgyNWIyMmI0In19fQ==
bee:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:OTlkYzNmMDBlY2FiMjI0OWJiNmExNmM4YzUxMTVjZWI5ZjIzMjA1YTBkNTVjYzBlOWJhYmQyNTYyZjc5NTljNCJ9fX0==
- 100:Default:ZTZiNzRlMDUyYjc0Mjg4Nzk5YmE2ZDlmMzVjNWQwMjIxY2Y4YjA0MzMxNTQ3ZWMyZjY4ZDczNTk3YWUyYzliIn19fQ==
- 100:Default:YmIxNzc3NDY2MjUxMmQ3ODdlZjc3YjFhNDZhMDRlMmM2ZmQ2Nzc5NGJmN2Y3Nzk1NjZlYjIxYzgxNDNhYWQ5ZSJ9fX0=
- 100:Default:OTQ3MzIyZjgzMWUzYzE2OGNmYmQzZTI4ZmU5MjUxNDRiMjYxZTc5ZWIzOWM3NzEzNDlmYWM1NWE4MTI2NDczIn19fQ==
hoglin:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:OWJiOWJjMGYwMWRiZDc2MmEwOGQ5ZTc3YzA4MDY5ZWQ3Yzk1MzY0YWEzMGNhMTA3MjIwODU2MWI3MzBlOGQ3NSJ9fX0=
piglin:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:OWYxODEwN2QyNzVmMWNiM2E5Zjk3M2U1OTI4ZDU4NzlmYTQwMzI4ZmYzMjU4MDU0ZGI2ZGQzZTdjMGNhNjMzMCJ9fX0=
strider:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MThhOWFkZjc4MGVjN2RkNDYyNWM5YzA3NzkwNTJlNmExNWE0NTE4NjY2MjM1MTFlNGM4MmU5NjU1NzE0YjNjMSJ9fX0=
zoglin:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZTY3ZTE4NjAyZTAzMDM1YWQ2ODk2N2NlMDkwMjM1ZDg5OTY2NjNmYjllYTQ3NTc4ZDNhN2ViYmM0MmE1Y2NmOSJ9fX0=
piglin_brute:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:M2UzMDBlOTAyNzM0OWM0OTA3NDk3NDM4YmFjMjllM2E0Yzg3YTg0OGM1MGIzNGMyMTI0MjcyN2I1N2Y0ZTFjZiJ9fX0=
axolotl:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZThhOGEyZDdjY2YwYzM3NDZlMjNhYjU0OTEwNzBlMDkyM2YwNWIyMzVmOWEyZjVkNTNkMzg0MzUzODUzYmRkYyJ9fX0=
glow_squid:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:MmVjZDBiNWViNmIzODRkYjA3NmQ4NDQ2MDY1MjAyOTU5ZGRkZmYwMTYxZTBkNzIzYjNkZjBjYzU4NmQxNmJiZCJ9fX0=
goat:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:M2E0OTg2ZmRmMDRjYzg2ZDhhZmYyMDM3YTZiNGRmNTczY2RjMWU3MDhkMDU3OTBjNzY3MjhmYWVmNzk2ZjMzYSJ9fX0=
allay:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YmVlYTg0NWNjMGI1OGZmNzYzZGVjZmZlMTFjZDFjODQ1YzVkMDljM2IwNGZlODBiMDY2M2RhNWM3YzY5OWViMyJ9fX0==
frog:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ZDBlZGNiODk4MzU2ZmQ0MDBjMjA1YzYxMzRlMDk4NjEwYmFmYmJjNTA0MTc3MjlhMTU1Y2U3N2Q3YmNhOThkNCJ9fX0=
tadpole:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:YjIzZWJmMjZiN2E0NDFlMTBhODZmYjVjMmE1ZjNiNTE5MjU4YTVjNWRkZGQ2YTFhNzU1NDlmNTE3MzMyODE1YiJ9fX0=
warden:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NmNmMzY3NGIyZGRjMGVmN2MzOWUzYjljNmI1ODY3N2RlNWNmMzc3ZDJlYjA3M2YyZjNmZTUwOTE5YjFjYTRjOSJ9fX0=
camel:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:NzRiOGEzMzNkZmE5MmU3ZTVhOTVhZDRhZTJkODRiMWJhZmEzM2RjMjhjMDU0OTI1Mjc3ZjYwZTc5ZGFmYzhjNCJ9fX0=
sniffer:
DropChance: 1.0
LowerWithEachDrop: 50.0
Heads:
- 100:Default:ODdhZDkyMGE2NmUzOGNjMzQyNmE1YmZmMDg0NjY3ZTg3NzIxMTY5MTVlMjk4MDk4NTY3YzEzOWYyMjJlMmM0MiJ9fX0=

View File

@@ -0,0 +1,28 @@
storage:
# 存储模式,可以是 MySQL 或 sqlite
# 请注意不要在多个服使用同一个数据存储table
method: sqlite
mysql:
# Mysql 设置.
username: root
password: ''
hostname: localhost:3306
database: minecraft
# 合法字符包含 a-z 0-9 以及 _
tablePrefix: CMI_
# 如果你不知道这是做什么的,就别动
autoReconnect: true
useSSL: false
verifyServerCertificate: false
# 自动保存时间间隔,单位是秒
# 表示多长时间会自动往数据库写入一次
# 如果没有需要保存的内容,则不会写入
# 最好设置的小一些最好小于60秒
# 最小间隔是 10 秒
AutoSaveInterval: 15
# 当玩家登出服务器,将强制将其信息保存至数据库,无任何拖延
ForceSaveOnLogOut: false
# 【正在开发】这个功能在BC模式下问题很多
# 当玩家登入服务器,强制从数据库读取玩家数据
# 设置为 false 则会使用预加载的数据,这样子更高效
ForceLoadOnLogIn: false

View File

@@ -0,0 +1,32 @@
# 自定义死亡提示语
# 请查看 DeathMessages 文件夹来具体配置相关死亡提示语
# 开启自定义死亡提示
# 请注意目前本插件也许尚未涵盖全部种类死法
# 若想上报新的死法,请使用 github issue 来上报,并在其中展示新死法的触发方式
EnableCustom: false
# 若服务器玩家数量超过一定数字时,为了防止刷屏,自动隐藏全部死亡提示语
# 设置为 -1 禁用
AutoHideFrom: -1
# 玩家死亡时,死亡提示语播报的半径距离范围,设置为 -1 禁用此机制
# 请注意,若使用此机制,播报范围将除外其它世界的玩家(仅限本世界特定范围玩家可见)
Range: -1
# 死亡消息用什么来展示?
# 可选: 聊天栏plain, actionBar
Destination: plain
# 玩家若在以下世界死亡,死亡提示语永远不会显示
DisabledWorlds:
- ''
# 玩家若在以下世界中,将不会看到任何死亡提示语
MutedWorlds:
- ''
# 以下ID的玩家死亡不会有任何提示语
IgnoredPlayers:
- ''
AntiSpam:
# 为了防止死亡消息刷屏,可给死亡消息显示加上时间间隔限制,单位是秒
# 设置为 -1 禁用此机制
# 请注意:这个限制仅对其他玩家生效,对自己无效,玩家自己无论何时都可以看到自己的死亡提示语,但其他玩家看到提示语受到时间限制
TimeRange: 30
# 在以上时间间隔内,其他玩家最多可以看到几条提示语?
Count: 3

View File

@@ -0,0 +1,153 @@
# 当某些事件发生时,触发一些指令
# 支持彩色代码和变量
# 如果指令开头是 msg! 而且指令中有玩家名,如果该玩家在线,玩家将收到该消息
# 如果指令开头是 broadcast! 那么消息将会被发送到全服玩家
# 如果指令开头是 actionbar! 那么消息将以actionbar消息的形式会被发送到全服玩家
# 如果指令开头是 title! 那么消息将以Title消息的形式会被发送到全服玩家
# 如果指令开头是 subtitle! 那么消息将以subtitle消息的形式会被发送到全服玩家
# 如果指令开头是 kickall! 那么玩家将被全部踢出
# 如果指令开头是 perm:[权限名]! 那么拥有此权限的玩家将会看到消息,当目标玩家未指定时此项将失效,举例: perm:cmi.announce.vip! broadcast! 如果你能看到此消息说明你是VIP玩家
# [playerName] 代表目标玩家
# [playerDisplayName] 代表目标玩家的显示名
# [lvl] 玩家等级
# [exp] 玩家经验
# [hp] 玩家当前血量
# [maxHp] 玩家最大血量
# [hunger] 玩家饥饿度
# [gameMode] 玩家游戏模式
# 有一点需要特别说明的是玩家进服 joinServer 执行的指令不会用于玩家第一次进服 firstJoinServer
# ATTENTION!
# 一些过于常见的事件若频繁触发指令可能导致服务器占用过大,请不要给一个事件设置太多触发指令
# 必须要执行多个指令的话,可以加一个 "delay! 0.3" 来让指令与指令之间有个延迟
# 第一次进服
firstJoinServer:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
joinServer:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
quitServer:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerDeath:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
SourceCommands: []
playerKillPlayer:
# [sourceName] 玩家名
# [sourceDisplayName] 玩家显示名
# [sourceLvl] 玩家等级
# [sourceExp] 玩家总经验
# [sourceHp] 玩家血量
# [sourceMaxHp] 玩家最大血量
# [sourceHunger] 玩家饥饿值
# [sourceGameMode] 玩家游戏模式
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
SourceCommands: []
playerRespawn:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerTeleport:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
bedLeave:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
bedEnter:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerWorldChange:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerPreWorldChange:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerGameModeChange:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerKick:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerBan:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
playerLevelChange:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
voidFall:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
elytraStartGlide:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
advancementDone:
# 可使用变量 [value] 来具体指定成就名称
# 该变量返回的是成就的路径,例如 recipes/building_blocks/emerald_block
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
elytraEndGlide:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
sneakingSwapHandItems:
Enabled: false
# Item swap event can be canceled if needed. This only works if event monitor is enabled
CancelEvent: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
swapHandItems:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
pvpstart:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!
pvpend:
Enabled: false
Commands:
- cmi msg [playerName] 此为事件测试消息!
- cmi actionbarmsg [playerName] 此为事件测试消息!

View File

@@ -0,0 +1,95 @@
Homes:
# 当玩家设置新家名称,但相同名称的家已经存在时,是否显示一条可点击消息要求玩家确认
# 设置家时使用指令 /cmi sethome [homeName] -override 可直接跳过这一确认
Confirmation: true
# 当玩家使用指令 /sethome [homeName] [slotNumber] 创建家时,最多可以创建多少个序号?
MaxGuiSlots: 99
Gui:
# 当玩家有多个家且使用指令 /cmi home 时打开GUI菜单
Use: true
# 是否启用更复杂的家GUI菜单
# 简单版:菜单里只有各个家,复杂版:有更多可操作按钮
Complex: true
Options:
# 是否拓展菜单中可容纳家的数量从10拓展至28
Expanded: false
# 菜单中的空位使用什么物品填充?若留空则使用全局设置
Border: ''
# 未拓展的家的空位使用什么物品填充?
Infill: WHITE_STAINED_GLASS_PANE
InfoButton:
# “信息”按钮,会显示家的相关信息
Use: false
Slot: 1
Material: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDZiYTYzMzQ0ZjQ5ZGQxYzRmNTQ4OGU5MjZiZjNkOWUyYjI5OTE2YTZjNTBkNjEwYmI0MGE1MjczZGM4YzgyIn19fQ==
Commands:
- closeinv!
CloseButton:
# “关闭”按钮
Use: true
Slot: 9
Material: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmNjYmY5ODgzZGQzNTlmZGYyMzg1YzkwYTQ1OWQ3Mzc3NjUzODJlYzQxMTdiMDQ4OTVhYzRkYzRiNjBmYyJ9fX0=
Commands:
- closeinv!
bedButton:
Use: true
Slot: 4
Material: LIGHT_BLUE_BED
homeButton:
Use: true
Slot: 5
Material: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTJkN2E3NTFlYjA3MWUwOGRiYmM5NWJjNWQ5ZDY2ZTVmNTFkYzY3MTI2NDBhZDJkZmEwM2RlZmJiNjhhN2YzYSJ9fX0=
deathButton:
Use: true
Slot: 6
Material: TOTEM_OF_UNDYING
backButton:
Use: true
Slot: 7
Material: BONE
prevButton:
Slot: 46
middleButton:
Slot: 50
nextButton:
Slot: 54
# 此项设置与玩家设置家相关,每个组玩家可设置的家的数量不同,相关权限: cmi.command.sethome.[组名]
# 如果玩家没有设置组,默认只能设置 1 个家
# 如果想让玩家设置无限个家,给权限 cmi.command.sethome.unlimited
# 你也可以直接给单个玩家权限 cmi.command.sethome.[最大数量] 来直接设置单个玩家最大家的数量
Groups:
Newbie: 2
Advanced: 3
Vip: 5
# 需要权限 cmi.bedhome
# 此设置会把玩家上一次交互过的床设置为家
# 设置为false则使用MC原版的床的机制
BedInteraction: true
# 设置为 true, 玩家只有按住Shift并点击床时才能设家
onlyShiftBed: false
# 当玩家用上述方法将床所在位置设置为家后,是否移除玩家已保存的床的地点
RemoveBedLocationOnBedBreak: true
# 如果启用此项CMI在给玩家设家之前会检查玩家有无破坏此区域方块的权限
# 这可以阻止玩家在一些保护区域内设家
# 有以下权限的玩家无视此限制: cmi.command.sethome.bypass
CheckBlockBreak: false
# 默认家的名称,默认是 "Home"
DefaultName: Home
# 默认点击床所设置的家的名称,默认是 "Home"
DefaultBedName: Home
# 可以用来作为家的名字的正则限制
ValidNameRegex: '[^a-zA-Z0-9\-\_]'
WorldLimits:
# 是否启用世界组限制,同一个世界组里可以设置的家数量有限制
# 一个世界组里可以设置一个或者多个世界
Use: false
Groups:
Example1:
Amount: 3
Worlds:
- testWorld世界里只能设置3个家
Example2:
Amount: 5
Worlds:
- testWorld2这俩世界
- testWorld3共享5个家

View File

@@ -0,0 +1,275 @@
# 本插件提供了很多机制如果某些机制你根本用不上类似mirror镜像仿建不会吧不会吧不会真有人用这么蠢的功能吧
# 你可以在此将其完全关闭,来节省服务器占用
# 请注意,在这里关闭了机制即视为机制已经【完全】关闭,之后你在服务器里是无论如何都唤醒不了它们的
# 在这里做了修改必须重启服务器才能生效
# 一旦机制被禁用,相关的指令也一并被禁用
# 而且指令等同于【完全】被禁用无法在Tab列表里显示就如同它们根本不存在一样
#
# 静默开箱子
# 仅在 1.7.x 以上版本生效
silentChest: true
#
# 玩家登陆时检查服务器版本
# 仅在 1.7.x 以上版本生效
versionCheck: true
#
# 以下机制的世界限制: fly飞行, game mode切换以及 god mode上帝模式
# 仅在 1.7.x 以上版本生效
worldLimits: true
#
# 以下机制的世界限制: 鞘翅飞行
# 仅在 1.9.x 以上版本生效
worldLimitsElytra: true
#
# 登陆、登出以及死亡消息
# 仅在 1.7.x 以上版本生效
customMessages: true
#
# 第一次进服欢迎语
# 仅在 1.7.x 以上版本生效
firstJoinMessages: true
#
# /cuff指令相关
# 仅在 1.7.x 以上版本生效
cuffed: true
#
# 电梯相关
# 仅在 1.7.x 以上版本生效
elevator: true
#
# 睡觉与夜晚加速
# 仅在 1.7.x 以上版本生效
nightSpeedup: true
#
# 伤害控制相关
# 仅在 1.7.x 以上版本生效
damageControl: true
#
# 传送门创建
# 仅在 1.7.x 以上版本生效
portalCreation: true
#
# 传送相关
# 仅在 1.7.x 以上版本生效
teleportWith: true
#
# 当物品耐久值变化时的提示语
# 仅在 1.7.x 以上版本生效
durabilityLoss: true
#
# 镜像仿建机制即mirror
# 仅在 1.7.x 以上版本生效
mirror: true
#
# 刷怪笼相关, 比如放置、挖掘、使用刷怪蛋更改等
# 仅在 1.7.x 以上版本生效
spawners: true
#
# 靠近刷怪笼
# 仅在 1.7.x 以上版本生效
spawnerProximity: true
#
# 更改刷怪笼
# 仅在 1.7.x 以上版本生效
spawnerCharge: true
#
# 指令延迟机制
# 仅在 1.7.x 以上版本生效
warmup: true
#
# 指令冷却机制
# 仅在 1.7.x 以上版本生效
cooldown: true
#
# 交互性指令(比如木牌)
# 仅在 1.7.x 以上版本生效
interactiveCommands: true
#
# 附属性指令比如RPG物品
# 仅在 1.7.x 以上版本生效
attachedCommands: true
#
# 护甲效果
# 仅在 1.7.x 以上版本生效
armorEffects: true
#
# 聊天艾特机制
# 仅在 1.7.x 以上版本生效
playerChatTag: true
#
# 聊天气泡
# 仅在 1.19.4 以上版本生效
chatBubble: true
#
# TAB玩家列表
# 仅在 1.7.x 以上版本生效
tablist: true
#
# Shift+右键编辑画
# 仅在 1.7.x 以上版本生效
paintingEditor: true
#
# 隐身机制
# 仅在 1.7.x 以上版本生效
vanish: true
#
# 支票机制
# 仅在 1.7.x 以上版本生效
moneyCheque: true
#
# 盔甲架编辑机制
# 仅在 1.7.x 以上版本生效
armorstand: true
#
# CMI玩家游戏时间记录机制
# 仅在 1.7.x 以上版本生效
cmiPlaytime: true
#
# 全息悬浮字更新机制
# 仅在 1.7.x 以上版本生效
holograms: true
#
# 传送门机制
# 仅在 1.7.x 以上版本生效
portals: true
#
# 设置床为家以及拆除床时删除家. 禁用此机制不影响home指令
# 仅在 1.7.x 以上版本生效
homeInteractions: true
#
# 动态木牌
# 仅在 1.7.x 以上版本生效
dynamicSigns: true
#
# 木牌编辑
# 仅在 1.20.x 以上版本生效
signEdit: true
#
# 动态皮革衣服
# 仅在 1.7.x 以上版本生效
coloredArmor: true
#
# 实体()怪物 不攻击人机制,相关指令/cmi notarget
# 仅在 1.7.x 以上版本生效
noTarget: true
#
# 升级系统rankups
# 仅在 1.7.x 以上版本生效
ranks: true
#
# votifier投票机制
# 仅在 1.7.x 以上版本生效
votifier: true
#
# 玩家战斗模式机制
# 仅在 1.7.x 以上版本生效
playerCombat: true
#
# 头颅掉落机制
# 仅在 1.7.x 以上版本生效
headDrop: true
#
# kits礼包机制
# 仅在 1.7.x 以上版本生效
kits: true
#
# schedule时间表机制
# 仅在 1.7.x 以上版本生效
schedule: true
#
# 玩家头顶称号机制
# 仅在 1.7.x 以上版本生效
namePlates: true
#
# 监狱机制
# 仅在 1.7.x 以上版本生效
jail: true
#
# 飞行能量机制
# 仅在 1.7.x 以上版本生效
flightCharge: true
#
# 潜影箱背包机制
# 仅在 1.11.x 以上版本生效
shulkerBackpack: true
#
# 装饰的花盆展示
# 仅在 1.20.x 以上版本生效
decoratedpot: true
#
# 玩家皮肤机制
# 仅在 1.8.x 以上版本生效
skin: true
#
# 区域选择,若此机制被禁用相关指令仍然可用
# 仅在 1.7.x 以上版本生效
selection: true
#
# 玩家和怪物的血量条和bossbar血条机制
# 仅在 1.9.x 以上版本生效
hpBossBar: true
#
# afk离开机制
# 仅在 1.7.x 以上版本生效
afk: true
#
# 限时权限机制 类似tfly 和 tgod
# 仅在 1.7.x 以上版本生效
timedCommands: true
#
# eventCommands.yml 相关机制
# 仅在 1.9.x 以上版本生效
eventCommands: true
#
# 背包内附魔
# 仅在 1.7.x 以上版本生效
disabledEnchants: true
#
# 椅子机制
# 仅在 1.8.x 以上版本生效
sitAnimation: true
#
# 骑人机制
# 仅在 1.7.x 以上版本生效
rideAnimation: true
#
# bossbar指南针机制
# 仅在 1.9.x 以上版本生效
bossBarCompass: true
#
# 鞘翅加速机制
# 仅在 1.9.x 以上版本生效
elytraBoost: true
#
# 鞘翅火箭机制
# 仅在 1.9.x 以上版本生效
elytraLaunch: true
#
# 检测滥用原版特性, 类似使用潮涌附魔来无限飞行或者自己用箭朝天射自己
# 仅在 1.9.x 以上版本生效
elytraExploit: true
#
# 自定义不死图腾机制
# 仅在 1.11.x 以上版本生效
totemBehavior: true
#
# 铁砧重命名以及彩色重命名
# 仅在 1.9.x 以上版本生效
anvilRenameColor: true
#
# 跳板机制
# 仅在 1.7.x 以上版本生效
launchPad: true
#
# 自定义死亡消息
# 仅在 1.7.x 以上版本生效
deathMessages: true
#
# 子服互联
# 仅在 1.7.x 以上版本生效
serverLinks: true
#
# 把方块作为帽子戴在头上
# 仅在 1.7.x 以上版本生效
hat: true

View File

@@ -0,0 +1,146 @@
# 如果你想彻底禁用某个粒子效果,只需设置为空即可 ""
# 更多粒子效果相关设置请参考 https://www.zrips.net/cmi/extra/particles/
Particles:
Enabled: true
TotemHalo: circle;effect:reddust;c:255,255,10;twist;part:3;offset:0,2,0;pitch:90;radius:0.3;interval:2
Healing: circle;effect:heart;dur:0.1;part:1;offset:0,1.7,0;radius:0.3
GlyphHead: circle;effect:flying_glyph;dur:5;pitchc:15;part:10;offset:0,1.7,0;radius:0.5;yawc:12;color:rs;pitch:90
tpaWarmup: circle;effect:flying_glyph;dur:5;pitchc:15;part:10;offset:0,1.7,0;radius:0.5;yawc:12;color:rs;pitch:90
GColumn: circle;c:0,255,0;twist;part:5;r:0.75;pitch:90;move:0,0.1,0;rc:-0.02
SmallBoop: circle;effect:flying_glyph;yaw:[playerName];pitch:[playerName];r:0.1;part:3;rc:0.03;mr:0.3;twist
HologramInteraction: circle;effect:flying_glyph;yaw:[playerName];pitch:[playerName];r:0.1;part:3;rc:0.03;mr:0.3;twist
HologramNewInteraction: circle;effect:reddust;r:0;part:2;rc:0.2;mr:1;color:rs;yaw:[playerName];a:90
HologramHover: circle;effect:crit;r:0;part:1;
TpUp: circle;c:200,50,210;twist;part:5;r:0.5;pitch:90;move:0,0.33,0;offset:0,-0.2,0
TpDown: circle;c:150,50,10;part:5;r:0.5;pitch:90;move:0,-0.33,0;offset:0,2.2,0
# 以下设置,从 custom1 到 custom30 你可以自由设置想要的粒子效果,用在一些自定义场合,比如指令延迟
custom1: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom2: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom3: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom4: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom5: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom6: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom7: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom8: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom9: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom10: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom11: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom12: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom13: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom14: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom15: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom16: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom17: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom18: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom19: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom20: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom21: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom22: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom23: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom24: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom25: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom26: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom27: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom28: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom29: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
custom30: circle;effect:reddust;dur:5;pitchc:5;part:10;offset:0,1,0;radius:1;yawc:4
# 玩家做各种行为时播放的粒子动画From代表“该活动开始时”To代表“该活动结束时”
# 如果你不需要这一特性可设置为空
# 动画的名称必须来自上面 Particles 部分的设置名称,比如 TpUp
TeleportEffects:
Unknown:
From: ''
To: ''
Elevator:
From: ''
To: ''
SafeLogin:
From: ''
To: ''
Spawn:
From: ''
To: ''
NetherRoof:
From: ''
To: ''
BelowBedrock:
From: ''
To: ''
Back:
From: ''
To: ''
DBack:
From: ''
To: ''
Home:
From: ''
To: ''
Jump:
From: ''
To: ''
Patrol:
From: ''
To: ''
Portal:
From: ''
To: ''
WarmUp:
From: ''
To: ''
Biome:
From: ''
To: ''
FlightCharge:
From: ''
To: ''
InvEdit:
From: ''
To: ''
TimedCommand:
From: ''
To: ''
TpaAll:
From: ''
To: ''
Tp:
From: ''
To: ''
Bungee:
From: ''
To: ''
Top:
From: ''
To: ''
Down:
From: ''
To: ''
TpAll:
From: ''
To: ''
TpHere:
From: ''
To: ''
TpPos:
From: ''
To: ''
TpoPos:
From: ''
To: ''
Warp:
From: ''
To: ''
JoinSpawn:
From: ''
To: ''
Totem:
From: ''
To: ''
randomTp:
From: ''
To: ''
World:
From: ''
To: ''
HoloEdit:
From: ''
To: ''

View File

@@ -0,0 +1,77 @@
hourly1:
DisplayName: "&7小时奖励"
# 是否自动获得,而不需要手动领取
AutoClaim: true
Description:
- "&2每小时都有在线奖励"
- "&2免费治疗+20金币"
# 多少秒可领
PayEvery: 3600
Commands:
- asConsole! cmi heal [playerName] -s
- asConsole! cmi money give [playerName] 20
daily1:
DisplayName: "&7每日奖励"
AutoClaim: true
Description:
- "&2别忘了每天的在线奖励"
- "&2每天只能领一次的100金币喔"
PayEvery: 86400
Commands:
- asConsole! cmi money give [playerName] 100
1hour:
DisplayName: "&f1小时奖励"
AutoClaim: false
Description:
- "&2你已经在线1小时了"
- "&2你获得了500金币"
PayFor: 3600
Commands:
- asConsole! cmi money give [playerName] 500
6hour:
DisplayName: "&f6小时奖励"
AutoClaim: false
Description:
- "&2你已经在线6小时了"
- "&2你获得了2000金币"
PayFor: 21600
Commands:
- asConsole! cmi money give [playerName] 2000
12hour:
DisplayName: "&f12小时奖励"
AutoClaim: false
Description:
- "&2你已经在线12小时了"
- "&2你获得了5000金币"
PayFor: 43200
Commands:
- asConsole! cmi money give [playerName] 5000
24hour:
DisplayName: "&f24小时奖励"
AutoClaim: false
Description:
- "&2你已经在线24小时了"
- "&2你获得了15000金币"
PayFor: 86400
Commands:
- asConsole! cmi money give [playerName] 15000
7days:
DisplayName: "&f每周奖励"
AutoClaim: false
Description:
- "&2连续保持在线七天"
- "&2有200金币奖励"
PayFor: 604800
Commands:
- asConsole! cmi money give [playerName] 200
30days:
DisplayName: "&f月度奖励"
AutoClaim: false
Description:
- "&2真棒你已经在线一个月了"
- "&2你获得了500金币喔"
PayFor: 2592000
Commands:
- asConsole! cmi money give [playerName] 500

View File

@@ -0,0 +1,107 @@
RandomTeleportation:
# 随机传送指令冷却时间
Cooldown: 5
# 插件会尝试多少次以寻找安全的随机传送地点
# 尽量设置的低一些,即便一次没有找到安全坐标,玩家还可以多次尝试, as player always can try again after delay
MaxTries: 20
# 以下生物群系不会被传送到
ExcludedBiomes:
- Ocean
- Deep ocean
- Deep cold ocean
- Cold ocean
- Deep lukewarm ocean
- Lukewarm ocean
- Warm ocean
- River
# 设置为true将自动为识别到的所有世界设置随机传送设置
# 设置为false则不会有自动设置但你可以手动将世界设置添加到下方
AutoGenerateWorlds: true
Worlds:
world:
# 启用随机传送
Enabled: true
MaxTries: 0
# 最大半径和最小半径
Range:
Max: 1000
Min: 500
# 随机传送中心XZ坐标
Center:
X: 0
Z: 0
# 随机传送范围是否是圆形设置为false则为方形
Circle: false
# 是否不会传送到水里/岩浆里/树叶上/细雪里,或者自定义的方块表面,或者特定生物群系
Ignore:
Water: true
Lava: true
Leaves: true
PowderSnow: false
CrawlSpaces: false
Materials: []
Biomes: []
# 优先考虑传送到的生物群系
PreferredBiomes: []
# 是否只传送到地表
SurfaceOnly: false
# 允许传送到别的世界
FromAnotherWorld: true
# 需要传送到世界的权限
RequireWorldPermission: false
# 允许传送到的Y轴高度
YLimits:
Min: -64
Max: 320
world_nether:
Enabled: true
MaxTries: 0
Cooldown: 0
Range:
Max: 1000
Min: 500
Center:
X: 0
Z: 0
Circle: false
Ignore:
Water: true
Lava: true
Leaves: true
PowderSnow: false
CrawlSpaces: false
Materials: []
Biomes: []
PreferredBiomes: []
SurfaceOnly: false
FromAnotherWorld: true
RequireWorldPermission: false
YLimits:
Min: 0
Max: 128
world_the_end:
Enabled: true
MaxTries: 0
Cooldown: 0
Range:
Max: 1000
Min: 500
Center:
X: 0
Z: 0
Circle: false
Ignore:
Water: true
Lava: true
Leaves: true
PowderSnow: false
CrawlSpaces: false
Materials: []
Biomes: []
PreferredBiomes: []
SurfaceOnly: false
FromAnotherWorld: true
RequireWorldPermission: false
YLimits:
Min: 0
Max: 256

View File

@@ -0,0 +1,215 @@
# 请确认服务器根目录中 spigot.yml 中的设置项为关闭 stats->disable-saving: false
# 玩家会根据此权限 cmi.rank.[groupName] 来获得最基础的军衔ranks汉化者注Ranks在本文中暂译为“军衔”
# 未启用的军衔将被忽略
# DisplayName 设置项可设可不设,其会在游戏内展示军衔的名称,请注意这是“展示”名称,请不要在指令或者权限中使用“展示”名称,应该使用本来的名称
# DefaultRank 设置项决定的是若一个玩家不存在任何军衔,其是否可被安排入此默认军衔,默认军衔可不止一个(和权限挂钩)
# PermissionRequirement 设置项决定若玩家要升级至此军衔需要的权限,另外 - 对于每个权限可以在后面加一个: 并跟上来自 /cmi rankinfo 的名称,举个例子 cmi.command.fly:Fly
# McMMORequirement 列举了要升到此等级所需的 McMMO 技能及其等级
AureliumRequirement 列举了要升到此等级所需的 Aurelium 技能及其等级
# AuraSkillsRequirement 列举了要升到此等级所需的 Aura 技能及其等级
# McMMO 和 Aurelium 两个插件可以把技能名称设置为Power以代表全部技能
# JobsRequirement 列举了要升到此等级所需的 Jobs 职业及其等级
# ItemRequirement 列举了要升到此等级所需的物品数量,当玩家成功升级后物品将被从背包内扣除
# AutoRankup 代表升级是否是自动的,注意,若升级路线面临分叉,玩家必须手动确定往哪个分叉方向升级
# RankupConfirmation 代表升级是否需要手动确定,以避免误操作导致意外升级,即便自动升级已经打开,玩家仍然需要手动确认才能升级
# NextRanks 将列出当前等级可以升到的下一级名称,可以是一条线也可以是多条岔路,注意:所有岔路升级信息都会全部显示出来,如果岔路过多,可能影响显示
# MoneyCost 显示了要升到此等级所需的金钱
# ExpCost 显示了要升到此等级所需的经验值
# Votes 显示了要升到此等级所需的votes投票数
# Commands 列举了升到此等级后自动执行的指令
# 最主要的设置项就是 StatsRequirements ,可能里面内容很多:
# 一般来说升级需求的基本格式为 [主需求](:可选的子需求):目标值
# 例如 MonsterKills:100 需要玩家击杀 100 只怪物,而 MonsterKills:Zombie:100 需要玩家击杀100只僵尸
# 以下列出所有升级需求及相关解释:
# 移动距离相关:
# Travel - 总移动距离
# Walk - 行走距离
# Sneak - 潜行距离
# Sprint - 冲刺距离
# Swim - 游泳距离
# Fall - 跌落距离
# Climb - 爬升距离
# Fly - 飞行距离
# Dive - 水下行走距离
# MinecartTravel - 矿车行进距离
# BoatTravel - 船行进距离
# PigTravel - 骑猪距离
# HorseTravel - 骑马距离
# ElytraTravel - 鞘翅飞行距离
# 时间相关:
# PlayTime - 总游戏时间
# FromLastDeath - 自从上次死亡游戏时间
# SneakTime - 潜行时间
# 数量相关:
# GameQuit - 玩家离开服务器的次数
# Jump - 跳跃次数
# DamageDealt - 玩家总共打出伤害
# DamageTaken - 玩家总共受到伤害
# Deaths - 死亡次数
# MobKills - 总共击杀怪物
# PlayerKills - 总共击杀玩家(非直接击杀不算)
# ItemEnchanted - 附魔物品次数
# AnimalsBred - 喂养动物次数
# FishCaught - 捕鱼次数
# TalkedToVillager - 和村民交互次数
# TradedWithVillager - 和村民交易次数
# CakeSlicesEaten - 吃蛋糕片次数
# CauldronFilled - 炼药锅灌水次数
# CouldronUsed - 使用炼药锅次数
# ArmorCleaned - 清洗皮革装备颜色次数
# BannerCleaned - 清洗旗帜颜色次数
# BrewingstandInteractions - 酿造台交互次数
# BeaconInteractions - 信标交互次数
# CraftingTableInteractions - 工作台交互次数
# FurnaceInteractions - 熔炉交互次数
# DispenserInspected - 发射器交互次数
# DropperInspected - 投掷器交互次数
# HopperInspected - 漏斗交互次数
# ChestOpen - 打开箱子
# TrappedChestTriggered - 打开陷阱箱
# EnderchestOpened - 打开末影箱
# NoteblockPlayed - 音符盒播放
# NoteblockTuned - 音符盒调音
# FlowerPotted - 花盆交互次数
# RecordPlayed - 唱片播放次数
# SleeptInBed - 睡在床上次数
# ShulkerBoxOpened - 打开潜影箱
# ItemDropped - 扔出物品次数. 如果未指定具体物品,则所有物品均计数
# ItemPickups - 捡起物品次数. 如果未指定具体物品,则所有物品均计数
# BlocksMined - 挖掘方块次数. 如果未指定具体方块,则所有方块均计数
# BlocksPlaced - 放置方块计数. 如果未指定具体方块,则所有方块均计数
# ItemBreaks - 用坏物品计数. 如果未指定具体物品,则所有物品均计数
# ItemCrafts - 合成物品计数. 如果未指定具体物品,则所有物品均计数
# ItemsUsed - 使用物品计次,比如用斧子砍树. 如果未指定具体物品,则所有物品均计数
# MonsterKills - 击杀怪物计数. 如果未指定具体生物,则所有生物均计数
# KilledBy - 被怪物击杀计数. 如果未指定具体生物,则所有生物均计数
Newbie:
Enabled: true
DisplayName: '&2新手'
DefaultRank: true
AutoRankup: true
NextRanks:
- Branch1
- Branch2
Branch1:
Enabled: true
DisplayName: '&2分支1'
AutoRankup: true
RankupConfirmation: true
Votes: 5
PermissionRequirement:
- cmi.command.fly:Fly
McMMORequirement:
- woodcutting:10
- power:20
JobsRequirement:
- miner:10
- totallevel:20
AuraSkillsRequirement:
- miner:10
- power:20
AureliumRequirement:
- fishing:10
- power:30
ItemRequirement:
- stone:10
- stone:1:20
- book:20
NextRanks:
- Branch1Rank1
MoneyCost: 100
Commands:
- broadcast! &6[playerDisplayName] &e已升级为分支1
StatsRequirements:
- PlayTime:3600
- travel:1000
- MonsterKills:zombie:10
- MonsterKills:slime:5
- MonsterKills:wolf:5
- AccountAge:1209600
Branch1Rank1:
Enabled: true
DisplayName: '&2Branch1Rank1'
DefaultRank: false
AutoRankup: true
RankupConfirmation: false
PermissionRequirement:
- cmi.command.heal:Heal
NextRanks:
- Last
MoneyCost: 300
ExpCost: 350
Commands:
- broadcast! &6[playerDisplayName] &e已升级为 Branch1Rank1 rank!
StatsRequirements:
- travel:10000
- blocksmined:3000
- blocksmined:diamond_ore:30
- MonsterKills:1000
- AccountAge:1209600
McMMORequirement:
- taming:10
- unarmed:30
Branch2:
Enabled: true
DisplayName: '&2Branch2'
AutoRankup: true
RankupConfirmation: true
MoneyCost: 150
NextRanks:
- Branch2Rank1
Commands:
- broadcast! &6[playerDisplayName] &e已升级为 Branch2 rank!
PermissionRequirement:
- cmi.command.tp:Teleport
StatsRequirements:
- PlayTime:3600
- travel:2000
- MonsterKills:zombie:15
- MonsterKills:slime:10
Branch2Rank1:
Enabled: true
DisplayName: '&2Branch2Rank1'
AutoRankup: true
RankupConfirmation: false
MoneyCost: 100
ExpCost: 150
NextRanks:
- Branch2Rank2
Commands:
- broadcast! &6[playerDisplayName] &e已升级为 Branch1Rank1 rank!
StatsRequirements:
- PlayTime:4600
- Swim:1000
- SneakTime:180
- MonsterKills:100
Branch2Rank2:
Enabled: true
DisplayName: '&2Branch2Rank2'
AutoRankup: true
RankupConfirmation: false
MoneyCost: 100
ExpCost: 150
NextRanks:
- Last
Commands:
- broadcast! &6[playerDisplayName] &e已升级为 Branch2Rank2 rank!
StatsRequirements:
- walk:15000
- HorseTravel:1000
- ItemsUsed:10000
- PlayerKills:10
Last:
Enabled: true
DisplayName: '&2Last'
AutoRankup: true
StatsRequirements:
- PlayTime:21600
- walk:30000
- MonsterKills:1000
- blocksmined:30000
Commands:
- broadcast! &6[playerDisplayName] &e已升级为 Last rank!
- cmi heal [playerName]
- money give [playerName] 100

View File

@@ -0,0 +1,81 @@
Scavenge:
ItemBreak:
# 回收附魔书时物品崩坏的几率
# 可设置范围 0 - 100, 设置为 100 代表每次从工具中取回附魔书,物品必定崩坏
# 请注意,如果物品没有附魔,强制取出附魔书将 100% 导致物品崩坏
# 该设置允许玩家从物品中提取附魔
# 若一个物品“崩坏”,将进入合成物返还流程
Base: 8.0
# 若物品含有很多附魔,按照附魔数量增加物品崩坏概率
# 例如,基础概率 8% 附加概率 2 物品拥有3个附魔那么崩坏概率是 8+(2*3)=14%
ForEachEnchant: 2.0
# 按照附魔等级增加物品崩坏概率
# 此概率与最大附魔等级和当前附魔等级有关
# 例如,这里设置为 7.5, 那么如果附魔了一本最高等级的附魔书比如抢夺3失败时有 7.5% 几率导致物品崩坏
# 但如果附魔的是 锋利2 锋利附魔最大等级是锋利5, 那么有 33% 几率失败后物品崩坏
ForEachEnchantLevel: 2.0
# 最高物品崩坏封顶几率
# 任何失败几率不可能超过这一数值以免造成100%物品崩坏的情况发生
MaxBreakChance: 100.0
# 若物品不是满耐久,则增加物品崩坏概率
# 比如设置为 50 代表只剩下 1 耐久的物品,失败几率骤增 50%
# 若为满耐久物品,则不会增加概率
BreakDurabilityCheck: 50.0
# 设置为 true, 返还合成材料时物品的耐久会纳入考虑
# 例如要返还合成材料的工具最大耐久是100当前是 50, 那么只能取出一半合成材料
# 这并不代表玩家一定能获得50%的合成材料只是有50%合成材料进入了下一层计算路径(说人话:也就是还有继续扣的可能性)
DurabilityCheck: true
IngredientReturn:
# 若提取附魔失败,返还合成材料的最大几率
# 每个参与合成此物品的组成物都会被列入计算
# 只有已存在数据库里的合成表才会被纳入计算
Base: 25.0
EnchantExtractionFail:
# 提取附魔书的基础失败几率
# 若附魔失败,玩家将有一定几率无法收回附魔书
Base: 10.0
# 根据附魔书等级来增加失败几率
# 这个设置项与附魔的当前等级与此附魔的最大等级有关
# 例如,这里设置为 75, 那么如果附魔了一本最高等级的附魔书比如抢夺3失败时有 75% 几率无法取回附魔书
# 但如果附魔的是 锋利2 锋利附魔最大等级是锋利5, 那么有 30% 几率失败后无法取回附魔书
# 类似 无限 这种最大附魔等级是1的附魔直接按照最高失败几率来算
ForEachLevel: 10.0
# 最高失败封顶几率
# 任何失败几率不可能超过这一数值以免造成100%失败的情况发生
MaxFailChance: 75.0
LevelLower:
# 如果附魔失败,有多大几率收回的附魔书降级
# 如果是附魔等级为1的附魔书则附魔失败后附魔书直接消失
# 如果你不想让附魔失败后附魔书降级,设置此处为 100
# 如果你想让附魔失败后附魔书100%降级,请设置 EnchantExtractionFail.Base 为 100并设置此设置项也为 100
Base: 50.0
# 附魔书每升一级,附魔失败后降级几率增加百分之多少
# 这说明更高等级的附魔书有更大几率失败后降级
ForEachLevel: 5.0
# 最高失败后降级封顶几率
# 任何降级几率不可能超过这一数值
MaxChance: 75.0
Cost:
# 取回附魔书需要花费金钱的几率,设置为 0 则完全免费
Base: 100.0
# 需要额外花费的金钱附加,和每个附魔的价格有关,可用此指令设置 /cmi setenchantworth
# 这个值用百分比表示,和附魔的价格和物品相关
# 比如你设置了基础花费 100, 额外附加 5% 且你想要取回的是 锋利5 价格1000 而且手中物品的出售价格worth为 100, 那么你总共需要支付 155 来取出附魔100+(1000*5%)+(100*5%) = 155
Extra: 5.0
# 启用此项,将会允许不合法配方的合成物品被取回
# 不建议开启
WithoutIngredients: false
# 不可进行组合物取出的物品材质
BlackList:
- diamond
- ironingot
- goldingot
- coal
- IRON_NUGGET
- GOLD_NUGGET
# 设置为 true, 以上黑名单反转为白名单,只有以上组合物材质可取出
BlackToWhiteList: false
# 设置为 false 当玩家打开取出菜单,他们将无法从地面上捡起物品
AllowItemPickups: false
# 当某些设置物品(比如剑)被回收附魔书之后,是否重置其修理消耗,这样玩家可以将其像新武器一样重新附魔,而不会显示无法附魔
ResetRepairCost: true

View File

@@ -0,0 +1,123 @@
# 你可以设置一些指令,并在一个设置好的时间或者每隔特定时间执行
# Enabled: (true/false) 只有启用才会执行
# 有两种模式, 间隔一定时间秒执行一次,以及特定时间执行一次
# Delay: (number) 每个事件执行的间隔时间, 600 代表该事件每10分钟执行一次
# Randomize: (true/false) 如果设置为true, 那么会从已存在的指令中随机抽一条来执行,可以用于随机公告等等
# DuplicateRandomize: (true/false) 如果设置为true, 那么会从已存在的指令中随机抽一条来执行,但可能重复执行某条指令,适合需要重复的随机公告
# SingleLinear: (true/false) 如果设置为true, 会从已经存在的指令第一条开始,一次只执行一条指令,一条一条按顺序执行下去直到全部指令执行完
# PerformOn: 在特定时间执行,首先要指定一个名字,然后要设置执行时间
# 时间设置包括: Month, Day, Hour, Minute, Second 部分. 时间表示使用24小时制
# 例如
# PerformOn:
# FirstTimeFrame:
# Hour: 4
# SecondTimeFrame:
# Hour: 22
# Minute: 30
# 这将会使事件在凌晨 4 点以及晚上 22:30 被执行,可以用此特性在玩家较少的时段来备份服务器数据
# 你还可以设置让指令在固定星期几来执行,例如 - Day: Monday
# Repeat: (true/false) 如果设置为 false, 这个事件只会被执行一次,无视那些时间间隔或者特定时间设置
# MinPlayers: (amount) 全服玩家只有大于这个数量才会执行此事件
# MinPlayersCommands: 若全服玩家没有达到这个数量门槛,实际执行的指令
# MaxPlayers: (amount) 全服玩家只有小于这个数量才会执行此事件
# Feedback: (true/false) 设置为 false 将不会向控制台输出任何反馈消息
# Commands: 执行的指令
# 如果指令开头是 msg! 而且指令中有玩家名,如果该玩家在线,玩家将收到该消息
# 如果指令开头是 broadcast! 那么消息将会被发送到全服玩家
# 如果指令开头是 actionbar! 那么消息将以actionbar消息的形式会被发送到全服玩家
# 如果指令开头是 title! 那么消息将以Title消息的形式会被发送到全服玩家
# 如果指令开头是 subtitle! 那么消息将以subtitle消息的形式会被发送到全服玩家
# 如果指令开头是 kickall! 那么玩家将被全部踢出
# 如果指令开头是 per:[权限名]! 那么指令只有玩家拥有相应权限时才执行,当目标玩家未指定时此项将失效,举例: perm:cmi.announce.vip! broadcast! 如果你能看到此消息说明你是VIP玩家
# 如果指令开头是 moneycost:[amount]! 那么指令只有玩家拥有足够金钱时才执行
# 如果指令开头是 expcost:[amount]! 那么指令只有玩家拥有足够经验时才执行
# 如果指令开头是 allPlayers! 那么指令会被所有玩家执行一遍当然指令中必须包含玩家名变量 [allPlayers]
# 指令中含有 'delay! 5' 将会延后5秒再执行指令的余下部分
# [randomPlayer] 变量代表服务器中的随机在线玩家(该玩家必须没有 cmi.scheduler.exclude 权限) 可以用来制作定时给予某一随机玩家在线奖励,例如: - cmi give [randomPlayer] diamond %rand/1-5% 最后那个变量代表从1到5之间的随机数字
# 变量支持 PlaceHolderAPI 变量
# 欲了解更多信息请参考 https://www.zrips.net/cmi/commands/specialized/
saveMaps:
Enabled: false
Delay: 600
Repeat: true
Commands:
- save-all
GiveDiamonds:
Enabled: false
MinPlayers: 3
FeedBack: true
Repeat: true
PerformOn:
'1':
Hour: 18
Commands:
- cmi give [randomPlayer] diamond %rand/1-5%
- msg! [randomPlayer] &e你获得了钻石
StopServer:
Enabled: false
PerformOn:
'1':
Hour: 3
Minute: 59
Second: 30
Commands:
- actionbar! &e服务器将在 &630 &e秒内关服
- delay! 5
- actionbar! &e服务器将在 &625 &e秒内关服
- delay! 5
- actionbar! &e服务器将在 &620 &e秒内关服
- delay! 5
- actionbar! &e服务器将在 &615 &e秒内关服
- delay! 5
- actionbar! &e服务器将在 &610 &e秒内关服
- delay! 5
- actionbar! &e服务器将在 &65 &e秒内关服
- delay! 1
- actionbar! &e服务器将在 &64 &e秒内关服
- delay! 1
- actionbar! &e服务器将在 &63 &e秒内关服
- delay! 1
- actionbar! &e服务器将在 &62 &e秒内关服
- delay! 1
- actionbar! &e服务器将在 &61 &e秒内关服
- delay! 1
- kickall! &e已关服请耐心等待服务器重启
- delay! 1
- stop
AllInOneJustExample:
Enabled: false
MinPlayers: 3
MaxPlayers: 10
FeedBack: false
Delay: 600
Repeat: true
PerformOn:
'1':
Month: 12
Day: monday
Hour: 18
Minute: 36
Second: 15
'2':
Hour: 18
Commands:
- cmi give [randomPlayer] diamond %rand/1-5%
- msg! [randomPlayer] &e你获得了钻石
- broadcast! &e大家猜猜 [randomPlayer] 获得了什么!
- delay! 1
- actionbar! &e服务器将在 &61 &e秒内关服
- kickall! &e已关服请耐心等待服务器重启
Announcer:
Enabled: false
MinPlayers: 1
FeedBack: false
Delay: 600
Repeat: true
Randomize: true
Commands:
- broadcast! &e欲参考服务器规章制度请使用 &e/rules
- broadcast! &e欲获得礼包请使用 &e/kits
- broadcast! &e不知道服务器的玩法请咨询服务器管理员
- broadcast! &e不许在本服打广告否则你将被封禁

View File

@@ -0,0 +1,76 @@
# 想要完全禁用tab列表特性请参 Modules.yml
# CMI的TabList功能不支持多列tab列表如果你想达成多列TAB列表功能不妨试试https://www.mcbbs.net/thread-802303-1-1.html
TabList:
# 使用异步模式来更新TAB列表
# 可提升性能,但是部分插件在处理异步变量时可能会出问题
Async: true
UpdateTabListNames: true
# 启用分组TAB列表
# 如果你对分组列表不感兴趣,可以禁用此项,可提升性能
GroupedEnabled: true
Updates:
# 每过 x 秒自动更新TAB列表
# 如果你使用的是静态的TAB顶部栏和底部栏可设置为-1来禁用
AutoInterval: 60
OnJoin: true
OnLeave: true
afkStateChange: true
OnWorldChange: true
OnDeath: false
OnTeleport: false
OnNickChange: true
# 设置为 false tab列表不会显示顶部内容header
addTabListHeader: true
# 设置为 false tab列表不会显示底部内容footer
addTabListFooter: true
# PlaceholderAPI 变量支持
# 即便不使用 PlaceHolderAPI CMI 也有自带的变量
# 你可以在游戏内使用此指令查看所有变量 /cmi placeholders
GeneralFormat:
PlayerName: '[playerDisplayName]'
Header:
'1':
- '&f------------------------------------'
- '&7欢迎来到PCD服务器 QQ群476731621'
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
- '&f------------------------------------'
Footer:
'1':
- '&f------------------------------------'
- '&7%player_world% &f%player_x%:&7%player_y%:&f%player_z%'
- '&7金钱: &f%vault_eco_balance_formatted% &7时间: &f%server_time_HH:mm:ss%'
- '&f------------------------------------'
useGeneralName: false
# 设置为 true, 除非你在GroupFormat指定了相应的 玩家名,顶部内容和底部内容,否则默认的内容将会显示
useGeneralHeader: false
useGeneralFooter: false
# 有权限 cmi.tablist.[序号] 可以看到特定的TAB顶部和底部栏
# 序号必须是数字 你可以新建更多分组
# 如果玩家拥有不只一个权限,序号大的那个会优先显示
GroupFormat:
'1':
PlayerName: '&2{&r[playerDisplayName]&2}'
Header:
'1':
- '&f------------------------------------'
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
- '&f------------------------------------'
Footer:
'1':
- '&f------------------------------------'
- '&7%player_world% &f%player_x%:&7%player_y%:&f%player_z%'
- '&7时间: &f%server_time_HH:mm:ss%'
- '&f------------------------------------'
'2':
PlayerName: '&c[&r[playerDisplayName]&c]'
Header:
'1':
- '&f------------------------------------'
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
- '&f------------------------------------'
Footer:
'1':
- '&f------------------------------------'
- '&7金钱: &f%vault_eco_balance_formatted% &7时间: &f%server_time_HH:mm:ss%'
- '&f------------------------------------'

View File

@@ -0,0 +1,538 @@
# 在自定义死亡消息中当玩家把鼠标放在【被杀者】ID上方时是否显示悬停文字内容可以使用像 %cmi_user_name% 的PlaceholderAPI变量
# 设置为 '' 关闭悬停消息机制
PlayerHover:
- ''
# 在自定义死亡消息中当玩家把鼠标放在【杀人者】ID上方时是否显示悬停文字内容可以使用像 %cmi_user_name% 的PlaceholderAPI变量
# 设置为 '' 关闭悬停消息机制
KillerHover:
- ''
Escaping:
- ' &7因为尝试逃离 &2[sourceDisplayName] &7的追杀时失败'
- ' &7因为尝试与 &2[sourceDisplayName] &7战斗而阵亡'
RunningAway:
- ' &7因为尝试逃离 &2[mobName] &7的追杀时失败'
- ' &7因为尝试与 &2[mobName] &7战斗而阵亡'
Player:
General:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7击杀'
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7打得落花流水'
- '&2[playerDisplayName] &7在和 &2[sourceDisplayName] &7的战斗中身亡'
Item:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7用 &2[item] &7击杀'
Projectile:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7用 &2[type] &7射杀'
Fireball:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7的火球术命中而死'
Firework:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7的烟花炸死了'
Tnt:
- '&2[playerDisplayName] &7被 &2[sourceDisplayName] &7炸死了'
FallingBlocks:
Anvil:
General:
- '&2[playerDisplayName] &7没有注意到头顶的铁砧'
- '&2[playerDisplayName] &7被铁砧砸死了'
- '&2[playerDisplayName] &7被铁砧压扁了'
Pointed_dripstone:
General:
- '&2[playerDisplayName] &7被滴水石锥爆头了'
Block:
Cactus:
General:
- '&2[playerDisplayName] &7尝试摸了一下仙人掌然后死了'
- '&2[playerDisplayName] &7被仙人掌扎死了'
Dispenser:
Arrow:
- '&2[playerDisplayName] &7被发射器射出的暗箭射杀'
Splash_potion:
- '&2[playerDisplayName] &7被发射器喷出的毒药毒杀'
Magma_block:
General:
- '&2[playerDisplayName] &7尝试在岩浆块上跳舞'
Sweet_berry_bush:
General:
- '&2[playerDisplayName] &7被甜浆果丛刺死了'
Campfire:
General:
- '&2[playerDisplayName] &7被篝火烧死了'
Soul_campfire:
General:
- '&2[playerDisplayName] &7的灵魂被带走了'
Lava:
General:
- '&2[playerDisplayName] &7尝试在岩浆里游泳'
Pointed_dripstone:
General:
- '&2[playerDisplayName] &7踩在了钟乳石上'
Custom:
Block_explosion:
General:
- '&2[playerDisplayName] &7因 [Intentional Game Design] &7而死'
World_border:
General:
- '&2[playerDisplayName] &7离开了这个世界范围'
Starvation:
General:
- '&2[playerDisplayName] &7饿死了'
Fall:
Low:
General:
- '&2[playerDisplayName] &7落地过猛'
High:
General:
- '&2[playerDisplayName] &7从高处落下摔死了'
Fire:
General:
- '&2[playerDisplayName] &7跳进了火中'
Fire_tick:
General:
- '&2[playerDisplayName] &7被烧死了'
Lightning:
General:
- '&2[playerDisplayName] &7被雷劈死了'
Suffocation:
General:
- '&2[playerDisplayName] &7卡进了墙内'
Custom:
General:
- '&2[playerDisplayName] &7死了'
Drowning:
General:
- '&2[playerDisplayName] &7淹死了'
Freeze:
General:
- '&2[playerDisplayName] &7冻死了'
Suicide:
General:
- '&2[playerDisplayName] &7结束了自己的生命'
Void:
General:
- '&2[playerDisplayName] &7落出了这个世界'
EndCrystal:
General:
- '&2[playerDisplayName] &7被末影水晶炸死了'
Wither:
General:
- '&2[playerDisplayName] &7凋零了'
Fly_into_wall:
General:
- '&2[playerDisplayName] &7飞进了墙里'
- '&2[playerDisplayName] &7尝试学习穿墙术时失败了'
Projectile:
Arrow:
- '&2[playerDisplayName] &7被箭射死了'
Spectral_arrow:
- '&2[playerDisplayName] &7被光灵箭射死了'
Tipped_arrow:
- '&2[playerDisplayName] &7被药箭射死了'
Fireball:
- '&2[playerDisplayName] &7被火球命中了'
Firework:
- '&2[playerDisplayName] &7被火箭命中了'
Mob:
Primed_tnt:
General:
- '&2[playerDisplayName] &7被炸飞了'
Tnt_minecart:
General:
- '&2[playerDisplayName] &7被炸飞了'
Elder_guardian:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Wither_skeleton:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Stray:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Husk:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Zombie_villager:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Skeleton_horse:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Zombie_horse:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Armor_stand:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Donkey:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Mule:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Evoker:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Vex:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Vindicator:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Illusioner:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Creeper:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Skeleton:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Spider:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Giant:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Zombie:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Slime:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Ghast:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Zombified_piglin:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Enderman:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Cave_spider:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Silverfish:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Blaze:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Magma_cube:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Ender_dragon:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Wither:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Bat:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Witch:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Endermite:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Guardian:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Shulker:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Pig:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Sheep:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Cow:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Chicken:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Squid:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Wolf:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Mushroom_cow:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Snowman:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Ocelot:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Iron_golem:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Horse:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Rabbit:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Polar_bear:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Llama:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Parrot:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Villager:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Turtle:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Phantom:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Cod:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Salmon:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Pufferfish:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Tropical_fish:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Drowned:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Dolphin:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Cat:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Panda:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Pillager:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Ravager:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Trader_llama:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Wandering_trader:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Fox:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Bee:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Hoglin:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Piglin:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Strider:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Zoglin:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Piglin_brute:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Axolotl:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Glow_squid:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Goat:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Allay:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Frog:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Tadpole:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Warden:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Camel:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'
Sniffer:
General:
- '&2[playerDisplayName] &7被 &2[mobName] &7击杀'
Item:
- '&2[playerDisplayName] &7被 &2[mobName] &7用 &2[item] &7击杀'

File diff suppressed because it is too large Load Diff

1824
.temp/CMI/CMI/config.yml Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,740 @@
# Full color code support and some variables
# Keep in mind that variables wont work for some lines, when it will for anothers :)
# Just keep them where there are now and everything will be ok :)
# Some lines can have global variables set. For player who will be effected. In example /heal Zrips then Zrips data will be used
# [serverName] to show server name
# [playerName] to show target player name
# [playerDisplayName] to show target player display name
# [lvl] to show target player level
# [exp] to show target player total exp
# [hp] to show target player health
# [maxHp] to show target player max health
# [hunger] to show target player hunger level
# [gameMode] to show target player gamemode
# [prefix] to show target player prefix if possible
# [suffix] to show target player suffix if possible
# Sender is console or player who performs command. For example Zrips performs /heal Zhax then Zrips data will be used
# [senderName] to show Sender player name
# [senderDisplayName] to show Sender player display name
# [senderLvl] to show Sender player level
# [senderExp] to show Sender player total exp
# [senderHp] to show Sender player health
# [senderMaxHp] to show Sender player max health
# [senderHunger] to show Sender player hunger level
# [senderGameMode] to show Sender player gamemode
# [senderPrefix] to show Sender player prefix if possible
# [senderSuffix] to show Sender player suffix if possible
# Source is player which is being used for extra info. For example Zrips performs /tp Zhax Zrips then Zhax data will be used as its location is being taken for new player location
# [sourceName] to show source player name
# [sourceDisplayName] to show source player display name
# [sourceLvl] to show source player level
# [sourceExp] to show source player total exp
# [sourceHp] to show source player health
# [sourceMaxHp] to show source player max health
# [sourceHunger] to show source player hunger level
# [sourceGameMode] to show source player gamemode
# [sourcePrefix] to show source player prefix if possible
# [sourceSuffix] to show source player suffix if possible
# ***********************************************
# Some lines support the option to send them to custom places, like action bar, title, sub title or even create JSON/clickable messages
# If line starts with !toast! then player will get toast message (advancement popup, only 1.12 and up). Some extra variables can be used to define type and icon. example: !toast! -t:goal -icon:paper Hello world!
# If line starts with !actionbar! then player will get action bar message defined after this variable
# If line starts with !actionbar:[seconds]! then player will get action bar message for defined amount of time
# If line starts with !broadcast! then everyone will receive message. You can add extra !toast! !actionbar! or !title! to send message for everyone to specific place, in example !broadcast!!title!
# If line starts with !customtext:[cTextName]! then custom text will be taken by name provided and shown for player. In case its used after !broadcast! then everyone who is online will get this custom text message
# If line starts with !title! then player will get title message defined after this variable, in addition it can contain !subtitle! which will add subtitle message
# If line starts with !bossbar:[name]-[timer]! then player will get bossbar message defined after this variable, in addition you can define how long this message will be visible. You need to define bossbar name which can be anything you want, but lines with same name will override each other to prevent stacking
# To include clickable messages: <T>Text</T><H>Hover text</H><C>command</C><SC>Suggested text</SC>
# <T> and </T> required, other is optional
# Use /n to break line
# To have more than one JSON message use <Next>
# <C> performs command as a player who clicked
# <CC> performs command from console once
# <CCI> performs command from console every time player clicks text
# <URL> includes url
# CMI 曾经的汉化发布地址无法访问https://www.mcbbs.net/thread-791419-1-1.html
# 汉化 by 原MCBBS PCD小组 秋风残叶
# 催更汉化请加群 476731621 (欢迎加群和咖啡老师讨论人生经验)
# CMI自带的Locale_ZH.yml为台式繁体汉化包不建议中国大陆服主使用中国人不骗中国人
# 搬运者注记以下内容迁移来自CMI 9.0
info:
# 可以在任何语句前面加 !prefix! 来自动显示CMI前缀
prefix: '&e[&aCMI&e] '
NoPermission: '&c你没有权限'
CantHavePermission: '&c您没有权限'
WrongGroup: '&c您已经处于被删除的组里'
NoPlayerPermission: '&c[playerName] 没有权限: [permission]'
Ingame: '&c你只能在游戏里这么做'
NoInformation: '&c找不到信息'
Console: '&6服务器'
FromConsole: '&c只能在控制台这么做!'
NotOnline: '&c玩家不在线!'
NobodyOnline: '&c服务器里没有玩家'
NoPlayer: '&c找不到这个玩家'
NoCommand: '&c未知指令'
cantFindCommand: '&5找不到 &7[%1]&5 命令, 您的意思是 &7[%2]&5?'
nolocation: '&4找不到合适的位置'
FeatureNotEnabled: '&c该机制未启用'
ModuleNotEnabled: '&c此模块没有启用!'
versionNotSupported: '&c服务器版本不支持此特性'
spigotNotSupported: '&c你需要使用 PaperSpigot 服务端才能使用这一特性'
bungeeNoGo: '&c此功能在基于bungee网络的服务器上不起作用'
clickToTeleport: '&e点击传送'
UseMaterial: '&4请使用物品名字!'
IncorrectMaterial: '&4错误的物品名!'
UseInteger: '&4请使用数字'
UseBoolean: '&4请使用布尔值 True 或者 False!'
NoLessThan: '&4数值不能小于 [amount]!'
NoMoreThan: '&4数值不能大于 [amount]'
NoWorld: '&4找不到该世界'
IncorrectLocation: '&4位置指定错误'
Show: '&e展示'
Remove: '&c移除'
Back: '&e返回'
Forward: '&e向前'
Update: '&e更新'
Save: '&e保存'
Delete: '&c删除'
Click: '&e点击'
Preview: '&e上一页'
PasteOld: '&e粘贴旧内容'
ClickToPaste: '&e点击粘贴进聊天'
CantTeleportWorld: '&e您不能传送到这个世界!'
CantTeleportNoWorld: '&c目标世界不存在. 该传送取消!'
ClickToConfirmDelete: '&e点击确认以移除 &6[name]'
teleported: '&e您被传送了.'
PlayerSpliter: '&e----- &6[playerDisplayName] &e-----'
Spliter: '&e--------------------------------------------------'
SpliterValue: '&e------------------ &6[value] &e------------------'
singleSpliter: '&e-'
SpliterMiddle: ' &6[value] '
ListSpliter: ', '
ProgressBarFill: '&2▏'
ProgressBarEmpty: '&e▏'
nothingInHand: '!actionbar!&e你需要把这个拿在手上'
nothingInHandLeather: '&e你需要把皮革物品拿在手上'
nothingToShow: '&e没有东西可以展示'
noItem: '&c找不到物品'
dontHaveItem: '&c你的背包中没有 &6[itemName] x[amount] &c'
wrongWorld: '&c不可在此世界这样做'
differentWorld: '&c世界难度'
HaveItem: '&c在背包里有&6[amount]x [itemName]'
cantDoInGamemode: '&e在此游戏模式下不能这么做'
cantDoForPlayer: '&e你不能对 &6[playerDisplayName] &e这么做'
cantDoForYourSelf: '&e您不能这样做'
cantDetermineMobType: '&c无法指定怪物种类 &e[type] &c'
cantRename: '!actionbar!&e你不能更改为这个名字'
confirmRedefine: '&e点击确认更改'
cantEdit: '&e你无法编辑'
wrongName: '&c错误的名字'
unknown: unknown
invalidName: '&c无效的名字'
alreadyexist: '&4该名称已被占用'
dontexist: '&4未找到'
worldDontExist: '&c目标世界不存在'
notSet: 未设置
lookAtSign: '&e请指向一个木牌'
lookAtBlock: '&e请指向一个方块'
lookAtEntity: '&e请指向一个实体'
noSpace: '&e空间不够'
notOnGround: '&e飞行期间不能这么做'
bungee:
Online: '&6在线'
Offline: '&c离线'
not: '&c这个服务器不在群组下'
noserver: '&c找不到这个服务器'
server: '&e服务器: &7[name]'
variables:
am: '&e上午'
pm: '&e下午'
Online: '&6在线'
Offline: '&c离线'
TrueColor: '&2'
FalseColor: '&4'
'True': '&6确认'
'False': '&c取消'
Enabled: '&6启用'
Disabled: '&c禁用'
survival: '&6生存'
creative: '&6创造'
adventure: '&6冒险'
spectator: '&6旁观'
flying: '&6飞行'
notflying: '&6未飞行'
Inventory:
Full: '&5你的背包满了无法添加新物品了'
FullDrop: '&5你的背包满了该物品已经丢在地上了'
TimeNotRecorded: '&e-我不记得了-'
months: '&e[months] &6月 '
oneMonth: '&e[months] &6月 '
weeks: '&e[weeks] &6周 '
oneWeek: '&e[weeks] &6周 '
years: '&e[years] &6年 '
oneYear: '&e[years] &6年 '
day: '&e[days] &6天 '
oneDay: '&e[days] &6天 '
hour: '&e[hours] &6小时 '
oneHour: '&e[hours] &6小时 '
min: '&e[mins] &6分钟 '
sec: '&e[secs] &6秒 '
nextPageConsole: '&f下一页执行&5[command]'
prevPage: '&2----<< &6上一页 '
prevCustomPage: '&2----<< &6[value] '
prevPageGui: '&6上一页 '
prevPageClean: '&6上 '
prevPageOff: '&2----<< &7上一页 '
prevCustomPageOff: '&2----<< &7[value] '
prevPageHover: '&7<<<'
firstPageHover: '&7|<'
nextPage: '&6 下一页 &2>>----'
nextCustomPage: '&6 [value] &2>>----'
nextPageGui: '&6下一页'
nextPageClean: '&6 下'
nextPageOff: '&7 下一页 &2>>----'
nextCustomPageOff: '&7 [value] &2>>----'
nextPageHover: '&7>>>'
lastPageHover: '&7>|'
pageCount: '&2[current]&7/&2[total]'
pageCountHover: '&2[totalEntries]'
skullOwner: '!actionbar!&7所有者:&r [playerName]'
playerHeadName: '&7[playerName]&e的头颅'
mobHeadName: '&f[mobName]&e的头颅'
circle: '&3圆形'
square: '&5正方形'
clear: '&7清除'
protectedArea: '&c保护区域. 不可以这样做.'
valueToLong: '&e数值过长最长: [max]'
valueToShort: '&e数值过短最短: [min]'
pickIcon: '&8选择图标'
# 搬运者注记此处部分汉化条目内容已迁移至CMI汉化文件但在多个版本的汉化里作者都没有在CMILib的汉化中移除这些已经没用的汉化条目
# 目前,废弃的汉化内容已被移除。
Spawner: '&r[type] 刷怪笼'
DamageCause:
block_explosion: 爆炸
contact: 方块伤害
cramming: 拥挤
custom: 未知原因
dragon_breath: 龙息
drowning: 淹死
dryout: 口渴
entity_attack: 实体伤害
entity_explosion: 爆炸
entity_sweep_attack: 实体横扫伤害
fall: 摔落
falling_block: 掉落的方块
fire:
fire_tick:
fly_into_wall: 飞行卡进墙里
freeze: 冻死
hot_floor: 岩浆块
kill: 击杀
lava: 岩浆
lightning: 闪电
magic: 魔法
melting: 融化
poison: 药水
projectile: 弹射物
sonic_boom: 声爆
starvation: 饥饿
suffocation: 窒息
suicide: 自杀
thorns: 荆棘
void: 虚空
wither: 凋零
world_border: 世界边界
Biomes:
# 注意以下生物群系可能部分已经不存在于最新版Minecraft兼容起见仍然保留这些旧群系名称
BADLANDS: 恶地
BADLANDS_PLATEAU: 恶地高原
BAMBOO_JUNGLE: 竹林
BAMBOO_JUNGLE_HILLS: 竹林丘陵
BASALT_DELTAS: 玄武岩三角洲
BEACH: 沙滩
BIRCH_FOREST: 桦木森林
CHERRY_GROVE: 樱花树林
BIRCH_FOREST_HILLS: 桦木森林丘陵
COLD_OCEAN: 冷水海洋
CRIMSON_FOREST: 绯红森林
CUSTOM: 自定义群系
DARK_FOREST: 黑森林
DARK_FOREST_HILLS: 黑森林丘陵
DEEP_COLD_OCEAN: 冷水深海
DEEP_DARK: 深暗之域
DEEP_FROZEN_OCEAN: 冰冻深海
DEEP_LUKEWARM_OCEAN: 温水深海
DEEP_OCEAN: 深海
DEEP_WARM_OCEAN: 暖水深海
DESERT: 沙漠
DESERT_HILLS: 沙漠丘陵
DESERT_LAKES: 沙漠湖泊
DRIPSTONE_CAVES: 溶洞
END_BARRENS: 末地荒地
END_HIGHLANDS: 末地高地
END_MIDLANDS: 末地内陆
ERODED_BADLANDS: 风蚀恶地
FLOWER_FOREST: 繁花森林
FOREST: 森林
FROZEN_OCEAN: 冻洋
FROZEN_PEAKS: 冰封山峰
FROZEN_RIVER: 冻河
GIANT_SPRUCE_TAIGA: 巨型云杉针叶林
GIANT_SPRUCE_TAIGA_HILLS: 巨型云杉针叶林丘陵
GIANT_TREE_TAIGA: 巨型针叶林
GIANT_TREE_TAIGA_HILLS: 巨型针叶林丘陵
GRAVELLY_MOUNTAINS: 沙砾山地
GROVE: 雪林
ICE_SPIKES: 冰刺之地
JAGGED_PEAKS: 尖峭山峰
JUNGLE: 丛林
JUNGLE_EDGE: 丛林边缘
JUNGLE_HILLS: 丛林丘陵
LUKEWARM_OCEAN: 温水海洋
LUSH_CAVES: 繁茂洞穴
MANGROVE_SWAMP: 红树林沼泽
MEADOW: 草甸
MODIFIED_BADLANDS_PLATEAU: 恶地高原变种
MODIFIED_GRAVELLY_MOUNTAINS: 沙砾山地+
MODIFIED_JUNGLE: 丛林变种
MODIFIED_JUNGLE_EDGE: 从林边缘变种
MODIFIED_WOODED_BADLANDS_PLATEAU: 繁茂的恶地高原变种
MOUNTAINS: 山地
MOUNTAIN_EDGE: 山地边缘
MUSHROOM_FIELDS: 蘑菇岛
MUSHROOM_FIELD_SHORE: 蘑菇岛岸
NETHER_WASTES: 下界荒地
OCEAN: 海洋
OLD_GROWTH_BIRCH_FOREST: 原始桦木森林
OLD_GROWTH_PINE_TAIGA: 原始松木针叶林
OLD_GROWTH_SPRUCE_TAIGA: 原始云杉针叶林
PLAINS: 平原
RIVER: 河流
SAVANNA: 热带草原
SAVANNA_PLATEAU: 热带高原
SHATTERED_SAVANNA: 破碎的热带草原
SHATTERED_SAVANNA_PLATEAU: 破碎的热带高原
SMALL_END_ISLANDS: 末地小型岛屿
SNOWY_BEACH: 积雪沙滩
SNOWY_MOUNTAINS: 雪山
SNOWY_PLAINS: 雪原
SNOWY_SLOPES: 积雪山坡
SNOWY_TAIGA: 积雪针叶林
SNOWY_TAIGA_HILLS: 积雪的针叶林丘陵
SNOWY_TAIGA_MOUNTAINS: 积雪的针叶林山地
SNOWY_TUNDRA: 积雪的冻原
SOUL_SAND_VALLEY: 灵魂沙峡谷
SPARSE_JUNGLE: 稀疏丛林
STONY_PEAKS: 裸岩山峰
STONY_SHORE: 石岸
SUNFLOWER_PLAINS: 向日葵平原
SWAMP: 沼泽
SWAMP_HILLS: 沼泽山丘
TAIGA: 针叶林
TAIGA_HILLS: 针叶林丘陵
TAIGA_MOUNTAINS: 针叶林山地
TALL_BIRCH_FOREST: 高大桦木森林
TALL_BIRCH_HILLS: 高大桦木丘陵
THE_END: 末地
THE_VOID: 虚空
WARM_OCEAN: 暖水海洋
WARPED_FOREST: 诡异森林
WINDSWEPT_FOREST: 风袭森林
WINDSWEPT_GRAVELLY_HILLS: 风袭沙砾丘陵
WINDSWEPT_HILLS: 风袭丘陵
WINDSWEPT_SAVANNA: 风袭热带草原
WOODED_BADLANDS: 疏林恶地
WOODED_BADLANDS_PLATEAU: 繁茂的疏林恶地
WOODED_HILLS: 繁茂的丘陵
WOODED_MOUNTAINS: 繁茂的山地
EntityType:
allay: 悦灵
area_effect_cloud: 药水云
armor_stand: 盔甲架
arrow:
axolotl: 美西螈
bat: 蝙蝠
bee: 蜜蜂
blaze: 烈焰人
block_display: 方块展示
boat:
camel: 骆驼
cat:
cave_spider: 洞穴蜘蛛
chest_boat: 箱子船
chicken:
cod: 鳕鱼
cow:
creeper: 爬行者
dolphin: 海豚
donkey:
dragon_fireball: 龙之火球
dropped_item: 掉落的物品
drowned: 溺尸
egg:
elder_guardian: 远古守卫者
enderman: 末影人
endermite: 末影螨
ender_crystal: 末影水晶
ender_dragon: 末影龙
ender_pearl: 末影珍珠
ender_signal: 末影光柱
evoker: 唤魔者
evoker_fangs: 地夹
experience_orb: 经验球
falling_block: 掉落的方块
fireball: 火球
firework: 烟花
fishing_hook: 鱼钩
fox: 狐狸
frog: 青蛙
ghast: 恶魂
giant: 巨人
glow_item_frame: 发光的展示框
glow_squid: 发光的鱿鱼
goat: 山羊
guardian: 守卫者
hoglin: 疣猪兽
horse:
husk: 尸壳
illusioner: 幻术师
interaction: 交互实体
iron_golem: 铁傀儡
item_display: 物品展示
item_frame: 物品展示框
leash_hitch: 栓绳
lightning: 闪电
llama: 羊驼
llama_spit: 羊驼口水
magma_cube: 岩浆怪
marker: 标记
minecart: 矿车
minecart_chest: 箱子矿车
minecart_command: 命令方块矿车
minecart_furnace: 动力矿车
minecart_hopper: 漏斗矿车
minecart_mob_spawner: 刷怪笼矿车
minecart_tnt: TNT矿车
mule:
mushroom_cow: 哞菇
ocelot: 豹猫
painting:
panda: 熊猫
parrot: 鹦鹉
phantom: 幻翼
pig:
piglin: 猪灵
piglin_brute: 猪灵蛮兵
pillager: 掠夺者
player: 玩家
polar_bear: 北极熊
primed_tnt: 激活的TNT
pufferfish: 河豚
rabbit: 兔子
ravager: 劫掠兽
salmon: 鲑鱼
sheep:
shulker: 潜影贝
shulker_bullet: 潜影贝子弹
silverfish: 蠹虫
skeleton: 骷髅
skeleton_horse: 骷髅马
slime: 史莱姆
small_fireball: 小火球
sniffer: 嗅探兽
snowball: 雪球
snowman: 雪傀儡
spectral_arrow: 光灵箭
spider: 蜘蛛
splash_potion: 喷溅药水
squid: 鱿鱼
stray: 流浪者
strider: 炽足兽
tadpole: 蝌蚪
text_display: 文字展示
thrown_exp_bottle: 扔出的附魔之瓶
trader_llama: 行商羊驼
trident: 三叉戟
tropical_fish: 热带鱼
turtle: 海龟
unknown: 未知
vex: 恼鬼
villager: 村民
vindicator: 卫道士
wandering_trader: 流浪商人
warden: 坚守者
witch: 女巫
wither: 凋灵
wither_skeleton: 凋灵骷髅
wither_skull: 凋灵之首
wolf:
zoglin: 僵尸疣猪兽
zombie: 僵尸
zombie_horse: 僵尸马
zombie_villager: 僵尸村民
zombified_piglin: 僵尸猪灵
EnchantAliases:
protection_fire:
- 火焰保护
damage_all:
- 锋利
arrow_fire:
- 火矢
soul_speed:
- 灵魂疾行
water_worker:
- 水下速掘
arrow_knockback:
- 冲击
loyalty:
- 忠诚
# 搬运者注记在某些旧版本汉化里曾有一个名叫Valhalla glow的附魔名称存在翻译存疑目前最新版插件已无这一条
depth_strider:
- 深海探索者
vanishing_curse:
- 消失诅咒
durability:
- 耐久
knockback:
- 击退
luck:
- 海之眷顾
binding_curse:
- 绑定诅咒
loot_bonus_blocks:
- 时运
protection_environmental:
- 保护
dig_speed:
- 效率
mending:
- 经验修补
frost_walker:
- 冰霜行者
lure:
- 饵钓
loot_bonus_mobs:
- 抢夺
piercing:
- 穿透
protection_explosions:
- 爆炸保护
damage_undead:
- 亡灵杀手
multishot:
- 多重射击
swift_sneak:
- 迅捷潜行
fire_aspect:
- 火焰附加
channeling:
- 召雷
sweeping_edge:
- 横扫之刃
thorns:
- 荆棘
damage_arthropods:
- 节肢杀手
oxygen:
- 水下呼吸
riptide:
- 激流
silk_touch:
- 精准采集
quick_charge:
- 快速装填
protection_projectile:
- 弹射物保护
impaling:
- 穿刺
protection_fall:
- 摔落保护
arrow_damage:
- 力量
arrow_infinite:
- 无限
PotionEffectAliases:
speed:
- 迅捷
slowness:
- 缓慢
haste:
- 急迫
miningfatigue:
- 挖掘疲劳
strength:
- 力量
instanthealth:
- 瞬间治疗
instantdamage:
- 瞬间伤害
jumpboost:
- 跳跃
nausea:
- 反胃
regeneration:
- 生命恢复
resistance:
- 抗性提升
fireresistance:
- 防火
waterbreathing:
- 水下呼吸
invisibility:
- 隐身
blindness:
- 失明
nightvision:
- 夜视
hunger:
- 饥饿
weakness:
- 虚弱
poison:
- 中毒
wither:
- 凋零
healthboost:
- 生命提升
absorption:
- 伤害吸收
saturation:
- 饱食
glowing:
- 发光
levitation:
- 飘浮
luck:
- 幸运
unluck:
- 霉运
slowfalling:
- 缓降
conduitpower:
- 潮涌能量
dolphinsgrace:
- 海豚的恩惠
badomen:
- 不祥之兆
heroofthevillage:
- 村庄英雄
darkness:
- 黑暗
direction:
n:
ne: 东北
e:
se: 东南
s:
sw: 西南
w: 西
nw: 西北
modify:
middlemouse: '&2鼠标中键单击进行编辑'
qButtonEdit: '&2点击 Q 编辑'
newItem: '&7放置新物品'
newLine: '&2<新的一行>'
newLineHover: '&2添加新的一行'
newPage: '&2<新的一页>'
newPageHover: '&2创建新的一页'
removePage: '&c<移除一页>'
removePageHover: '&c移除一页'
deleteSymbol: '&cX'
deleteSymbolHover: '&c删除 &e[text]'
extraEditSymbol: ' &6!'
addSymbol: ' &2+'
addSymbolHover: '&2新建'
cancelSymbol: ' &7&l[X]'
cancelSymbolHover: '&a取消'
acceptSymbol: ' &2&l[✔]'
acceptSymbolHover: '&2接受'
denySymbol: ' &4[X] '
denySymbolHover: '&2取消'
enabledSymbol: '&2[+]'
disabledSymbol: '&c[-]'
enabled: '&2启用'
disabled: '&c禁用'
running: '&2运行中'
paused: '&c已暂停'
editSymbol: '&e✎'
editSymbolHover: '&e编辑 &6[text]'
editLineColor: '&f'
listUpSymbol: '&6⇑'
listUpSymbolHover: '&e上'
listDownSymbol: '&6⇓'
listDownSymbolHover: '&e下'
listNumbering: '&e[number]. '
listAlign: '&80'
ChangeHover: '&e点击更改'
ChangeCommands: '&e指令'
enabledColor: '&6'
disabledColor: '&7'
commandTitle: ' &e--- &6[name] &e---'
commandList: ' &e[command] '
emptyLine: '&7[Empty line]'
commandEdit: '&e编辑列表'
nameAddInfo: '&e输入新名字或输入 &6cancel &e来取消操作'
lineAddInfo: '&e在聊天框中输入cancel来取消操作'
commandAddInfo: '&e输入一个新指令或使用 &6cancel &e取消'
commandAddInformationHover: "&e[playerName] 代表玩家变量 \n&e 想给指令加延迟请使用: \n&edelay! 5\
\ \n&e支持特殊指令 获得更多信息 \n&ehttps://www.zrips.net/cmi/commands/specialized/"
commandEditInfo: '&e点击粘贴旧内容使用 &6cancel &e取消或使用 &6remove &e移除一行'
listLimit: '&e列表中内容不能多于 &6[amount] &e项'
commandEditInfoHover: '&e点击粘贴旧内容'
teleportation:
relocation: '!actionbar!&4你将要传送到的地方不安全已将你传送至 安全的地方'
econ:
noMoney: '&c你的钱不够'
charged: '!actionbar!&f收费: &6[amount]'
notEnoughMoney: '&c你没有足够的钱要求:(&6[amount]&c)'
tooMuchMoney: '&c你的钱太多了'
Selection:
SelectPoints: '&c用选择工具选择 2 个点 AKA: &6[tool]'
PrimaryPoint: '&e选择 &6第一个 &e选择点 [point]'
SecondaryPoint: '&e选择了 &6第二个 &e选择点 [point]'
CoordsTop: '&eX:&6[x] &eY:&6[y] &eZ:&6[z]'
CoordsBottom: '&eX:&6[x] &eY:&6[y] &eZ:&6[z]'
Area: '&7[world] &f(&6[x1]:[y1]:[z1] &e[x2]:[y2]:[z2]&f)'
Location:
Title: '&8玩家位置'
Killer: '&e击杀者: &6[killer]'
OneLiner: '&e位置: &6[location]'
DeathReason: '&e死亡原因: &6[reason]'
Full: '&7[world] &f[x]&7:&f[y]&7:&f[z]'
World: '&e世界: &6[world]'
X: '&eX: &6[x]'
Y: '&eY: &6[y]'
Z: '&eZ: &6[z]'
Pitch: '&ePitch: &6[pitch]'
Yaw: '&eYaw: &6[yaw]'
WorldNames:
- world-&2主世界
- world_nether-&2地狱
- world_the_end-&2末地
Locations: '&7位置: '
# 搬运者注记以上内容部分迁移来自CMI 9.0,部分迁移来后又迁移回去了(搞不懂作者的脑回路)
command:
help:
output:
usage: '&e使用方法: &7%usage%'
cmdInfoFormat: '[command] &f- &e[description]'
cmdFormat: '&6/[command]&f[arguments]'
helpPageDescription: '&e* [description]'
explanation: '&e * [explanation]'
title: '&e------ ======= &6帮助&e &e======= ------'
nocmd:
help:
info: '&e显示所有可用指令'
args: ''
clearcache:
help:
info: '&e清理缓存'
args: ''
reload:
help:
info: '&e重载插件'
args: ''
info:
feedback: '&6配置已重载 耗时 [ms]ms 汉化 by 秋风残叶'
failedConfig: '&4config文件重载失败! 请检查拼写错误!'
failedLocale: '&4语言文件重载失败! 请检查拼写错误!'

View File

@@ -0,0 +1,66 @@
# CMI 曾经的汉化发布地址无法访问https://www.mcbbs.net/thread-791419-1-1.html
# 汉化 by 原MCBBS PCD小组 秋风残叶
# 催更汉化请加群 476731621 敬祝lona先生早日找到工作
# CMI自带的Locale_ZH.yml为台式繁体汉化包不建议中国大陆服主使用中国人不骗中国人
# 语言文件
Language: CN
# 从Github自动下载语言文件
# 鉴于国内网络情况,不建议开启
LanguageDownload: false
# 自动更新
AutoUpdate: false
ExploitPatcher:
Placeholders:
blocked:
# 默认情况下PlaceholderAPI变量 %checkitem_...% 是禁用的以避免bug
# 除非你有把握,否认不应该关上这一项
checkItem: true
Skins:
# 从mojang服务器在线更新皮肤数据的时间间隔单位是分钟
# 请注意最小的间隔必须是1分钟及以上最好妥善设置比如几个小时
# 玩家看到皮肤有改变,需要该玩家重新登陆服务器或者手动执行换肤指令
SkinUpdateTimer: 1320
# 即将更新皮肤数据时每隔多少分钟朝mojang服务器发送一次数据
# 这个设置可以避免大量数据请求堵塞网络
SkinRequestFrequency: 10
GlobalGui:
# 在Zrips所有系列插件例如CMI、Residence菜单GUI中用来填充空白格子的物品
EmptyField: BLACK_STAINED_GLASS_PANE
Pages:
# 所有GUI菜单中“上一页”按钮的材质
Previous: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzdhZWU5YTc1YmYwZGY3ODk3MTgzMDE1Y2NhMGIyYTdkNzU1YzYzMzg4ZmYwMTc1MmQ1ZjQ0MTlmYzY0NSJ9fX0=
# 所有GUI菜单中“下一页”按钮的材质
Next: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjgyYWQxYjljYjRkZDIxMjU5YzBkNzVhYTMxNWZmMzg5YzNjZWY3NTJiZTM5NDkzMzgxNjRiYWM4NGE5NmUifX19
# 所有GUI菜单中“信息”按钮的材质
Middle: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZmEyYWZhN2JiMDYzYWMxZmYzYmJlMDhkMmM1NThhN2RmMmUyYmFjZGYxNWRhYzJhNjQ2NjJkYzQwZjhmZGJhZCJ9fX0=
# 关闭按钮的材质
Close: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzM4YWIxNDU3NDdiNGJkMDljZTAzNTQzNTQ5NDhjZTY5ZmY2ZjQxZDllMDk4YzY4NDhiODBlMTg3ZTkxOSJ9fX0=
# 信息按钮的材质
Info: head:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjcwNWZkOTRhMGM0MzE5MjdmYjRlNjM5YjBmY2ZiNDk3MTdlNDEyMjg1YTAyYjQzOWUwMTEyZGEyMmIyZTJlYyJ9fX0=
Spawners:
# 当使用 spawner:random 变量时,可选择的刷怪笼种类列表
mysterySpawners:
- skeleton
- zombie
- silverfish
- panda
- fox
RMCCommands:
# 若开启此项,我们将在可能的情况下包含一个命令,以指示在使用 RMC 命令时执行的命令(此处搬运者没有读懂)
ConsoleLog: true
Images:
# 用做图片占位的符号
# 不支持颜色代码
# 服务器重启之后此占位符将会发挥机能
Filler:
# 若图片为空,用作占位的符号
# 此处是支持颜色代码的
EmptyFiller: '&7_|'
Colors:
# 启用此项插件将尝试识别简化Hex颜色代码比如 #f6f6f6 或者 #ff6 (在原本识别 {#f6f6f6} 或者 {#red} 的基础上)
# 请注意简化Hex颜色代码不支持渐变色也不支持自己命名的颜色
OfficialHex: true
# 启用此项插件将尝试识别特殊Hex颜色代码比如 &#f6f6f6 或者 &#ff6 (在原本识别 {#f6f6f6} 或者 {#red} 的基础上)
# 请注意特殊Hex颜色代码不支持渐变色也不支持自己命名的颜色
QuirkyHex: true

1
.temp/EssentialsX Submodule

Submodule .temp/EssentialsX added at 87bde72678

View File

@@ -0,0 +1,26 @@
<AutoPage>
&6Player Rules:
&61. &eNo Griefing
&62. &eNo Spamming
&63. &eNo Advertising
&64. &eNo Cursing/No Constant Cursing
&65. &eNo Trolling/Flaming
&66. &eNo Banned Items(Tekkit Rule)
&67. &eNo Asking for OP, Ranks, or Items
&68. &eRespect all Players
&69. &eObey Staff There the Law
&610. &eNo Racist or Sexist Remarks.
&611. &eNo Mods/Hacks
&612. &eNo Full Caps Messages
&614. &eNo 1x1 Towers
&613. &eNo Builds Near Spawn
<NextPage>
&6Mod/Admin Rules:
&61. Be Responsible with the privileges you are given as a Builder/Mod
&62. Do not spawn blocks or items for other players
&63. When Trading, only buy and sell legit items
&64. Only help build for other players using legit items and blocks
&65. No Power Abuse
# 97302WA2FJ4R9PXPGNJPD4VRGKB3

View File

@@ -0,0 +1,155 @@
welcome:
Enabled: true
Label: '{#white}Welcome {#gray}%cmi_user_display_name% {#white}to {#edward}%cmi_user_world_formatted%'
Description:
Width: 300
Lines:
- '{#green}Best minecraft server on earth!'
- ''
- '{#white}We are glad to have you here %cmi_user_display_name%{#white}!'
- 'If you have any questions, feel free to ask our staff'
VisualFields:
- Width: 300
Lines:
- '{#brown}Extra info line!'
Buttons:
Columns: 3
List:
- Label: '{#red}Read The Rules'
Width: 100
OpenDialog: license
Tooltip:
- '{#red}Read it before starting to play!'
- Label: '{#green>}Read a joke{#darkgreen<}'
Width: 100
OpenDialog: 'randomtext'
- Label: '{#edward>}Start Playing{#darkgreen<}'
Width: 100
Commands:
- closeinv!
- Label: '{#blue}Select a thing'
Width: 100
OpenDialog: inputexample
- Label: ''
Width: 1
- Label: '{#yellow}Visual examples'
Width: 100
OpenDialog: visualexample
- Label: '{#yellow}Visit Our Website %cmi_user_display_name%'
Width: 304
Url: www.zrips.net
Close:
Label: '{#pink>}Go Away!{#edward<}'
Tooltip:
- '{#pink>}Lets go %cmi_user_display_name%!{#edward<}'
Commands:
- 'cmi feed [playerName]'
Width: 150
visualexample:
Enabled: true
Label: '{#white}Visual examples'
Description:
Width: 300
Lines:
- '{#green}Descrption at the top!'
VisualFields:
- Width: 300
Lines:
- '{#brown}Extra info line!'
- Item: Stone;n{{#red}Custom name};e{sharpness:2}
Text:
Width: 150
Lines:
- '{#green}Item text with some auto wrapping and'
- ''
- '{#white}Multiline'
Width: 16
Height: 16
ShowTooltip: true
ShowDecorations: false
- Item: potato
Text:
Width: 150
Lines:
- '{#green}No tooltip on item'
Width: 16
Height: 16
ShowTooltip: false
- Item: '[ItemInHand]'
Text:
Lines:
- '{#green}%cmi_iteminhand_displayname% {#white}is what you are holding in your hand!'
Close:
Label: '{#edward}Go Back!'
OpenDialog: welcome
Width: 250
inputexample:
Enabled: true
Label: '{#white}Example of inputs'
Inputs:
- Label: '{#brown}Pick one'
Width: 150
Options:
- Label: Option A
OpenDialog: 'randomtext'
- Label: '{#red}Option B'
Default: true
Commands:
- 'cmi heal [playerName]'
- Label: Option C
- Label: 'Select it and get healed on save!'
OnTrue:
Commands:
- cmi heal [playerName]
OnFalse:
Commands:
- msg! [playerName] No free heal for you!
Buttons:
Columns: 1
List:
- Label: '{#yellow}Save'
Width: 150
Save: true
Close:
Label: '{#pink}Back'
OpenDialog: welcome
license:
Enabled: true
Label: '{#white}User Agreement'
VisualFields:
- Width: 350
Lines:
- 'By clicking “Agree with terms” or continuing to play on this server, you solemnly swear that:'
- ''
- ''
- ''
- '{#white}1. You will not grief, steal, or blow up someones house unless they literally begged you to. (And even then, record it for legal reasons.)'
- '{#nobel}2. You will not hack, fly, X-ray, or teleport through walls like a haunted AI. We like our ghosts dead and our walls solid.'
- '{#white}3. You agree that admins are always right, especially when theyre wrong. Disputes may be settled in a pit of lava.'
- '{#nobel}4. You will not spam the chat, unless its with memes approved by the Ministry of Silly Blocks™.'
- '{#white}5. You will build things, not just holes in the ground shaped like something inappropriate.'
- '{#nobel}6. You will not summon the Wither inside spawn. Seriously. Thats a one-way ticket to banville.'
- "{#white}7. You accept that lag may happen, creepers may explode, and your pet dog may randomly vanish. Its Minecraft, not therapy."
- "{#nobel}8. You promise not to ask for op, creative mode, free diamonds, or the admins credit card number."
- '{#white}9. You accept that this is a game, not a substitute for real-world dominance, revenge, or romance.'
- "{#nobel}10. You acknowledge that your building may be roasted — gently and with love — if it's a dirt cube."
- ''
- ''
- '{#white}By accepting, you agree to play nice, have fun, and not become the reason we disable TNT again.'
- ''
- '{#yellow}Click to enter blocky paradise.'
- 'Missclick to be gently kicked like a misbehaving parrot.'
Inputs:
- Type: Boolean
Label: 'Agree with terms'
OnTrue:
Commands:
- asConsole! cmi heal [playerName]
- closeinv!
OnFalse:
Commands:
- asConsole! cmi kick [playerName] You disagreed!
Close:
Label: 'Update!'
Save: true
Width: 150

View File

@@ -0,0 +1,19 @@
randomtext:
Enabled: true
Description:
Randomize: true
Lines:
- "{#yellow}Why did the creeper break up with the skeleton?\n\n{#green}Because he felt blown away!"
- "{#yellow}Why don't Endermen like jokes?\n\n{#green}They can't take things lightly!"
- '{#yellow}Why did Steve get lost?\n\n{#green}He didnt follow the chunky breadcrumbs!'
- '{#yellow}How does a Minecraft player avoid sunburn?\n\n{#green}Stay in the shade biome!'
- '{#yellow}Why was the Minecraft player a great musician?\n\n{#green}He had perfect block timing!'
- '{#yellow}Why did the chicken cross the Nether?\n\n{#green}To get to the other biome!'
- '{#yellow}How do you start a party in Minecraft?\n\n{#green}You block the creepers!'
- '{#yellow}Why was the villager so good at trading?\n\n{#green}Because he had emerald standards!'
- '{#yellow}What do you call a Minecraft celebration?\n\n{#green}A block party!'
- '{#yellow}Whats a skeletons least favorite room?\n\n{#green}The living room!'
Close:
Label: 'Back'
OpenDialog: 'welcome'
Width: 150

View File

@@ -0,0 +1,74 @@
# Player should have appropriate permission node to use particular kit: cmi.kit.[kitName]
# cmi.kit.newbie will allow to use newbie kit
# Possible custom variables: {USERNAME} {DISPLAYNAME} {WORLDNAME} {KITNAME} {RANDOMPLAYER}
# Edit kits ingame with /cmi kiteditor to avoid formating issues
# Commands support specialized command format
Newbie:
CommandName: Newbie
Description:
- '&eWill give you some stuff for money and exp'
- '&eCan be used every X minutes'
Delay: 36000
MoneyCost: 100
ExpCost: 30
Group: 'groupName'
Items:
'1':
v: 2730
type: STONE
amount: 70
meta:
==: ItemMeta
meta-type: UNSPECIFIC
display-name: §3Stone
lore:
- §2Name §3{USERNAME}
- §3Display name §2{DISPLAYNAME}
- §2Kit §3{KITNAME}
- §3World name §2{WORLDNAME}
enchants:
ARROW_DAMAGE: 3
THORNS: 5
'3':
v: 2730
type: OAK_PLANKS
amount: 30
Commands:
- 'asConsole! msg! [playerName] &eYou just got &6{KITNAME} &ekit!'
Conditions:
- cmi.kit.get
- cmi.command.fly
Advanced:
Delay: 36000
Items:
'1':
v: 2730
type: STONE
Ad2:
CommandName: Ad
Weight: 2
Delay: 36060
Group: resources
Items:
'1':
v: 2730
type: OAK_PLANKS
amount: 10
Ad1:
CommandName: Ad
Weight: 1
Delay: 36000
Group: resources
Items:
'1':
v: 2730
type: STONE
amount: 10
Ad3:
Delay: 36001
Group: resources
Items:
'1':
v: 2730
type: DIRT
amount: 10

View File

@@ -0,0 +1,2 @@
Manifest-Version: 1.0

View File

@@ -0,0 +1,248 @@
# Use ingame editor /cmi setworth to change prices
worth:
ACACIA_LEAVES: '0.5'
ACACIA_LOG: '0.6'
OAK_SAPLING: '0.22'
ACACIA_STAIRS: '1.09'
ACTIVATOR_RAIL: '1.0'
POPPY: '0.2'
ANVIL: '17.25'
APPLE: '1.76'
ARROW: '0.1'
BAKED_POTATO: '0.92'
BEACON: '1120.66'
BEEF: '0.17'
OAK_LEAVES: '0.11'
OAK_LOG: '0.66'
BIRCH_STAIRS: '0.3'
WHITE_CARPET: '1.06'
WHITE_STAINED_GLASS: '0.59'
WHITE_STAINED_GLASS_PANE: '0.22'
WHITE_TERRACOTTA: '0.22'
BLAZE_POWDER: '0.15'
BLAZE_ROD: '0.22'
BONE: '0.22'
BOOK: '1.18'
BOOKSHELF: '5.11'
BOWL: '0.15'
BREAD: '0.36'
BREWING_STAND: '1.94'
BRICK: '1.05'
STONE_SLAB: '0.53'
BRICK_STAIRS: '5.59'
BROWN_MUSHROOM_BLOCK: '2.2'
BUCKET: '5.45'
CACTUS: '0.5'
CAKE: '56.64'
CARROT: '0.4'
CARROT_ON_A_STICK: '0.91'
CAULDRON: '5.71'
CHEST: '1.6'
CHEST_MINECART: '5.74'
CHICKEN: '0.17'
STONE_BRICKS: '0.91'
CLAY: '2.42'
CLAY_BALL: '0.55'
CLOCK: '12.71'
COAL: '1.17'
COAL_BLOCK: '4.36'
COAL_ORE: '1.1'
COBBLESTONE: '0.22'
COBBLESTONE_STAIRS: '0.36'
COBBLESTONE_WALL: '4.26'
COBWEB: '3.0'
COMPARATOR: '2.42'
COMPASS: '14.64'
COOKED_BEEF: '0.4'
COOKED_CHICKEN: '0.4'
COOKED_COD: '4.07'
COOKED_PORKCHOP: '0.8'
COOKIE: '0.36'
CRAFTING_TABLE: '0.8'
DANDELION: '0.2'
DARK_OAK_STAIRS: '1.09'
DAYLIGHT_DETECTOR: '2.63'
DETECTOR_RAIL: '1.0'
DIAMOND: '44.0'
DIAMOND_BLOCK: '435.6'
DIAMOND_HORSE_ARMOR: '100.0'
DIAMOND_ORE: '88.0'
DIRT: '0.11'
DISPENSER: '2.58'
DRAGON_EGG: '2750.0'
DROPPER: '1.69'
EGG: '1.1'
EMERALD: '4.4'
EMERALD_BLOCK: '20.56'
EMERALD_ORE: '10.0'
ENCHANTED_BOOK: '30.0'
ENCHANTED_BOOK>PROTECTION_ENVIRONMENTALx2: '10.000000000000002'
ENCHANTING_TABLE: '136.82'
ENDER_CHEST: '20.99'
ENDER_EYE: '1.27'
ENDER_PEARL: '0.55'
END_STONE: '0.55'
EXPERIENCE_BOTTLE: '1.8'
FEATHER: '0.22'
FERMENTED_SPIDER_EYE: '4.18'
FIREWORK_ROCKET: '0.1'
FIREWORK_STAR: '1.0'
FIRE_CHARGE: '1.39'
FISHING_ROD: '0.57'
FLINT: '0.22'
FLINT_AND_STEEL: '0.5'
FLOWER_POT: '3.45'
FURNACE: '1.94'
FURNACE_MINECART: '5.11'
GHAST_TEAR: '165.0'
GLASS: '0.48'
GLASS_BOTTLE: '1.0'
GLASS_PANE: '0.2'
GLISTERING_MELON_SLICE: '0.4'
GLOWSTONE: '1.94'
GLOWSTONE_DUST: '0.44'
GOLDEN_APPLE: '251.1'
GOLDEN_CARROT: '3.35'
GOLDEN_HORSE_ARMOR: '100.0'
GOLD_BLOCK: '28.31'
GOLD_INGOT: '2.86'
GOLD_NUGGET: '0.35'
GOLD_ORE: '2.2'
GRASS_BLOCK: '0.22'
GRAVEL: '0.11'
GUNPOWDER: '0.22'
HAY_BLOCK: '1.09'
HEAVY_WEIGHTED_PRESSURE_PLATE: '3.63'
HOPPER: '10.83'
HOPPER_MINECART: '21.9'
ICE: '1.43'
INK_SAC: '0.08'
IRON_BARS: '0.68'
IRON_BLOCK: '16.34'
IRON_DOOR: '3.63'
IRON_HORSE_ARMOR: '100.0'
IRON_INGOT: '1.65'
IRON_ORE: '1.1'
ITEM_FRAME: '1.24'
JACK_O_LANTERN: '1.98'
JUKEBOX: '40.0'
JUNGLE_STAIRS: '0.3'
LADDER: '0.26'
LAPIS_BLOCK: '1.09'
LAPIS_ORE: '2.2'
SUNFLOWER: '0.01'
LAVA_BUCKET: '7.7'
LEAD: '0.85'
LEATHER: '0.24'
PUFFERFISH: '3.3'
LEVER: '0.35'
LIGHT_WEIGHTED_PRESSURE_PLATE: '6.29'
LILY_PAD: '1.1'
MAGMA_CREAM: '0.63'
MAP: '18.55'
MELON: '0.01'
MELON_SEEDS: '0.22'
MILK_BUCKET: '1.0'
MOSSY_COBBLESTONE: '3.87'
MUSHROOM_STEW: '0.65'
MUSIC_DISC_11: '1.0'
MUSIC_DISC_13: '1.0'
MUSIC_DISC_BLOCKS: '1.0'
MUSIC_DISC_CAT: '1.0'
MUSIC_DISC_CHIRP: '1.0'
MUSIC_DISC_FAR: '1.0'
MUSIC_DISC_MALL: '1.0'
MUSIC_DISC_MELLOHI: '1.0'
MUSIC_DISC_STAL: '1.0'
MUSIC_DISC_STRAD: '1.0'
MUSIC_DISC_WAIT: '1.0'
MUSIC_DISC_WARD: '1.0'
MUTTON: '3.3'
MYCELIUM: '0.88'
NAME_TAG: '110.0'
NETHERRACK: '0.22'
NETHER_BRICK: '0.68'
NETHER_BRICK_FENCE: '2.95'
NETHER_BRICK_STAIRS: '1.24'
NETHER_QUARTZ_ORE: '0.88'
NETHER_STAR: '990.0'
NETHER_WART: '1.1'
NOTE_BLOCK: '1.72'
OAK_BOAT: '1.0'
OAK_BUTTON: '0.2'
OAK_DOOR: '0.4'
OAK_FENCE: '0.49'
OAK_FENCE_GATE: '0.84'
OAK_PRESSURE_PLATE: '0.4'
OAK_SLAB: '0.1'
OAK_STAIRS: '0.3'
OAK_TRAPDOOR: '0.6'
OBSIDIAN: '8.8'
PACKED_ICE: '3.3'
PAINTING: '1.24'
PAPER: '0.28'
PISTON: '3.5'
POISONOUS_POTATO: '2.2'
POTATO: '0.44'
POTION: '1.29'
POWERED_RAIL: '1.0'
PRISMARINE: '10.0'
PRISMARINE_CRYSTALS: '2.2'
PRISMARINE_SHARD: '2.2'
PUMPKIN: '1.65'
PUMPKIN_PIE: '3.33'
PUMPKIN_SEEDS: '0.22'
QUARTZ: '0.22'
QUARTZ_BLOCK: '1.06'
QUARTZ_STAIRS: '1.6'
RABBIT: '3.3'
RABBIT_FOOT: '4.4'
RABBIT_HIDE: '3.3'
RAIL: '0.69'
REDSTONE: '0.11'
REDSTONE_BLOCK: '1.09'
REDSTONE_LAMP: '2.61'
REDSTONE_ORE: '2.0'
REDSTONE_TORCH: '0.23'
RED_MUSHROOM_BLOCK: '2.2'
REPEATER: '2.88'
ROTTEN_FLESH: '0.33'
SADDLE: '30.0'
SAND: '0.03'
SANDSTONE: '0.16'
SANDSTONE_STAIRS: '0.05'
SEA_LANTERN: '10.0'
SHEARS: '3.63'
OAK_SIGN: '0.44'
SLIME_BALL: '1.1'
SLIME_BLOCK: '10.89'
SNOWBALL: '0.01'
SNOW_BLOCK: '0.05'
SOUL_SAND: '0.11'
SPAWNER>PIG: '650.0'
SPIDER_EYE: '3.3'
SPONGE: '36.74'
SPRUCE_STAIRS: '0.3'
STICK: '0.1'
STICKY_PISTON: '5.06'
STONE: '0.39'
STONE_BRICK_STAIRS: '1.24'
STONE_BUTTON: '0.75'
STONE_PRESSURE_PLATE: '1.5'
STRING: '0.11'
SUGAR: '0.28'
SUGAR_CANE: '0.4'
TERRACOTTA: '0.22'
TNT: '1.36'
TNT_MINECART: '11.47'
TORCH: '0.15'
TRAPPED_CHEST: '2.93'
TRIPWIRE_HOOK: '1.06'
VINE: '1.0'
WATER_BUCKET: '6.6'
WHEAT: '0.4'
WHEAT_SEEDS: '0.2'
WHITE_BED: '1.69'
WHITE_WOOL: '0.48'
WRITABLE_BOOK: '1.67'
WRITTEN_BOOK: '5.0'

View File

@@ -0,0 +1,75 @@
hourly1:
DisplayName: "&7Hourly reward"
AutoClaim: true
Description:
- "&2Get reward for every hour you are online"
- "&2Free heal and 20 bucks into your pocket"
PayEvery: 3600
Commands:
- asConsole! cmi heal [playerName] -s
- asConsole! cmi money give [playerName] 20
daily1:
DisplayName: "&7Daily reward"
AutoClaim: true
Description:
- "&2Get reward for every 24 hours of playtime"
- "&22000 bucks into your pocket!"
PayEvery: 86400
Commands:
- asConsole! cmi money give [playerName] 2000
1hour:
DisplayName: "&fOne hour reward"
AutoClaim: false
Description:
- "&2Get reward for 1 hour you have been online"
- "&2500 bucks into your pocket!"
PayFor: 3600
Commands:
- asConsole! cmi money give [playerName] 500
6hour:
DisplayName: "&f6 hour reward"
AutoClaim: false
Description:
- "&2Get reward for 6 hour's you have been online"
- "&22 000 bucks into your pocket!"
PayFor: 21600
Commands:
- asConsole! cmi money give [playerName] 2000
12hour:
DisplayName: "&f12 hour reward"
AutoClaim: false
Description:
- "&2Get reward for 12 hour's you have been online"
- "&25 000 bucks into your pocket!"
PayFor: 43200
Commands:
- asConsole! cmi money give [playerName] 5000
24hour:
DisplayName: "&f24 hour reward"
AutoClaim: false
Description:
- "&2Get reward for 24 hour's you have been online"
- "&215 000 bucks into your pocket!"
PayFor: 86400
Commands:
- asConsole! cmi money give [playerName] 15000
7days:
DisplayName: "&f7 day reward"
AutoClaim: false
Description:
- "&2Get reward for 7 days you have been online"
- "&250 000 bucks into your pocket!"
PayFor: 604800
Commands:
- asConsole! cmi money give [playerName] 50000
30days:
DisplayName: "&f30 day reward"
AutoClaim: false
Description:
- "&2Get reward for 30 days you have been online"
- "&2500 000 bucks into your pocket!"
PayFor: 2592000
Commands:
- asConsole! cmi money give [playerName] 500000

View File

@@ -0,0 +1,129 @@
Newbie:
Enabled: true
DisplayName: "&2Newbie"
DefaultRank: true
AutoRankup: true
NextRanks:
- Branch1
- Branch2
Branch1:
Enabled: true
DisplayName: "&2Branch1"
AutoRankup: true
RankupConfirmation: true
Votes: 5
PermissionRequirement:
- "cmi.command.fly:Fly"
McMMORequirement:
- "woodcutting:10"
- "power:20"
JobsRequirement:
- "miner:10"
- "totallevel:20"
AuraSkillsRequirement:
- "miner:10"
- "power:20"
AureliumRequirement:
- "fishing:10"
- "power:30"
ItemRequirement:
- "stone:10"
- "stone:1:20"
- "book:20"
NextRanks:
- Branch1Rank1
MoneyCost: 100
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Branch1 rank!"
StatsRequirements:
- "PlayTime:3600"
- "travel:1000"
- "MonsterKills:zombie:10"
- "MonsterKills:slime:5"
- "MonsterKills:wolf:5"
- "AccountAge:1209600"
Branch1Rank1:
Enabled: true
DisplayName: "&2Branch1Rank1"
DefaultRank: false
AutoRankup: true
RankupConfirmation: false
PermissionRequirement:
- "cmi.command.heal:Heal"
NextRanks:
- Last
MoneyCost: 300
ExpCost: 350
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Branch1Rank1 rank!"
StatsRequirements:
- "travel:10000"
- "blocksmined:3000"
- "blocksmined:diamond_ore:30"
- "MonsterKills:1000"
- "AccountAge:1209600"
McMMORequirement:
- "taming:10"
- "unarmed:30"
Branch2:
Enabled: true
DisplayName: "&2Branch2"
AutoRankup: true
RankupConfirmation: true
MoneyCost: 150
NextRanks:
- Branch2Rank1
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Branch2 rank!"
PermissionRequirement:
- "cmi.command.tp:Teleport"
StatsRequirements:
- "PlayTime:3600"
- "travel:2000"
- "MonsterKills:zombie:15"
- "MonsterKills:slime:10"
Branch2Rank1:
Enabled: true
DisplayName: "&2Branch2Rank1"
AutoRankup: true
RankupConfirmation: false
MoneyCost: 100
ExpCost: 150
NextRanks:
- Branch2Rank2
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Branch1Rank1 rank!"
StatsRequirements:
- "PlayTime:4600"
- "Swim:1000"
- "SneakTime:180"
- "MonsterKills:100"
Branch2Rank2:
Enabled: true
DisplayName: "&2Branch2Rank2"
AutoRankup: true
RankupConfirmation: false
MoneyCost: 100
ExpCost: 150
NextRanks:
- Last
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Branch2Rank2 rank!"
StatsRequirements:
- "walk:15000"
- "HorseTravel:1000"
- "ItemsUsed:10000"
- "PlayerKills:10"
Last:
Enabled: true
DisplayName: "&2Last"
AutoRankup: true
StatsRequirements:
- "PlayTime:21600"
- "walk:30000"
- "MonsterKills:1000"
- "blocksmined:30000"
Commands:
- "broadcast! &6[playerDisplayName] &eleveled up to Last rank!"
- "cmi heal [playerName]"
- "money give [playerName] 100"

View File

@@ -0,0 +1,78 @@
GiveDiamonds:
Enabled: false
MinPlayers: 3
FeedBack: true
Repeat: true
PerformOn:
1:
Hour: 18
Commands:
- cmi give [randomPlayer] diamond %rand/1-5%
- msg! [randomPlayer] &eYou just got diamonds!
StopServer:
Enabled: false
PerformOn:
1:
Hour: 3
Minute: 59
Second: 30
Commands:
- actionbar! &eServer will stop in &630 &esec!
- delay! 5
- actionbar! &eServer will stop in &625 &esec!
- delay! 5
- actionbar! &eServer will stop in &620 &esec!
- delay! 5
- actionbar! &eServer will stop in &615 &esec!
- delay! 5
- actionbar! &eServer will stop in &610 &esec!
- delay! 5
- actionbar! &eServer will stop in &65 &esec!
- delay! 1
- actionbar! &eServer will stop in &64 &esec!
- delay! 1
- actionbar! &eServer will stop in &63 &esec!
- delay! 1
- actionbar! &eServer will stop in &62 &esec!
- delay! 1
- actionbar! &eServer will stop in &61 &esec!
- delay! 1
- kickall! &eServer will be back online soon!
- delay! 1
- stop
AllInOneJustExample:
Enabled: false
MinPlayers: 3
MaxPlayers: 10
FeedBack: false
Delay: 600
Repeat: true
PerformOn:
1:
Month: 12
Day: monday
Hour: 18
Minute: 36
Second: 15
2:
Hour: 18
Commands:
- cmi give [randomPlayer] diamond %rand/1-5%
- msg! [randomPlayer] &eYou just got diamonds!
- broadcast! &e[randomPlayer] just got some stuff!
- delay! 1
- actionbar! &eServer will stop in &61 &esec!
- kickall! &eServer will be back online soon!
Announcer:
Enabled: false
MinPlayers: 1
FeedBack: false
Delay: 600
Repeat: true
Randomize: true
Commands:
- broadcast! &eRules can be found at &e/rules
- broadcast! &eKits can be accesed with &e/kits
- broadcast! &eIf you need help, ask staff
- broadcast! &eAdvertisement of other servers will be punished

View File

@@ -0,0 +1,72 @@
name: CMI
main: com.Zrips.CMI.CMI
version: 9.8.4.10
website: https://www.spigotmc.org/resources/content-management-interface.3742/
author: Zrips
api-version: 1.13
folia-supported: true
description: Powerful server management tool
depend: [CMILib]
commands:
cmi:
description: basic command
permissions:
cmi.command:
description: Grants access to base command
default: true
cmi.deathlocation:
description: Grants access to see death location after you die
default: op
cmi.buttonteleport:
description: Grants access to the teleport button
default: op
cmi.invedit:
description: Grants option to edit inventory
default: op
cmi.enderedit:
description: Grants option to edit ender chest
default: op
cmi.elytra:
description: Grants access to elytra usage
default: true
cmi.chorusteleport:
description: Grants access to chorus fruit teleport usage
default: true
cmi.safeteleport:
description: Safe teleportations
default: op
cmi.permisiononerror:
description: Shows missing permission node when hovering over error message
default: true
cmi.bossbar.hpbar:
description: Shows boss bar hp bar when dealing damage
default: true
cmi.egginteract.*:
description: Allows to use all eggs on spawners
default: op
cmi.command.ctext:
description: Shows custom text
default: true
cmi.command.kit:
description: Gives predefined kit.
default: true
cmi.command.warp.showlist:
default: true
cmi.command.checkban.seereason:
description: Allows to see players ban reason
default: true
cmi.command.mail.send:
description: Allows to send mail
default: true
cmi.command.mail.read:
description: Allows to read mail
default: true
cmi.command.mail.clear:
description: Allows to clear mail
default: true
cmi.openshulker.edit:
description: Allows to edit shulker backpack
default: true
cmi.command.itemlore.modification:
description: Allows to modify existing item lore
default: true

213
README.md
View File

@@ -1,33 +1,21 @@
# EssentialsC # EssentialsC
> 一个轻量级的 Paper 服务器插件,灵感来自 CMI但更加精简、易用且现代化。 一个轻量级的 Paper 服务器核心插件,灵感来自 CMI但更加精简、易用且现代化。
[![Version](https://img.shields.io/github/v/release/Coldsmiles/EssentialsC?style=flat-square)](https://github.com/Coldsmiles/EssentialsC/releases) ## ✨ 功能特性
[![License](https://img.shields.io/github/license/Coldsmiles/EssentialsC?style=flat-square)](LICENSE)
[![Paper](https://img.shields.io/badge/Paper-1.21+-8A2BE2?style=flat-square)](https://papermc.io/)
[![Java](https://img.shields.io/badge/Java-21+-orange?style=flat-square)](https://www.oracle.com/java/)
## ✨ 核心特性
### 🎯 随身功能方块 ### 🎯 随身功能方块
随时随地打开各种功能性方块,无需放置实体方块: 随时随地打开各种功能性方块,无需放置实体方块:
- **工作台** (`/workbench`, `/wb`) - 工作台 (`/workbench`, `/wb`)
- **铁砧** (`/anvil`) - 铁砧 (`/anvil`)
- **制图台** (`/cartographytable`, `/ct`) - 制图台 (`/cartographytable`, `/ct`)
- **砂轮** (`/grindstone`, `/gs`) - 砂轮 (`/grindstone`, `/gs`)
- **织布机** (`/loom`) - 织布机 (`/loom`)
- **锻造台** (`/smithingtable`, `/st`) - 锻造台 (`/smithingtable`, `/st`)
- **切石机** (`/stonecutter`, `/sc`) - 切石机 (`/stonecutter`, `/sc`)
- **末影箱** (`/enderchest`, `/ec`)
### 📦 智能容器管理
- **潜影盒快捷打开** - 潜行+右键直接打开(类似 CMI
- ✅ 支持自定义标题(可配置)
- ✅ 防刷物品机制(快照验证 + 数量检查)
- ✅ 防止套娃(不能放入另一个潜影盒)
- ✅ 异常恢复(物品丢失自动掉落)
### 🔧 实用工具 ### 🔧 实用工具
- **末影箱** (`/enderchest`, `/ec`) - 随时访问末影箱
- **帽子** (`/hat`) - 将手中物品戴在头上 - **帽子** (`/hat`) - 将手中物品戴在头上
- **自杀** (`/suicide`, `/die`) - 快速自杀 - **自杀** (`/suicide`, `/die`) - 快速自杀
- **飞行** (`/fly`) - 切换飞行模式 - **飞行** (`/fly`) - 切换飞行模式
@@ -43,83 +31,90 @@
- **功能方块菜单** (`/essc blocks`) - GUI 方块集合面板 - **功能方块菜单** (`/essc blocks`) - GUI 方块集合面板
- **配置重载** (`/essc reload`) - 重新加载配置文件 - **配置重载** (`/essc reload`) - 重新加载配置文件
--- ### 🌍 多语言支持
- 完整的中文和英文配置
- 方块标题自动跟随客户端语言
- 可自定义所有消息文本
## 🌍 多语言支持 ### ⚡ 权限控制
- 精细的权限管理系统
- 帮助菜单智能显示(只显示有权限的命令)
- 默认仅 OP 可用,可通过权限插件授权
- CMI 风格的命令别名支持
- 潜行+右键潜影盒直接打开(无需放置)
- ✅ 完整的中文和英文配置 ## 📦 安装
- ✅ 方块标题自动跟随客户端语言
- ✅ 可自定义所有消息文本
## ⚡ 权限系统 ### 要求
- Paper 1.21+ 服务器
- Java 21+
- ✅ 精细的权限管理 ### 步骤
- ✅ 帮助菜单智能显示(只显示有权限的命令)
- ✅ 默认仅 OP 可用,可通过权限插件授权
- ✅ CMI 风格的命令别名支持
## 📦 快速开始
### 系统要求
- **服务器**: Paper 1.21+
- **Java**: 21+
### 安装步骤
1. 下载最新版本的 [`essentialsc-*.jar`](https://github.com/Coldsmiles/EssentialsC/releases) 1. 下载最新版本的 [`essentialsc-*.jar`](https://github.com/Coldsmiles/EssentialsC/releases)
2. 将文件放入服务器的 `plugins` 文件夹 2. 将文件放入服务器的 `plugins` 文件夹
3. 重启服务器 3. 重启服务器
4. 编辑 `plugins/EssentialsC/config.yml` 配置语言 4. 编辑 `plugins/EssentialsC/config.yml` 配置语言
5. (可选)使用权限插件为玩家授予相应权限 5. (可选)使用权限插件为玩家授予相应权限
## 🎮 命令列表 ## 🎮 命令
### 基础命令 ### 基础命令
| 命令 | 说明 | ```
|------|------| /essc help # 显示帮助菜单(根据权限动态显示)
| `/essc help` | 显示帮助菜单(根据权限动态显示) | /essc reload # 重载配置(管理员)
| `/essc reload` | 重载配置(管理员) | /essc blocks # 打开功能方块菜单
| `/essc blocks` | 打开功能方块菜单 | ```
### 功能方块命令 ### 功能方块命令
| 命令 | 别名 | 说明 | ```
|------|------|------| /workbench, /wb # 打开工作台
| `/workbench` | `/wb` | 打开工作台 | /anvil # 打开铁砧
| `/anvil` | - | 打开铁砧 | /cartographytable, /ct # 打开制图台
| `/cartographytable` | `/ct` | 打开制图台 | /grindstone, /gs # 打开砂轮
| `/grindstone` | `/gs` | 打开砂轮 | /loom # 打开织布机
| `/loom` | - | 打开织布机 | /smithingtable, /st # 打开锻造台
| `/smithingtable` | `/st` | 打开锻造台 | /stonecutter, /sc # 打开切石机
| `/stonecutter` | `/sc` | 打开切石机 | /enderchest, /ec # 打开末影箱
| `/enderchest` | `/ec` | 打开末影箱 | ```
### 其他命令 ### 其他命令
| 命令 | 别名 | 说明 | ```
|------|------|------| /hat # 将手中物品戴在头上
| `/hat` | - | 将手中物品戴在头上 | /suicide, /die # 自杀
| `/suicide` | `/die` | 自杀 | /fly # 切换飞行模式
| `/fly` | - | 切换飞行模式 | /heal # 恢复生命值和饱食度
| `/heal` | - | 恢复生命值和饱食度 | /vanish, /v # 切换隐身模式(管理员)
| `/vanish` | `/v` | 切换隐身模式(管理员) | /seen, /info <玩家> # 查看玩家信息(管理员)
| `/seen` | `/info` | 查看玩家信息(管理员) | /feed # 补满饱食度
| `/feed` | - | 补满饱食度 | /repair, /rep # 修复手中或所有物品
| `/repair` | `/rep` | 修复手中或所有物品 | /repair all # 修复所有物品
```
> 💡 **提示**: 使用 `/repair all` 可以修复背包中的所有物品 ### 命令别名
- `/essentialsc` = `/essc`
- `/workbench` = `/wb`
- `/cartographytable` = `/ct`
- `/grindstone` = `/gs`
- `/smithingtable` = `/st`
- `/stonecutter` = `/sc`
- `/enderchest` = `/ec`
- `/suicide` = `/die`
- `/vanish` = `/v`
- `/seen` = `/info`
- `/repair` = `/rep`
## ⚙️ 配置说明 ## ⚙️ 配置
### config.yml ### config.yml
```yaml ```yaml
# 语言设置 (en_US, zh_CN) # 语言设置
# 可用语言: en_US, zh_CN
language: "zh_CN" language: "zh_CN"
# 通用设置 # 通用设置
settings: settings:
enable-feedback: true # 启用命令反馈消息 # 启用或禁用命令反馈消息
enable-feedback: true
# 潜影盒设置
shulkerbox:
default-title: "&e潜影盒" # 默认标题(支持颜色代码)
``` ```
### 自定义语言 ### 自定义语言
@@ -127,9 +122,8 @@ shulkerbox:
## 🔐 权限节点 ## 🔐 权限节点
所有命令默认需要 OP 权限。使用权限插件授予权限: 所有命令默认需要 OP 权限。使用权限插件(如 LuckPerms授予权限:
### 基础权限
``` ```
essentialsc.command.workbench # 工作台 essentialsc.command.workbench # 工作台
essentialsc.command.anvil # 铁砧 essentialsc.command.anvil # 铁砧
@@ -147,30 +141,70 @@ essentialsc.command.vanish # 隐身
essentialsc.command.seen # 玩家查询 essentialsc.command.seen # 玩家查询
essentialsc.command.feed # 饱食度 essentialsc.command.feed # 饱食度
essentialsc.command.repair # 修复 essentialsc.command.repair # 修复
essentialsc.shulkerbox.open # 潜行+右键潜影盒
```
### 管理权限
```
essentialsc.command.blocks # 功能方块菜单 essentialsc.command.blocks # 功能方块菜单
essentialsc.command.reload # 重载配置 essentialsc.command.reload # 重载配置
essentialsc.command.help # 帮助(默认开放) essentialsc.command.help # 帮助(默认开放)
``` essentialsc.shulkerbox.open # 潜行+右键潜影盒直接打开
### 通配符
```
essentialsc.* # 所有权限 essentialsc.* # 所有权限
``` ```
## 🔨 从源码构建 ### 示例:使用 LuckPerms 授权
```bash
# 给单个玩家授权
/lp user <玩家名> permission set essentialsc.command.workbench true
# 给用户组授权
/lp group vip permission set essentialsc.command.workbench true
# 授权所有命令
/lp group admin permission set essentialsc.* true
```
## 🔨 构建
从源代码构建插件:
```bash ```bash
git clone https://github.com/Coldsmiles/EssentialsC.git git clone https://github.com/Coldsmiles/EssentialsC.git
cd EssentialsC cd EssentialsC
./gradlew build mvn clean package
``` ```
编译后的文件位于 `build/libs/essentialsc-*.jar` 编译后的文件位于 `target/essentialsc-*.jar`
## 📝 特性
- ✅ CMI 风格的命令别名系统
- ✅ 智能权限过滤的帮助菜单
- ✅ 完整的多语言支持
- ✅ 功能方块权限菜单
- ✅ 潜行+右键潜影盒直接打开
- ✅ 轻量级无依赖设计
- ✅ 现代化的 Paper API 支持
## 🔄 更新日志
### v1.2.0
- ✨ 新增潜行+右键潜影盒直接打开功能(类似 CMI
- ✨ 功能方块菜单配置化(从 config.yml 读取)
- ✨ 功能方块菜单添加音效反馈
- ✨ CMI 风格命令别名系统
- ⚡ 优化代码结构和性能
- 📝 完善权限配置
- 🗑️ 移除管理员菜单
- 🗑️ 移除附魔台功能
### v1.1.0
- ✨ 新增功能方块菜单 (`/essc blocks`)
- ✨ 添加命令别名系统
- ⚡ 优化代码结构和性能
- 📝 完善权限配置
### v1.0.0
- 🎉 首次发布
- 实现基础功能方块命令
- 添加多语言支持
- 实现权限控制系统
## 🤝 贡献 ## 🤝 贡献
@@ -181,6 +215,9 @@ cd EssentialsC
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件
## 👨‍💻 作者 ## 👨‍💻 作者
**Coldsmiles_7**
- GitHub: [@Coldsmiles](https://github.com/Coldsmiles) - GitHub: [@Coldsmiles](https://github.com/Coldsmiles)
- 网站: www.infstar.cn - 网站: www.infstar.cn

View File

@@ -1,229 +0,0 @@
plugins {
id 'java'
id 'io.papermc.paperweight.userdev' version '2.0.0-beta.21'
id 'com.gradleup.shadow' version '8.3.6'
}
group = 'cn.infstar'
version = '1.3.0'
repositories {
mavenCentral()
maven {
name = 'papermc'
url = uri('https://repo.papermc.io/repository/maven-public/')
}
}
dependencies {
paperweight.paperDevBundle('1.21.11-R0.1-SNAPSHOT')
}
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
}
def excludedModules = project.hasProperty('excludeModules') ?
project.property('excludeModules').split(',')*.trim() : []
def includeBlocks = !excludedModules.contains('blocks')
def includePlayer = !excludedModules.contains('player')
def includeJeiFix = !excludedModules.contains('jei-fix')
def includeMobDrops = !excludedModules.contains('mob-drops')
println "\n📦 EssentialsC 模块配置:"
println " ✅ Core (核心)"
println " ${includeBlocks ? '✅' : '❌'} Blocks (便捷方块)"
println " ${includePlayer ? '✅' : '❌'} Player (玩家管理)"
println " ${includeJeiFix ? '✅' : '❌'} JEI Fix (JEI 修复)"
println " ${includeMobDrops ? '✅' : '❌'} Mob Drops (生物掉落物)"
println ""
sourceSets {
main {
java {
if (!includeBlocks) {
exclude '**/commands/WorkbenchCommand.java'
exclude '**/commands/AnvilCommand.java'
exclude '**/commands/CartographyTableCommand.java'
exclude '**/commands/GrindstoneCommand.java'
exclude '**/commands/LoomCommand.java'
exclude '**/commands/SmithingTableCommand.java'
exclude '**/commands/StonecutterCommand.java'
exclude '**/commands/EnderChestCommand.java'
exclude '**/commands/BlocksMenuCommand.java'
exclude '**/listeners/ShulkerBoxListener.java'
}
if (!includePlayer) {
exclude '**/commands/FlyCommand.java'
exclude '**/commands/HealCommand.java'
exclude '**/commands/FeedCommand.java'
exclude '**/commands/VanishCommand.java'
exclude '**/commands/SeenCommand.java'
exclude '**/commands/HatCommand.java'
exclude '**/commands/SuicideCommand.java'
exclude '**/commands/RepairCommand.java'
}
if (!includeJeiFix) {
exclude '**/listeners/JeiRecipeSyncListener.java'
}
if (!includeMobDrops) {
exclude '**/listeners/MobDropListener.java'
exclude '**/listeners/MobDropMenuListener.java'
exclude '**/commands/MobDropCommand.java'
}
}
}
}
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8'
}
processResources {
filteringCharset = 'UTF-8'
inputs.property('version', project.version)
filesMatching('paper-plugin.yml') {
expand('version': project.version)
}
}
shadowJar {
enabled = false
}
// ========== 多版本构建任务 ==========
task shadowJarStandard(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
from sourceSets.main.output
configurations = [project.configurations.runtimeClasspath]
exclude '**/listeners/MobDropListener.class'
exclude '**/listeners/MobDropMenuListener.class'
exclude '**/commands/MobDropCommand.class'
archiveFileName.set("EssentialsC-${project.version}.jar")
}
task shadowJarAll(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
from sourceSets.main.output
configurations = [project.configurations.runtimeClasspath]
archiveFileName.set("EssentialsC-all-${project.version}.jar")
}
task shadowJarLite(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
from sourceSets.main.output
configurations = [project.configurations.runtimeClasspath]
exclude '**/commands/WorkbenchCommand.class'
exclude '**/commands/AnvilCommand.class'
exclude '**/commands/CartographyTableCommand.class'
exclude '**/commands/GrindstoneCommand.class'
exclude '**/commands/LoomCommand.class'
exclude '**/commands/SmithingTableCommand.class'
exclude '**/commands/StonecutterCommand.class'
exclude '**/commands/EnderChestCommand.class'
exclude '**/commands/BlocksMenuCommand.class'
exclude '**/listeners/ShulkerBoxListener.class'
archiveFileName.set("EssentialsC-lite-${project.version}.jar")
}
build {
dependsOn shadowJarAll
}
// ========== 部署任务 ==========
task deployToPaper12111(type: Copy) {
group = 'deployment'
description = '部署到 Paper 1.21.11 测试服务器(仅完整版)'
dependsOn shadowJarAll
from shadowJarAll
into "${projectDir}/test-server/paper-1.21.11/plugins"
doLast {
println "✅ 插件已部署到 Paper 1.21.11: ${projectDir}/test-server/paper-1.21.11/plugins"
}
}
task deployToPaper26 {
group = 'deployment'
description = '部署到 Paper 26.1.2 测试服务器(仅完整版)'
dependsOn shadowJarAll
doFirst {
def pluginsDir = file("${projectDir}/test-server/paper-26.1.2/plugins")
if (pluginsDir.exists()) {
// 删除所有 EssentialsC 相关的 JAR 文件
fileTree(pluginsDir).include('EssentialsC*.jar').each { file ->
println "🗑️ 删除旧插件: ${file.name}"
file.delete()
}
// 删除配置文件夹
def configDir = file("${pluginsDir}/EssentialsC")
if (configDir.exists()) {
println "🗑️ 删除旧配置文件夹"
configDir.deleteDir()
}
println "✅ 清理完成"
} else {
println "⚠️ plugins 目录不存在,跳过清理"
}
}
doLast {
copy {
from shadowJarAll.archiveFile
into "${projectDir}/test-server/paper-26.1.2/plugins"
}
println "✅ 插件已部署到 Paper 26.1.2: ${projectDir}/test-server/paper-26.1.2/plugins"
}
}
// Paper 26.1.2 一键构建和部署任务
task buildAndDeployToPaper26 {
group = 'deployment'
description = '一键构建并部署到 Paper 26.1.2'
dependsOn clean, deployToPaper26
}
// 默认部署到 Paper 1.21.11
task deployToTestServer {
dependsOn deployToPaper12111
}
build.finalizedBy deployToTestServer
task buildAllVersions {
group = 'build'
description = '构建所有版本的插件'
dependsOn shadowJarStandard, shadowJarAll, shadowJarLite
doLast {
println "\n🎉 所有版本构建完成!"
println "📦 标准版: EssentialsC-${project.version}.jar"
println "📦 完整版: EssentialsC-all-${project.version}.jar"
println "📦 轻量版: EssentialsC-lite-${project.version}.jar"
println "📁 输出目录: ${buildDir}/libs/"
def standardFile = file("${buildDir}/libs/EssentialsC-${project.version}.jar")
def allFile = file("${buildDir}/libs/EssentialsC-all-${project.version}.jar")
def liteFile = file("${buildDir}/libs/EssentialsC-lite-${project.version}.jar")
if (!standardFile.exists()) {
throw new GradleException("❌ 标准版文件不存在!")
}
if (!allFile.exists()) {
throw new GradleException("❌ 完整版文件不存在!")
}
if (!liteFile.exists()) {
throw new GradleException("❌ 轻量版文件不存在!")
}
println "✅ 所有文件验证通过!"
}
}

View File

@@ -1,7 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

116
pom.xml Normal file
View File

@@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.infstar</groupId>
<artifactId>essentialsc</artifactId>
<version>1.2.0</version>
<packaging>jar</packaging>
<name>essentialsc</name>
<properties>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<test.server.path>${project.basedir}/test-server/plugins</test.server.path>
</properties>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>copy-to-test-server</id>
<phase>package</phase>
<configuration>
<target>
<echo message="Cleaning old plugin files..."/>
<!-- 删除测试服务器中所有旧版本的插件文件 -->
<delete>
<fileset dir="${test.server.path}" includes="essentialsc-*.jar"/>
</delete>
<echo message="Copying plugin to test server..."/>
<copy file="${project.build.directory}/${project.build.finalName}.jar"
tofile="${test.server.path}/${project.build.finalName}.jar"
overwrite="true"/>
<echo message="Plugin copied successfully!"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<!-- 阿里云 Maven 镜像 -->
<repository>
<id>aliyunmaven</id>
<url>https://maven.aliyun.com/repository/public</url>
</repository>
<!-- PaperMC 仓库 -->
<repository>
<id>papermc-repo</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<!-- ProtocolLib 仓库 -->
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.11-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- ProtocolLib 依赖 (5.4.0+ 迁移到 Maven Central) -->
<dependency>
<groupId>net.dmulloy2</groupId>
<artifactId>ProtocolLib</artifactId>
<version>5.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -1,18 +0,0 @@
pluginManagement {
repositories {
// 阿里云 Gradle 插件镜像(优先)
maven {
name = 'aliyun-gradle-plugin'
url = uri('https://maven.aliyun.com/repository/gradle-plugin')
}
// Gradle 官方插件仓库
gradlePluginPortal()
// PaperMC 官方仓库(用于 paperweight 插件)
maven {
name = 'papermc'
url = uri('https://repo.papermc.io/repository/maven-public/')
}
}
}
rootProject.name = 'EssentialsC'

View File

@@ -1,6 +1,8 @@
package cn.infstar.essentialsC; package cn.infstar.essentialsC;
import cn.infstar.essentialsC.commands.*; import cn.infstar.essentialsC.commands.*;
import cn.infstar.essentialsC.listeners.InventoryTitleListener;
import cn.infstar.essentialsC.listeners.ShulkerBoxListener;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -11,166 +13,106 @@ import java.lang.reflect.Field;
public final class EssentialsC extends JavaPlugin { public final class EssentialsC extends JavaPlugin {
private static LangManager langManager; private static LangManager langManager;
private static InventoryTitleListener inventoryTitleListener;
@Override @Override
public void onEnable() { public void onEnable() {
// 初始化语言管理器
langManager = new LangManager(this); langManager = new LangManager(this);
registerPluginChannels();
// 检查 ProtocolLib 是否可用
boolean protocolLibAvailable = checkProtocolLib();
// 如果 ProtocolLib 可用,注册 InventoryTitleListener
if (protocolLibAvailable) {
inventoryTitleListener = new InventoryTitleListener(this);
getLogger().info("ProtocolLib 已检测到,启用自定义标题功能!");
} else {
getLogger().warning("ProtocolLib 未检测到,将使用默认标题。");
}
// 注册监听器
registerListeners(); registerListeners();
// 注册命令
registerCommands(); registerCommands();
getLogger().info("插件已启用!版本: " + getDescription().getVersion()); getLogger().info("EssentialsC 插件已启用!");
getLogger().info("当前语言: " + langManager.getCurrentLanguage());
} }
@Override @Override
public void onDisable() { public void onDisable() {
// 清理 InventoryTitleListener
if (inventoryTitleListener != null) {
inventoryTitleListener.cleanup();
}
getLogger().info("EssentialsC 插件已禁用!"); getLogger().info("EssentialsC 插件已禁用!");
} }
/**
* 获取语言管理器实例
*/
public static LangManager getLangManager() { public static LangManager getLangManager() {
return langManager; return langManager;
} }
/** /**
* 注册 JEI 配方同步所需的插件频道 * 获取 InventoryTitleListener 实例
*/ */
private void registerPluginChannels() { public static InventoryTitleListener getInventoryTitleListener() {
org.bukkit.plugin.messaging.Messenger messenger = getServer().getMessenger(); return inventoryTitleListener;
// 注册 Fabric 和 NeoForge 的配方同步频道
messenger.registerOutgoingPluginChannel(this, "fabric:recipe_sync");
messenger.registerOutgoingPluginChannel(this, "neoforge:recipe_content");
} }
/**
* 检查 ProtocolLib 是否可用
*/
private boolean checkProtocolLib() {
return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib");
}
/**
* 注册所有监听器
*/
private void registerListeners() { private void registerListeners() {
if (registerListener("cn.infstar.essentialsC.listeners.ShulkerBoxListener")) { // 注册潜影盒右键打开监听器
getLogger().info("- 潜影盒模块"); new ShulkerBoxListener(this);
} getLogger().info("成功注册监听器!");
if (registerListener("cn.infstar.essentialsC.listeners.JeiRecipeSyncListener")) {
getLogger().info("- JEI 配方同步");
}
if (registerListener("cn.infstar.essentialsC.listeners.MobDropListener")) {
try {
Class.forName("cn.infstar.essentialsC.listeners.MobDropMenuListener");
new cn.infstar.essentialsC.listeners.MobDropMenuListener(this);
} catch (ClassNotFoundException e) {
}
getLogger().info("- 生物掉落控制");
}
}
private boolean registerListener(String className) {
try {
Class<?> listenerClass = Class.forName(className);
Object listenerInstance = listenerClass.getConstructor(EssentialsC.class).newInstance(this);
getServer().getPluginManager().registerEvents((org.bukkit.event.Listener) listenerInstance, this);
return true;
} catch (Exception e) {
return false;
}
} }
private void registerCommands() { private void registerCommands() {
try { try {
// 获取 CommandMap
Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap");
bukkitCommandMap.setAccessible(true); bukkitCommandMap.setAccessible(true);
org.bukkit.command.CommandMap commandMap = (org.bukkit.command.CommandMap) bukkitCommandMap.get(Bukkit.getServer()); org.bukkit.command.CommandMap commandMap = (org.bukkit.command.CommandMap) bukkitCommandMap.get(Bukkit.getServer());
int commandCount = 0; // 注册所有命令(使用 CMI 风格:独立命令 + 别名)
if (classExists("cn.infstar.essentialsC.commands.WorkbenchCommand")) {
registerCommandWithAliases(commandMap, "workbench", new WorkbenchCommand(), "wb"); registerCommandWithAliases(commandMap, "workbench", new WorkbenchCommand(), "wb");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.AnvilCommand")) {
registerCommandWithAliases(commandMap, "anvil", new AnvilCommand()); registerCommandWithAliases(commandMap, "anvil", new AnvilCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.CartographyTableCommand")) {
registerCommandWithAliases(commandMap, "cartographytable", new CartographyTableCommand(), "ct", "cartography"); registerCommandWithAliases(commandMap, "cartographytable", new CartographyTableCommand(), "ct", "cartography");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.GrindstoneCommand")) {
registerCommandWithAliases(commandMap, "grindstone", new GrindstoneCommand(), "gs"); registerCommandWithAliases(commandMap, "grindstone", new GrindstoneCommand(), "gs");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.LoomCommand")) {
registerCommandWithAliases(commandMap, "loom", new LoomCommand()); registerCommandWithAliases(commandMap, "loom", new LoomCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.SmithingTableCommand")) {
registerCommandWithAliases(commandMap, "smithingtable", new SmithingTableCommand(), "st", "smithing"); registerCommandWithAliases(commandMap, "smithingtable", new SmithingTableCommand(), "st", "smithing");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.StonecutterCommand")) {
registerCommandWithAliases(commandMap, "stonecutter", new StonecutterCommand(), "sc"); registerCommandWithAliases(commandMap, "stonecutter", new StonecutterCommand(), "sc");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.EnderChestCommand")) {
registerCommandWithAliases(commandMap, "enderchest", new EnderChestCommand(), "ec"); registerCommandWithAliases(commandMap, "enderchest", new EnderChestCommand(), "ec");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.BlocksMenuCommand")) {
registerCommandWithAliases(commandMap, "blocks", new BlocksMenuCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.FlyCommand")) {
registerCommandWithAliases(commandMap, "fly", new FlyCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.HealCommand")) {
registerCommandWithAliases(commandMap, "heal", new HealCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.FeedCommand")) {
registerCommandWithAliases(commandMap, "feed", new FeedCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.VanishCommand")) {
registerCommandWithAliases(commandMap, "vanish", new VanishCommand(), "v");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.SeenCommand")) {
registerCommandWithAliases(commandMap, "seen", new SeenCommand(), "info");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.HatCommand")) {
registerCommandWithAliases(commandMap, "hat", new HatCommand()); registerCommandWithAliases(commandMap, "hat", new HatCommand());
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.SuicideCommand")) {
registerCommandWithAliases(commandMap, "suicide", new SuicideCommand(), "die"); registerCommandWithAliases(commandMap, "suicide", new SuicideCommand(), "die");
commandCount++; registerCommandWithAliases(commandMap, "fly", new FlyCommand());
} registerCommandWithAliases(commandMap, "heal", new HealCommand());
if (classExists("cn.infstar.essentialsC.commands.RepairCommand")) { registerCommandWithAliases(commandMap, "vanish", new VanishCommand(), "v");
registerCommandWithAliases(commandMap, "seen", new SeenCommand(), "info");
registerCommandWithAliases(commandMap, "feed", new FeedCommand());
registerCommandWithAliases(commandMap, "repair", new RepairCommand(), "rep"); registerCommandWithAliases(commandMap, "repair", new RepairCommand(), "rep");
commandCount++;
}
if (classExists("cn.infstar.essentialsC.commands.MobDropCommand")) {
registerCommandWithAliases(commandMap, "mobdrops", new MobDropCommand());
commandCount++;
}
registerCommandWithAliases(commandMap, "essentialsc", new HelpCommand(), "essc"); registerCommandWithAliases(commandMap, "essentialsc", new HelpCommand(), "essc");
commandCount++;
getLogger().info("成功注册所有命令!");
} catch (Exception e) { } catch (Exception e) {
getLogger().severe("无法注册命令: " + e.getMessage()); getLogger().severe("无法注册命令: " + e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
} }
private boolean classExists(String className) {
try {
Class.forName(className);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
/** /**
* 注册命令并支持别名 * 注册命令并支持别名
* @param commandMap Bukkit CommandMap * @param commandMap Bukkit CommandMap

View File

@@ -33,23 +33,20 @@ public abstract class BaseCommand implements CommandExecutor {
@Override @Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (sender instanceof Player player) { if (!(sender instanceof Player player)) {
sender.sendMessage(getLang().getString("messages.player-only"));
return true;
}
if (!player.hasPermission(permission)) { if (!player.hasPermission(permission)) {
String message = getLang().getString("messages.no-permission", String message = getLang().getString("messages.no-permission",
java.util.Map.of("permission", permission)); java.util.Map.of("permission", permission));
player.sendMessage(message); player.sendMessage(message);
return true; return true;
} }
return execute(player, args); return execute(player, args);
} else {
return executeConsole(sender, args);
}
} }
protected abstract boolean execute(Player player, String[] args); protected abstract boolean execute(Player player, String[] args);
protected boolean executeConsole(CommandSender sender, String[] args) {
sender.sendMessage(getLang().getString("messages.player-only"));
return true;
}
} }

View File

@@ -1,10 +1,11 @@
package cn.infstar.essentialsC.commands; package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC;
import cn.infstar.essentialsC.listeners.InventoryTitleListener;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
* 末影箱命令 - 参考 EssentialsX 实现 * 末影箱命令 - 使用 ProtocolLib 实现自定义标题
* 直接打开玩家的末影箱,确保数据安全
*/ */
public class EnderChestCommand extends BaseCommand { public class EnderChestCommand extends BaseCommand {
@@ -14,9 +15,15 @@ public class EnderChestCommand extends BaseCommand {
@Override @Override
protected boolean execute(Player player, String[] args) { protected boolean execute(Player player, String[] args) {
// 直接打开玩家的末影箱EssentialsX 方式) InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener();
// 优点100% 安全,不会吞物品或刷物品
// 缺点:标题显示为 "Ender Chest"(由客户端语言决定) // 如果 ProtocolLib 可用,设置自定义标题
if (titleListener != null) {
String title = "&5随身末影箱";
titleListener.markForTitleChange(player, title);
}
// 打开末影箱
player.openInventory(player.getEnderChest()); player.openInventory(player.getEnderChest());
return true; return true;
} }

View File

@@ -36,7 +36,6 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
COMMAND_CACHE.put("feed", new FeedCommand()); COMMAND_CACHE.put("feed", new FeedCommand());
COMMAND_CACHE.put("repair", new RepairCommand()); COMMAND_CACHE.put("repair", new RepairCommand());
COMMAND_CACHE.put("blocks", new BlocksMenuCommand()); COMMAND_CACHE.put("blocks", new BlocksMenuCommand());
COMMAND_CACHE.put("mobdrops", new MobDropCommand());
} }
public HelpCommand() { public HelpCommand() {
@@ -45,37 +44,18 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
@Override @Override
protected boolean execute(@NotNull Player player, String[] args) { protected boolean execute(@NotNull Player player, String[] args) {
return handleCommand(player, player, args);
}
@Override
protected boolean executeConsole(org.bukkit.command.CommandSender sender, String[] args) {
if (args.length > 0 && args[0].equalsIgnoreCase("reload")) {
if (!sender.hasPermission("essentialsc.command.reload")) {
sender.sendMessage(getLang().getString("messages.no-permission"));
return true;
}
plugin.reloadConfig();
EssentialsC.getLangManager().reload();
sender.sendMessage(getLang().getString("prefix") + "§a配置已重载");
return true;
}
sender.sendMessage(getLang().getString("messages.player-only"));
return true;
}
private boolean handleCommand(CommandSender sender, Player player, String[] args) {
if (args.length > 0) { if (args.length > 0) {
String subCommand = args[0].toLowerCase(); String subCommand = args[0].toLowerCase();
// 管理相关
if (subCommand.equals("reload")) { if (subCommand.equals("reload")) {
if (!sender.hasPermission("essentialsc.command.reload")) { if (!player.hasPermission("essentialsc.command.reload")) {
sender.sendMessage(getLang().getString("messages.no-permission")); player.sendMessage(getLang().getString("messages.no-permission"));
return true; return true;
} }
plugin.reloadConfig(); plugin.reloadConfig();
EssentialsC.getLangManager().reload(); EssentialsC.getLangManager().reload();
sender.sendMessage(getLang().getString("prefix") + "§a配置已重载"); player.sendMessage("§a配置已重载");
return true; return true;
} }
// 功能方块和其他命令 - 使用别名映射 // 功能方块和其他命令 - 使用别名映射
@@ -90,7 +70,7 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
// seen 需要特殊处理参数 // seen 需要特殊处理参数
if (actualCommand.equals("seen")) { if (actualCommand.equals("seen")) {
if (args.length < 2) { if (args.length < 2) {
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.seen-usage-console")); player.sendMessage("§c用法: /essc seen <玩家名>");
return true; return true;
} }
COMMAND_CACHE.get("seen").execute(player, new String[]{args[1]}); COMMAND_CACHE.get("seen").execute(player, new String[]{args[1]});
@@ -99,13 +79,13 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
} }
return true; return true;
} else if (subCommand.equals("version") || subCommand.equals("v")) { } else if (subCommand.equals("version") || subCommand.equals("v")) {
player.sendMessage(getLang().getString("prefix") + "§6EssentialsC §fv" + plugin.getDescription().getVersion()); player.sendMessage("§6EssentialsC §fv" + plugin.getDescription().getVersion());
player.sendMessage(getLang().getString("prefix") + "§7运行在 Paper " + Bukkit.getVersion()); player.sendMessage("§7运行在 Paper " + Bukkit.getVersion());
return true; return true;
} else { } else {
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.unknown-subcommand", // 未知子命令
java.util.Map.of("command", subCommand))); player.sendMessage("§c未知子命令: " + subCommand);
player.sendMessage(getLang().getString("prefix") + getLang().getString("messages.help-usage")); player.sendMessage("§7使用 §f/essc help §7查看所有可用命令");
return true; return true;
} }
} }
@@ -264,7 +244,6 @@ public class HelpCommand extends BaseCommand implements TabCompleter {
{"feed", "essentialsc.command.feed"}, {"feed", "essentialsc.command.feed"},
{"repair", "essentialsc.command.repair"}, {"repair", "essentialsc.command.repair"},
{"rep", "essentialsc.command.repair"}, {"rep", "essentialsc.command.repair"},
{"mobdrops", "essentialsc.mobdrops.enderman"},
{"version", null}, {"version", null},
{"help", null} {"help", null}
}; };

View File

@@ -1,67 +0,0 @@
package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
/**
* 生物掉落物控制命令
* /mobdrops - 打开控制菜单
*/
public class MobDropCommand extends BaseCommand {
public MobDropCommand() {
super("essentialsc.mobdrops.enderman");
}
@Override
protected boolean execute(Player player, String[] args) {
openMobDropMenu(player);
return true;
}
/**
* 打开生物掉落控制菜单
*/
private void openMobDropMenu(Player player) {
// 读取当前配置
boolean endermanEnabled = plugin.getConfig().getBoolean("mob-drops.enderman.enabled", true);
// 创建菜单
Inventory menu = Bukkit.createInventory(null, 27, "§6§l生物掉落控制");
// 末影人控制项
ItemStack endermanItem = new ItemStack(Material.ENDER_PEARL);
ItemMeta endermanMeta = endermanItem.getItemMeta();
endermanMeta.setDisplayName("§d末影人掉落");
endermanMeta.setLore(Arrays.asList(
"§7当前状态: " + (endermanEnabled ? "§a✅ 开启" : "§c❌ 关闭"),
"",
"§e点击切换状态"
));
endermanItem.setItemMeta(endermanMeta);
// 放置在中间
menu.setItem(13, endermanItem);
// 装饰物品
ItemStack glass = new ItemStack(Material.BLACK_STAINED_GLASS_PANE);
ItemMeta glassMeta = glass.getItemMeta();
glassMeta.setDisplayName(" ");
glass.setItemMeta(glassMeta);
for (int i = 0; i < 27; i++) {
if (menu.getItem(i) == null) {
menu.setItem(i, glass);
}
}
player.openInventory(menu);
}
}

View File

@@ -0,0 +1,77 @@
package cn.infstar.essentialsC.listeners;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
* 使用 ProtocolLib 修改 Inventory 标题
* 通过拦截 OPEN_WINDOW 数据包实现自定义标题
*/
public class InventoryTitleListener extends PacketAdapter {
// 存储需要修改标题的玩家和对应的新标题
private final Map<UUID, String> pendingTitleChanges = new HashMap<>();
public InventoryTitleListener(Plugin plugin) {
super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.OPEN_WINDOW);
}
/**
* 标记玩家需要修改下一个打开的 inventory 标题
* @param player 玩家
* @param title 新标题(支持颜色代码)
*/
public void markForTitleChange(Player player, String title) {
pendingTitleChanges.put(player.getUniqueId(), title);
}
@Override
public void onPacketSending(PacketEvent event) {
Player player = event.getPlayer();
UUID playerId = player.getUniqueId();
// 检查该玩家是否有待处理的标题修改
String newTitle = pendingTitleChanges.remove(playerId);
if (newTitle == null) {
return;
}
try {
PacketContainer packet = event.getPacket();
// Paper 1.21+ 使用 WrappedChatComponent 作为标题
// 将颜色代码 & 转换为 §
String formattedTitle = newTitle.replace('&', '§');
// 创建聊天组件
WrappedChatComponent titleComponent = WrappedChatComponent.fromText(formattedTitle);
// 修改数据包中的标题字段
// 在 1.21+ 中标题是第二个字段索引1
packet.getChatComponents().write(0, titleComponent);
} catch (Exception e) {
// 如果修改失败,记录错误但不影响正常流程
Bukkit.getLogger().warning("[EssentialsC] 修改 inventory 标题失败: " + e.getMessage());
}
}
/**
* 清理所有待处理的标题修改(防止内存泄漏)
*/
public void cleanup() {
pendingTitleChanges.clear();
}
}

View File

@@ -1,391 +0,0 @@
package cn.infstar.essentialsC.listeners;
import cn.infstar.essentialsC.EssentialsC;
import io.netty.buffer.Unpooled;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket;
import net.minecraft.network.protocol.common.custom.DiscardedPayload;
import net.minecraft.resources.Identifier;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.crafting.RecipeHolder;
import net.minecraft.world.item.crafting.RecipeMap;
import net.minecraft.world.item.crafting.RecipeSerializer;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* JEI 配方同步监听器
* 解决 Minecraft 1.21.2+ 配方不同步问题
* 支持 Fabric 和 NeoForge 客户端
*/
public class JeiRecipeSyncListener implements Listener {
private final EssentialsC plugin;
private final boolean enabled;
private final boolean debug;
private final boolean sendPlayerMessage;
public JeiRecipeSyncListener(EssentialsC plugin) {
this.plugin = plugin;
FileConfiguration config = plugin.getConfig();
this.enabled = config.getBoolean("jei-sync.enabled", true);
this.debug = config.getBoolean("jei-sync.debug", false);
this.sendPlayerMessage = config.getBoolean("jei-sync.send-player-message", true);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
if (!enabled) {
return;
}
Player player = event.getPlayer();
String clientBrand = player.getClientBrandName();
if (debug) {
plugin.getLogger().info("========================================");
plugin.getLogger().info("玩家 " + player.getName() + " 加入");
plugin.getLogger().info("客户端品牌: '" + (clientBrand != null ? clientBrand : "null") + "'");
plugin.getLogger().info("JEI 同步功能: " + (enabled ? "启用" : "禁用"));
plugin.getLogger().info("========================================");
}
if (clientBrand == null || clientBrand.isEmpty()) {
if (debug) {
plugin.getLogger().info("跳过 " + player.getName() + ":客户端品牌为空");
}
return;
}
// 统一转换为小写进行比较,支持更多变体
String brandLower = clientBrand.toLowerCase();
if (brandLower.contains("fabric")) {
if (debug) {
plugin.getLogger().info("检测到 Fabric 客户端,开始发送配方同步...");
}
sendPlayerMessage(player, "Fabric");
sendFabricRecipeSync(player);
} else if (brandLower.contains("neoforge") || brandLower.contains("forge")) {
if (debug) {
plugin.getLogger().info("检测到 NeoForge/Forge 客户端,开始发送配方同步...");
}
sendPlayerMessage(player, "NeoForge");
sendNeoForgeRecipeSync(player);
} else {
if (debug) {
plugin.getLogger().info("跳过 " + player.getName() + ":不支持的客户端类型 '" + clientBrand + "'");
}
}
}
/**
* 发送提示消息给玩家
*/
private void sendPlayerMessage(Player player, String clientType) {
if (!sendPlayerMessage) {
return;
}
String messageKey;
if (clientType.equalsIgnoreCase("fabric")) {
messageKey = "messages.jei-sync-fabric";
} else if (clientType.equalsIgnoreCase("neoforge")) {
messageKey = "messages.jei-sync-neoforge";
} else {
return;
}
// 使用统一前缀 + 消息内容
String prefix = EssentialsC.getLangManager().getString("prefix");
String message = EssentialsC.getLangManager().getString(messageKey);
String fullMessage = prefix + " " + message;
net.kyori.adventure.text.Component component = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(fullMessage);
player.sendMessage(component);
}
/**
* 发送 Fabric 格式的配方同步数据包
*/
@SuppressWarnings({"unchecked", "deprecation"})
private void sendFabricRecipeSync(Player player) {
try {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
MinecraftServer server = serverPlayer.level().getServer();
if (server == null) {
if (debug) plugin.getLogger().warning("服务器实例为 null");
return;
}
RecipeMap recipeMap = server.getRecipeManager().recipes;
if (debug) {
plugin.getLogger().info("开始构建 Fabric 配方数据");
}
// 创建 Fabric Payload与参考插件完全一致
var list = new ArrayList<FabricRecipeEntry>();
var seen = new HashSet<RecipeSerializer<?>>();
for (RecipeSerializer<?> serializer : BuiltInRegistries.RECIPE_SERIALIZER) {
if (!seen.add(serializer)) continue;
List<RecipeHolder<?>> recipes = new ArrayList<>();
for (RecipeHolder<?> holder : recipeMap.values()) {
if (holder.value().getSerializer() == serializer) {
recipes.add(holder);
}
}
if (!recipes.isEmpty()) {
RecipeSerializer<?> entrySerializer = recipes.get(0).value().getSerializer();
list.add(new FabricRecipeEntry(entrySerializer, recipes));
}
}
var payload = new FabricRecipeSyncPayload(list);
if (debug) {
plugin.getLogger().info("Fabric 配方条目数: " + list.size());
}
// 构建 buffer
RegistryFriendlyByteBuf buffer = new RegistryFriendlyByteBuf(
Unpooled.buffer(),
server.registryAccess()
);
// 使用 CODEC 编码(与参考插件完全一致)
var codec = getFabricCodec();
codec.encode(buffer, payload);
// 发送数据包
byte[] bytes = new byte[buffer.writerIndex()];
buffer.getBytes(0, bytes);
Identifier id = Identifier.fromNamespaceAndPath("fabric", "recipe_sync");
DiscardedPayload discardedPayload = new DiscardedPayload(id, bytes);
serverPlayer.connection.send(new ClientboundCustomPayloadPacket(discardedPayload));
if (debug) {
plugin.getLogger().info("已发送 Fabric 配方同步 [" + id + "], 大小: " + bytes.length + " bytes");
}
} catch (Exception e) {
plugin.getLogger().warning("发送 Fabric 配方同步失败: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 获取 Fabric Codec
*/
@SuppressWarnings({"unchecked", "deprecation"})
private net.minecraft.network.codec.StreamCodec<RegistryFriendlyByteBuf, FabricRecipeSyncPayload> getFabricCodec() {
return FabricRecipeEntry.CODEC.apply(net.minecraft.network.codec.ByteBufCodecs.list())
.map(FabricRecipeSyncPayload::new, FabricRecipeSyncPayload::entries);
}
/**
* 发送 NeoForge 格式的配方同步数据包
*/
@SuppressWarnings({"unchecked", "deprecation"})
private void sendNeoForgeRecipeSync(Player player) {
try {
ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle();
MinecraftServer server = serverPlayer.level().getServer();
if (server == null) {
if (debug) plugin.getLogger().warning("服务器实例为 null");
return;
}
RecipeMap recipeMap = server.getRecipeManager().recipes;
if (debug) {
plugin.getLogger().info("开始构建 NeoForge 配方数据");
}
// 获取所有配方类型
java.util.List<net.minecraft.world.item.crafting.RecipeType<?>> allRecipeTypes =
BuiltInRegistries.RECIPE_TYPE.stream().toList();
if (debug) {
plugin.getLogger().info("NeoForge 配方类型数: " + allRecipeTypes.size());
}
// 创建 NeoForge Payload与参考插件完全一致
var payload = createNeoForgePayload(allRecipeTypes, recipeMap);
// 构建 buffer
RegistryFriendlyByteBuf buffer = new RegistryFriendlyByteBuf(
Unpooled.buffer(),
server.registryAccess()
);
// 使用 STREAM_CODEC 编码(与参考插件完全一致)
var streamCodec = getNeoForgeStreamCodec();
streamCodec.encode(buffer, payload);
// 发送数据包
byte[] bytes = new byte[buffer.writerIndex()];
buffer.getBytes(0, bytes);
Identifier id = Identifier.fromNamespaceAndPath("neoforge", "recipe_content");
DiscardedPayload discardedPayload = new DiscardedPayload(id, bytes);
serverPlayer.connection.send(new ClientboundCustomPayloadPacket(discardedPayload));
// 发送 Tags 同步NeoForge 需要)
serverPlayer.connection.send(new net.minecraft.network.protocol.common.ClientboundUpdateTagsPacket(
net.minecraft.tags.TagNetworkSerialization.serializeTagsToNetwork(server.registries())
));
if (debug) {
plugin.getLogger().info("已发送 NeoForge 配方同步 [" + id + "], 大小: " + bytes.length + " bytes");
}
} catch (Exception e) {
plugin.getLogger().warning("发送 NeoForge 配方同步失败: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 创建 NeoForge 配载对象
*/
private NeoForgeRecipeSyncPayload createNeoForgePayload(
java.util.List<net.minecraft.world.item.crafting.RecipeType<?>> recipeTypes,
RecipeMap recipeMap) {
var recipeTypeSet = new java.util.HashSet<>(recipeTypes);
if (recipeTypeSet.isEmpty()) {
return new NeoForgeRecipeSyncPayload(recipeTypeSet, java.util.List.of());
} else {
var recipeSubset = recipeMap.values().stream()
.filter(h -> recipeTypeSet.contains(h.value().getType()))
.toList();
return new NeoForgeRecipeSyncPayload(recipeTypeSet, recipeSubset);
}
}
/**
* 获取 NeoForge StreamCodec
*/
@SuppressWarnings({"unchecked", "deprecation"})
private net.minecraft.network.codec.StreamCodec<RegistryFriendlyByteBuf, NeoForgeRecipeSyncPayload> getNeoForgeStreamCodec() {
return net.minecraft.network.codec.StreamCodec.composite(
net.minecraft.network.codec.ByteBufCodecs.registry(net.minecraft.core.registries.Registries.RECIPE_TYPE)
.apply(net.minecraft.network.codec.ByteBufCodecs.collection(java.util.HashSet::new)),
NeoForgeRecipeSyncPayload::recipeTypes,
RecipeHolder.STREAM_CODEC.apply(net.minecraft.network.codec.ByteBufCodecs.list()),
NeoForgeRecipeSyncPayload::recipes,
NeoForgeRecipeSyncPayload::new
);
}
/**
* Fabric 配方条目
*/
@SuppressWarnings("deprecation")
private static class FabricRecipeEntry {
final Object serializer; // 使用 Object 避免 NMS 类型不兼容
final List<RecipeHolder<?>> recipes;
FabricRecipeEntry(Object serializer, List<RecipeHolder<?>> recipes) {
this.serializer = serializer;
this.recipes = recipes;
}
static final net.minecraft.network.codec.StreamCodec<RegistryFriendlyByteBuf, FabricRecipeEntry> CODEC =
net.minecraft.network.codec.StreamCodec.ofMember(
FabricRecipeEntry::write,
FabricRecipeEntry::read
);
@SuppressWarnings("unchecked")
private static FabricRecipeEntry read(RegistryFriendlyByteBuf buf) {
Identifier recipeSerializerId = buf.readIdentifier();
RecipeSerializer<?> recipeSerializer = BuiltInRegistries.RECIPE_SERIALIZER.getValue(recipeSerializerId);
if (recipeSerializer == null) {
throw new RuntimeException("Tried syncing unsupported packet serializer '" + recipeSerializerId + "'!");
}
int count = buf.readVarInt();
var list = new ArrayList<RecipeHolder<?>>();
for (int i = 0; i < count; i++) {
net.minecraft.resources.ResourceKey<net.minecraft.world.item.crafting.Recipe<?>> id =
buf.readResourceKey(net.minecraft.core.registries.Registries.RECIPE);
// 使用反射获取 streamCodec避免 NMS 类型不兼容
try {
var streamCodecMethod = recipeSerializer.getClass().getMethod("streamCodec");
var streamCodec = streamCodecMethod.invoke(recipeSerializer);
net.minecraft.world.item.crafting.Recipe<?> recipe =
((net.minecraft.network.codec.StreamCodec<RegistryFriendlyByteBuf, net.minecraft.world.item.crafting.Recipe<?>>) streamCodec)
.decode(buf);
list.add(new RecipeHolder<>(id, recipe));
} catch (Exception e) {
throw new RuntimeException("Failed to decode recipe: " + e.getMessage(), e);
}
}
return new FabricRecipeEntry(recipeSerializer, list);
}
private void write(RegistryFriendlyByteBuf buf) {
// 使用反射获取 key避免 NMS 类型不兼容
try {
var getKeyMethod = BuiltInRegistries.RECIPE_SERIALIZER.getClass().getMethod("getKey", Object.class);
Identifier identifier = (Identifier) getKeyMethod.invoke(BuiltInRegistries.RECIPE_SERIALIZER, this.serializer);
buf.writeIdentifier(identifier);
} catch (Exception e) {
throw new RuntimeException("Failed to get serializer key: " + e.getMessage(), e);
}
buf.writeVarInt(this.recipes.size());
// 使用反射获取 streamCodec避免 NMS 类型不兼容
try {
var streamCodecMethod = this.serializer.getClass().getMethod("streamCodec");
@SuppressWarnings("unchecked")
var codec = (net.minecraft.network.codec.StreamCodec<RegistryFriendlyByteBuf, net.minecraft.world.item.crafting.Recipe<?>>)
streamCodecMethod.invoke(this.serializer);
for (RecipeHolder<?> recipe : this.recipes) {
buf.writeResourceKey(recipe.id());
codec.encode(buf, recipe.value());
}
} catch (Exception e) {
throw new RuntimeException("Failed to encode recipe: " + e.getMessage(), e);
}
}
}
/**
* Fabric 配方同步 Payload
*/
private record FabricRecipeSyncPayload(List<FabricRecipeEntry> entries) {
}
/**
* NeoForge 配方同步 Payload
*/
private record NeoForgeRecipeSyncPayload(
java.util.Set<net.minecraft.world.item.crafting.RecipeType<?>> recipeTypes,
java.util.List<RecipeHolder<?>> recipes) {
}
}

View File

@@ -1,64 +0,0 @@
package cn.infstar.essentialsC.listeners;
import cn.infstar.essentialsC.EssentialsC;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
/**
* 生物掉落物控制监听器
* 当前仅支持末影人
*/
public class MobDropListener implements Listener {
private final EssentialsC plugin;
private boolean endermanDropEnabled;
public MobDropListener(EssentialsC plugin) {
this.plugin = plugin;
loadConfig();
// 注册监听器
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* 加载配置
*/
private void loadConfig() {
FileConfiguration config = plugin.getConfig();
config.addDefault("mob-drops.enderman.enabled", true);
config.options().copyDefaults(true);
try {
config.save(plugin.getDataFolder().toPath().resolve("config.yml").toFile());
} catch (Exception e) {
plugin.getLogger().warning("无法保存配置文件: " + e.getMessage());
}
this.endermanDropEnabled = config.getBoolean("mob-drops.enderman.enabled", true);
}
@EventHandler
public void onEntityDeath(EntityDeathEvent event) {
if (event.getEntityType() != EntityType.ENDERMAN) {
return;
}
boolean enabled = plugin.getConfig().getBoolean("mob-drops.enderman.enabled", true);
if (!enabled) {
event.getDrops().clear();
}
}
/**
* 重新加载配置
*/
public void reload() {
loadConfig();
plugin.getLogger().info("生物掉落物配置已重载(末影人: " + (endermanDropEnabled ? "开启" : "关闭") + "");
}
}

View File

@@ -1,101 +0,0 @@
package cn.infstar.essentialsC.listeners;
import cn.infstar.essentialsC.EssentialsC;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
public class MobDropMenuListener implements Listener {
private final EssentialsC plugin;
public MobDropMenuListener(EssentialsC plugin) {
this.plugin = plugin;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!event.getView().getTitle().equals("§6§l生物掉落控制")) {
return;
}
event.setCancelled(true);
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
ItemStack clickedItem = event.getCurrentItem();
if (clickedItem == null) {
return;
}
if (event.getSlot() == 13) {
toggleEndermanDrops(player);
Bukkit.getScheduler().runTaskLater(plugin, () -> openMobDropMenu(player), 2L);
}
}
private void toggleEndermanDrops(Player player) {
FileConfiguration config = plugin.getConfig();
boolean currentValue = config.getBoolean("mob-drops.enderman.enabled", true);
boolean newValue = !currentValue;
config.set("mob-drops.enderman.enabled", newValue);
try {
config.save(plugin.getDataFolder().toPath().resolve("config.yml").toFile());
} catch (Exception e) {
player.sendMessage(EssentialsC.getLangManager().getString("prefix") +
EssentialsC.getLangManager().getString("messages.mobdrop-save-failed",
java.util.Map.of("error", e.getMessage())));
return;
}
String status = newValue ? "§a开启" : "§c关闭";
player.sendMessage(EssentialsC.getLangManager().getString("prefix") +
EssentialsC.getLangManager().getString("messages.mobdrop-toggled",
java.util.Map.of("status", status)));
}
private void openMobDropMenu(Player player) {
boolean endermanEnabled = plugin.getConfig().getBoolean("mob-drops.enderman.enabled", true);
Inventory menu = Bukkit.createInventory(null, 27, "§6§l生物掉落控制");
ItemStack endermanItem = new ItemStack(Material.ENDER_PEARL);
ItemMeta endermanMeta = endermanItem.getItemMeta();
endermanMeta.setDisplayName("§d末影人掉落");
endermanMeta.setLore(Arrays.asList(
"§7当前状态: " + (endermanEnabled ? "§a✅ 开启" : "§c❌ 关闭"),
"",
"§e点击切换状态"
));
endermanItem.setItemMeta(endermanMeta);
menu.setItem(13, endermanItem);
ItemStack glass = new ItemStack(Material.BLACK_STAINED_GLASS_PANE);
ItemMeta glassMeta = glass.getItemMeta();
glassMeta.setDisplayName(" ");
glass.setItemMeta(glassMeta);
for (int i = 0; i < 27; i++) {
if (menu.getItem(i) == null) {
menu.setItem(i, glass);
}
}
player.openInventory(menu);
}
}

View File

@@ -14,7 +14,6 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.BlockStateMeta;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -48,57 +47,17 @@ public class ShulkerBoxListener implements Listener {
Material.BLACK_SHULKER_BOX Material.BLACK_SHULKER_BOX
); );
/**
* 潜影盒 Inventory Holder - 用于识别自定义 inventory
*/
private static class ShulkerBoxHolder implements org.bukkit.inventory.InventoryHolder {
private final Inventory inventory;
private final ItemStack shulkerBoxItem;
private final ItemStack[] currentContents; // 实时追踪的物品内容
ShulkerBoxHolder(ItemStack shulkerBoxItem, String title) {
this.shulkerBoxItem = shulkerBoxItem;
this.inventory = Bukkit.createInventory(this, 27, title);
this.currentContents = new ItemStack[27];
}
@Override
public @NotNull Inventory getInventory() {
return this.inventory;
}
public ItemStack getShulkerBoxItem() {
return shulkerBoxItem;
}
/**
* 更新指定槽位的物品(供外部调用)
*/
public void updateSlot(int slot, ItemStack item) {
if (slot >= 0 && slot < 27) {
currentContents[slot] = item;
}
}
/**
* 获取当前追踪的所有物品内容
*/
public ItemStack[] getCurrentContents() {
return currentContents.clone();
}
}
/** /**
* 潜影盒数据记录 * 潜影盒数据记录
*/ */
private static class ShulkerBoxData { private static class ShulkerBoxData {
int slotIndex; // 玩家背包中的槽位索引
ItemStack originalSnapshot; // 打开时的物品快照(用于验证) ItemStack originalSnapshot; // 打开时的物品快照(用于验证)
ItemStack currentItem; // 当前物品引用(用于更新)
int totalItems; // 打开时的物品总数(用于防刷) int totalItems; // 打开时的物品总数(用于防刷)
ShulkerBoxData(int slot, ItemStack snapshot, int items) { ShulkerBoxData(ItemStack snapshot, ItemStack current, int items) {
this.slotIndex = slot;
this.originalSnapshot = snapshot; this.originalSnapshot = snapshot;
this.currentItem = current;
this.totalItems = items; this.totalItems = items;
} }
} }
@@ -135,18 +94,8 @@ public class ShulkerBoxListener implements Listener {
// 取消默认行为(防止放置潜影盒) // 取消默认行为(防止放置潜影盒)
event.setCancelled(true); event.setCancelled(true);
// 查找物品在玩家背包中的槽位 // 打开潜影盒
int slotIndex = -1; openShulkerBox(player, item);
for (int i = 0; i < player.getInventory().getSize(); i++) {
ItemStack invItem = player.getInventory().getItem(i);
if (invItem != null && invItem.isSimilar(item)) {
slotIndex = i;
break;
}
}
// 打开潜影盒(传入槽位索引)
openShulkerBox(player, item, slotIndex);
} }
@EventHandler @EventHandler
@@ -155,13 +104,6 @@ public class ShulkerBoxListener implements Listener {
return; return;
} }
Inventory closedInventory = event.getInventory();
// 检查是否是潜影盒 inventory
if (!(closedInventory.getHolder(false) instanceof ShulkerBoxHolder holder)) {
return;
}
UUID playerId = player.getUniqueId(); UUID playerId = player.getUniqueId();
ShulkerBoxData data = openShulkerBoxes.remove(playerId); ShulkerBoxData data = openShulkerBoxes.remove(playerId);
@@ -169,121 +111,58 @@ public class ShulkerBoxListener implements Listener {
return; return;
} }
plugin.getLogger().info("=== 潜影盒关闭(数据已在点击时实时保存) ==="); Inventory closedInventory = event.getInventory();
} ItemStack currentItem = data.currentItem;
@EventHandler // 验证物品是否还存在
public void onInventoryOpen(org.bukkit.event.inventory.InventoryOpenEvent event) { if (currentItem == null || currentItem.getType().isAir()) {
if (!(event.getPlayer() instanceof Player player)) { // 物品已不存在,丢弃 inventory 中的所有物品
for (ItemStack item : closedInventory.getContents()) {
if (item != null && !item.getType().isAir()) {
player.getWorld().dropItemNaturally(player.getLocation(), item);
}
}
return; return;
} }
Inventory openedInventory = event.getInventory(); // 更新潜影盒物品中的内容
if (openedInventory.getHolder(false) instanceof ShulkerBoxHolder) { if (currentItem.getItemMeta() instanceof BlockStateMeta blockStateMeta) {
plugin.getLogger().info("[Open] ✅ 潜影盒 inventory 已打开");
}
}
@EventHandler(priority = org.bukkit.event.EventPriority.LOWEST)
public void onInventoryClickDebug(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
Inventory clickedInventory = event.getClickedInventory();
if (clickedInventory == null) {
return;
}
if (clickedInventory.getHolder(false) instanceof ShulkerBoxHolder) {
plugin.getLogger().info("[Click-LOWEST] 检测到点击事件 | 槽位: " + event.getSlot() +
" | 物品: " + (event.getCurrentItem() != null ? event.getCurrentItem().getType() : "null"));
}
}
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
Inventory clickedInventory = event.getClickedInventory();
if (clickedInventory == null) {
return;
}
// 检查是否是潜影盒 inventory
if (!(clickedInventory.getHolder(false) instanceof ShulkerBoxHolder holder)) {
return;
}
UUID playerId = player.getUniqueId();
ShulkerBoxData data = openShulkerBoxes.get(playerId);
if (data == null) {
return;
}
// 阻止嵌套潜影盒
ItemStack clickedItem = event.getCurrentItem();
if (clickedItem != null && isShulkerBox(clickedItem)) {
event.setCancelled(true);
player.sendMessage(EssentialsC.getLangManager().getString("prefix") +
EssentialsC.getLangManager().getString("messages.shulkerbox-nested"));
return;
}
// ✅ CMILib 方式:延迟 1 tick 后立即保存到潜影盒 NBT
plugin.getServer().getScheduler().runTask(plugin, () -> {
plugin.getLogger().info("[Click] === 开始处理点击事件 ===");
// 读取当前 inventory 内容
ItemStack[] contents = clickedInventory.getContents();
// 调试
int nonEmpty = 0;
StringBuilder items = new StringBuilder();
for (int i = 0; i < contents.length; i++) {
if (contents[i] != null && !contents[i].getType().isAir()) {
nonEmpty++;
items.append(String.format("\n [%d] %s x%d", i, contents[i].getType(), contents[i].getAmount()));
}
}
plugin.getLogger().info("[Click] 非空槽位: " + nonEmpty);
plugin.getLogger().info("[Click] 物品详情:" + items);
// 获取玩家背包中的潜影盒物品
ItemStack shulkerItem = null;
if (data.slotIndex >= 0 && data.slotIndex < player.getInventory().getSize()) {
shulkerItem = player.getInventory().getItem(data.slotIndex);
plugin.getLogger().info("[Click] 槽位 " + data.slotIndex + " 物品: " +
(shulkerItem != null ? shulkerItem.getType() : "null"));
}
if (shulkerItem == null || shulkerItem.getType().isAir()) {
plugin.getLogger().warning("[Click] ❌ 潜影盒物品不存在");
return;
}
// 更新潜影盒的 BlockState
if (shulkerItem.getItemMeta() instanceof BlockStateMeta blockStateMeta) {
if (blockStateMeta.getBlockState() instanceof ShulkerBox shulkerBox) { if (blockStateMeta.getBlockState() instanceof ShulkerBox shulkerBox) {
// 设置 inventory 内容 // inventory 内容复制回潜影盒
ItemStack[] contents = closedInventory.getContents();
for (int i = 0; i < 27 && i < contents.length; i++) { for (int i = 0; i < 27 && i < contents.length; i++) {
shulkerBox.getInventory().setItem(i, contents[i]); shulkerBox.getInventory().setItem(i, contents[i]);
} }
// 更新元数据 // 更新物品元数据
blockStateMeta.setBlockState(shulkerBox); blockStateMeta.setBlockState(shulkerBox);
shulkerItem.setItemMeta(blockStateMeta); currentItem.setItemMeta(blockStateMeta);
// 写回玩家背包
player.getInventory().setItem(data.slotIndex, shulkerItem);
plugin.getLogger().info("[Click] ✅ 已实时保存 " + nonEmpty + " 个物品槽");
} else {
plugin.getLogger().warning("[Click] ❌ BlockState 不是 ShulkerBox");
} }
} else {
plugin.getLogger().warning("[Click] ❌ 没有 BlockStateMeta");
} }
}); }
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player player)) {
return;
}
// 检查是否是玩家打开的潜影盒(使用 get 避免两次查找)
if (openShulkerBoxes.get(player.getUniqueId()) == null) {
return;
}
// 获取点击的物品
ItemStack clickedItem = event.getCurrentItem();
if (clickedItem == null) {
return;
}
// 检查是否是潜影盒,如果是则阻止放置
if (isShulkerBox(clickedItem)) {
event.setCancelled(true);
player.sendMessage("§c不能在潜影盒中放入另一个潜影盒");
}
} }
@@ -298,7 +177,7 @@ public class ShulkerBoxListener implements Listener {
/** /**
* 打开潜影盒 * 打开潜影盒
*/ */
private void openShulkerBox(Player player, ItemStack shulkerBox, int slotIndex) { private void openShulkerBox(Player player, ItemStack shulkerBox) {
// 获取潜影盒的 BlockStateMeta // 获取潜影盒的 BlockStateMeta
if (!(shulkerBox.getItemMeta() instanceof BlockStateMeta blockStateMeta)) { if (!(shulkerBox.getItemMeta() instanceof BlockStateMeta blockStateMeta)) {
return; return;
@@ -329,26 +208,31 @@ public class ShulkerBoxListener implements Listener {
// 使用配置文件中的默认标题 // 使用配置文件中的默认标题
String defaultTitle = plugin.getConfig().getString("shulkerbox.default-title", ""); String defaultTitle = plugin.getConfig().getString("shulkerbox.default-title", "");
if (defaultTitle != null && !defaultTitle.isEmpty()) { if (defaultTitle != null && !defaultTitle.isEmpty()) {
// 转换颜色代码 & -> § title = defaultTitle;
title = defaultTitle.replace('&', '§');
} else { } else {
// 如果配置为空,使用 "Shulker Box"(客户端会自动翻译) title = "&e潜影盒";
title = "Shulker Box";
} }
} }
// 创建 ShulkerBoxHolder会自动创建 inventory // 如果 ProtocolLib 可用,标记需要修改标题
ShulkerBoxHolder holder = new ShulkerBoxHolder(shulkerBox, title); InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener();
Inventory inventory = holder.getInventory(); if (titleListener != null) {
titleListener.markForTitleChange(player, title);
}
// 复制潜影盒的内容到 inventory // 创建一个新的 inventory(基于潜影盒的内容)
// 注意:如果使用 ProtocolLib标题会被拦截修改这里用临时标题
String inventoryTitle = titleListener != null ? "Opening..." : title.replace('&', '§');
Inventory inventory = Bukkit.createInventory(null, 27, inventoryTitle);
// 复制潜影盒的内容到新 inventory
ItemStack[] contents = shulkerBoxBlock.getInventory().getContents(); ItemStack[] contents = shulkerBoxBlock.getInventory().getContents();
for (int i = 0; i < 27 && i < contents.length; i++) { for (int i = 0; i < 27 && i < contents.length; i++) {
inventory.setItem(i, contents[i]); inventory.setItem(i, contents[i]);
} }
// 记录玩家打开的潜影盒(保存槽位索引和快照 // 记录玩家打开的潜影盒(包含快照和当前引用
openShulkerBoxes.put(player.getUniqueId(), new ShulkerBoxData(slotIndex, snapshot, totalItems)); openShulkerBoxes.put(player.getUniqueId(), new ShulkerBoxData(snapshot, shulkerBox, totalItems));
// 打开 inventory // 打开 inventory
player.openInventory(inventory); player.openInventory(inventory);

View File

@@ -85,20 +85,3 @@ shulkerbox:
# 支持颜色代码(使用 & 符号) # 支持颜色代码(使用 & 符号)
# 留空则使用 "Shulker Box"(客户端语言) # 留空则使用 "Shulker Box"(客户端语言)
default-title: "&e潜影盒" default-title: "&e潜影盒"
# JEI/REI 配方同步设置MC 1.21.2+
# 解决 Fabric/NeoForge 客户端配方不同步问题
jei-sync:
# 是否启用 JEI 配方同步功能
enabled: true
# 是否在控制台显示同步日志
debug: true
# 是否向玩家发送同步提示消息
send-player-message: true
# 生物掉落物控制
mob-drops:
# 末影人掉落物控制
enderman:
# 是否允许末影人死亡后掉落物品和经验
enabled: true

View File

@@ -2,7 +2,7 @@
# 中文语言文件 # 中文语言文件
# 插件前缀 # 插件前缀
prefix: "&7[&6EssentialsC&7]&f:" prefix: "&6[EssentialsC] &r"
# 命令消息 # 命令消息
messages: messages:
@@ -33,14 +33,6 @@ messages:
no-permission-repair-all: "&c你没有权限修复所有物品" no-permission-repair-all: "&c你没有权限修复所有物品"
player-not-found: "&c未找到玩家: {player}" player-not-found: "&c未找到玩家: {player}"
no-permission-others: "&c你没有权限治疗其他玩家" no-permission-others: "&c你没有权限治疗其他玩家"
seen-usage-console: "&c用法: /seen <玩家名>"
unknown-subcommand: "&c未知子命令: {command}"
help-usage: "&7使用 §f/essc help &7查看所有可用命令"
mobdrop-save-failed: "&c保存配置失败: {error}"
mobdrop-toggled: "&a末影人掉落已{status}"
shulkerbox-nested: "&c不能在潜影盒中放入另一个潜影盒"
jei-sync-fabric: "&6JEI-FIX&8(&bFabric&8):&e正在同步合成配方..."
jei-sync-neoforge: "&6JEI-FIX&8(&bNeoForge&8):&e正在同步合成配方..."
# 帮助命令 # 帮助命令
help: help:

View File

@@ -1,11 +1,18 @@
name: EssentialsC name: EssentialsC
description: 精简版基础插件 description: 精简版基础插件
version: ${version} version: '${version}'
main: cn.infstar.essentialsC.EssentialsC main: cn.infstar.essentialsC.EssentialsC
api-version: '1.21' api-version: '1.21'
load: POSTWORLD load: POSTWORLD
folia-supported: true
# ProtocolLib 依赖(可选)
dependencies:
server:
ProtocolLib:
load: BEFORE
required: false
join-classpath: true
authors: [ Coldsmiles_7 ] authors: [ Coldsmiles_7 ]
website: www.infstar.cn website: www.infstar.cn
@@ -74,9 +81,6 @@ permissions:
essentialsc.shulkerbox.open: essentialsc.shulkerbox.open:
description: Allows right-click to open shulker boxes without placing them description: Allows right-click to open shulker boxes without placing them
default: op default: op
essentialsc.mobdrops.enderman:
description: Allows control of enderman drops
default: op
essentialsc.*: essentialsc.*:
description: All EssentialsC permissions description: All EssentialsC permissions
default: false default: false
@@ -101,4 +105,3 @@ permissions:
essentialsc.command.repair: true essentialsc.command.repair: true
essentialsc.command.help: true essentialsc.command.help: true
essentialsc.shulkerbox.open: true essentialsc.shulkerbox.open: true
essentialsc.mobdrops.enderman: true