本帖最后由 秋风残叶 于 2023-6-13 20:49 编辑
你根本不会用CMI!
从基础到进阶,用开服实例手把手教你用!
本教程作为CMI搬运贴和Wiki的延伸教程。
CMI是一款多功能的服务端基础插件,如果您还没有听说过CMI请参阅这个
站内搬运贴
。
本人是CMI的搬运者,自本插件搬运贴在MCBBS站内发布以来,本人收到无数用户抱怨插件配置复杂,用户们面对高达2000余行繁杂的配置config总是无所适从(哪怕有汉化),很多用户花费15欧(约合RMB一百多块)购买了这款插件,却只发掘了插件30%-40%的功能,CMI无数闪光的功能因为用户“不会用”“懒得用”而惨遭埋没。
因此,在这一篇帖子中,我会以“从零开始开一个生存服”为实例来告诉大家,我是如何配置CMI的,我是如何使用CMI提供的各项功能的,我又如何通过不同的功能组合出新玩法的。
请注意:
-
本帖的目的不是教萌新如何开服
——若有此需求,可至
联机教程
版块寻找其他开服教程,对于本帖来说,阅读前我默认你已经拥有了一定的服务器运营能力,诸如Java安装、服务端基础配置、内网映射等内容不会在教程中涉及。
-
本帖的目的不是介绍CMI是什么
——若有此需求,应去阅读CMI的
原帖
和
站内搬运贴
。
-
本帖的目的不是流水账式列出所有CMI相关的指令、权限等
——若有此需求,应去阅读CMI的
Wiki
本帖的目的是:
在逼真的开服场景中,运用一个个生动的例子介绍CMI的各种特性,分特性教你如何配置CMI config,让你重拾那些被你弃用的、被埋没的插件功能,并发掘出新的功能,同时也适合第一次接触CMI的新用户快速上手。
另外须知:
-
本教程主观性很强。
-
本教程中介绍的“PCD服务器”仅供教学示例,现实中并不存在此服务器,非违规宣传,请勿对号入座。
-
本教程并不会涵盖CMI的全部功能,若想了解CMI的全部功能,您可以阅读CMI的原帖、搬运贴或者Wiki
-
一千种服务器有一千种玩法,本教程部分内容也许并不适合所有服务器,请把此教程作为参考读物阅读,不要照搬照抄。
-
本贴中提到的“CMI和xx插件功能相似”指CMI和该插件的某功能实现方法相似,绝非对比两个插件孰优孰劣,更无贬低该插件之意。
教程征集请求:
关于插件的新玩法,我一人的创意迟早也会枯竭的,如果您有利用CMI自带机制组合出新玩法的创意还请不吝赐教,我将在教程中署上您的名字,希望大家可以集思广益。
重要提示:
官方Wiki下
毒注意:
接到用户反馈:从
CMI官方Wiki
里复制的部分配置文件写法,放进服务器中后在罕见情况下会出现配置不加载、报错等问题,尤其是特殊指令写法部分,经过笔者调查,CMI官方Wiki中部分内容存在乱用特殊Unicode符号问题,不知是作者故意的还是不小心,以下是已发现的一些“毒”:
-
短划线 -:
正确的Unicode编码U+002D
官方Wiki错误的Unicode编码U+2013
-
空格:
正确的Unicode编码U+0020
官方Wiki错误的Unicode编码U+00A0
以下是一些处理建议:
-
观察控制台报错内容,报错内容通常会显示出错误字符的位置;
-
使用您的键盘打出特殊符号,而非直接从官方Wiki中复制特殊符号。
|
汉化做多了,写中文教程都充斥着一股翻译腔……草
|
|
|
现在我已经准备好了我的服务端和开服用的地图等等,我准备开一个大家都可以来玩的普通的生存服,就给他取个名字叫“PCD服务器”吧。
我需要准备本次开服可能要用到的服务端和插件,我准备了下面几种:
-
一款支持的服务端
[注1]
-
CMI
(本教程主角)
-
CMILib
(CMI的前置)
-
CMI Injector
(经济前置)
-
Vault
(经济前置)
-
PlaceholderAPI
(变量插件)
-
Multiverse-Core
(多世界管理)
-
一款登录插件
[注2]
-
一款权限插件
[注3]
-
一款区域保护插件
[注4]
-
一款GUI菜单插件
[注5]
注1:CMI官宣支持的服务端为Bukkit/Spigot/Paper
注2:由于CMI没有提供玩家登录功能,因此您可以自行选择一款您熟悉的登录插件(例如Authme-Reloaded等等)
注3:“哪款权限插件最好?”这个问题历来是MCBBS的导火索话题,因此本人不做强调,您可以自行选择您熟悉的权限插件(例如LuckPerms/GroupManagerX/PermissionsEX等)
注4:由于CMI没有提供区域保护功能,因此您可以自行选择一款您熟悉的区域保护插件(例如Residence/Worldguard/GriefPrevention等)
注5:由于CMI没有提供自定义GUI菜单功能,因此您可以自行选择一款您熟悉的菜单插件(例如ChestCommands/DeluxeMenu/TrMenu等)
可能我还会准备其他的玩法插件,但本教程主要用于介绍CMI,所以其它的插件暂略。
CMI插件自带汉化,不过也推荐使用秋风残叶提供的
CMI汉化包
(包括前置CMILib的汉化)唯需注意CMI配置文件里的所有注释都将在重载之后消失,所以推荐您使用汉化config之前备份一份,或者放在一旁作为翻译参考。
若之前使用的基础插件是Essentials而现在要更换至CMI,只需确保服务端的plugins/Essentials文件夹还在,并在游戏中输入以下指令,来把来自Ess的家/地标/玩家昵称/玩家下线地点/玩家金钱/邮件数据等等导入CMI。
-
/cmi importfrom essentials <home/warp/nick/logoutlocation/money/mail>
复制代码
|
|
|
玩家登录
不涉及CMI功能
CMI并不自带玩家登录功能,因此您需要自己选择一款登录插件,推荐您使用Authme-Reloaded来执行玩家登录任务,当然,使用外置登录或者正版登录亦可,这里不重点展开讲。
当然,如果您使用的是正版登录,您可以在CMI/config.yml中把下列设置项打开,避免登录大小写bug。(如果您使用第三方登录插件如Authme,一般这些问题都不用担心)
-
# 如果设置为 true 大小写不同的两个玩家,第二个玩家将被拒绝进服
-
# 比如第一天玩家 AndyYu168 进了服,第二天玩家 aNdYyu168 尝试进服时会被拒绝
-
# 建议设置为 true 来避免大小写bug
-
PreventDifferentCapitalizationNames: true
复制代码
|
第一次进服
涉及CMI功能:首次进服位置,首次进服提示语,新人kit礼包
当你的新玩家第一次来到你的服务器,他将会出现在特定的地点(即首次进服位置),看到特殊的欢迎语,同时背包里将会出现预设好的新人礼包。
★设置新人首次进服位置
请在CMI/config.yml中找到如下设置项并设置服务器主城和新玩家首次进服的位置,其中服务器主城也可在游戏内使用指令/cmi setspawn来设置:
-
Spawn:
-
# 强制玩家进服时出现在出生点
-
SpawnOnJoin: false
-
# 服务器主城, 也可使用指令 /cmi spawn 到达
-
Main:
-
World: None
-
X: 0.0
-
Y: 0.0
-
Z: 0.0
-
Pitch: 0.0
-
Yaw: 0.0
-
RespawnLocation: false
-
Rng: 0
-
# 玩家第一次进服的生成点
-
FirstSpawn:
-
Use: true
-
World: None
-
X: 0.0
-
Y: 0.0
-
Z: 0.0
-
Pitch: 0.0
-
Yaw: 0.0
复制代码
★设置新人首次进服提示语
请在CMI/config.yml中找到如下设置项并设置为true (默认为false)
-
# 第一次进服显示消息
-
# 可用变量: [playername], [totalUsers], [onlinePlayers]
-
FirstJoinMessage:
-
Use: true
复制代码
随后在语言文件CMI/Translations/Locale_CN.yml中设置专为新人准备的提示语:
-
FirstJoin: '&e欢迎 &6[playerDisplayName] &e来到本服务器'
复制代码
★设置新人kit礼包
CMI的kit礼包可以在游戏内编辑,请将你决定要送给新人的物品放在自己的背包内并输入/cmi kiteditor指令,根据提示新建一个礼包。
你可以将礼包物品放入此GUI,此外也可将四件套盔甲和盾牌放在玩家盔甲栏和副手栏。
设置好之后,请在CMI/config.yml中,找到如下设置项并设置为你刚刚设置的礼包名称,新人玩家第一次进服即可获得该礼包。
此外,你还可以随时使用指令/cmi kit <礼包名> 直接获得该礼包。
-
Newbie:
-
# 新玩家进服时获得的礼包
-
Kit: Newbie
复制代码
|
新玩家的手持钟表菜单
涉及CMI功能:物品绑定指令,物品编辑,kit礼包
需搭配第三方GUI菜单插件
“钟表菜单”或者“指南针菜单”这一经典功能实在是深入人心,几乎是国内服务器标配,玩家进服时背包里即出现一枚钟表,手持点击即可呼出服务器GUI菜单。
“钟表菜单”这一功能大部分第三方GUI菜单插件是自带的,虽然CMI没有自定义菜单功能,但其实这枚呼出菜单的钟表对新玩家的发放可以由CMI来完成。
CMI自带了物品编辑功能,可以通过指令对玩家手持的物品进行编辑(名称、lore等等)通过物品编辑,可以在游戏内制作一枚漂亮的服务器菜单专用钟表。
可通过以下指令,对手持物品进行编辑:
-
/cmi itemname <物品名称>
编辑手持物品名称
-
/cmi itemlore <行数> <lore内容>
编辑手持物品lore
-
/cmi hideflags
隐藏物品的NBT标签,例如附魔、染色、损坏值等等
尝试手持这个钟表点击一下——当然还是什么反应都没有,此时需要使用CMI的attachcommand指令给此物品附加上指令。
-
/cmi attachcommand <打开服务器菜单的指令不加斜杠>
再尝试点击一次,此时即可成功呼出服务器菜单GUI,按照我们之前教学的新人kit礼包制作方法,使用
/cmi kiteditor
指令打开礼包编辑,并把这个做好的“服务器菜单”放进去,新玩家进服时会自动获得该礼包,其中就包含这个能点开“服务器菜单”的钟表。
你也可以手持该钟表使用以下指令进行物品保存,被保存的物品将会存储在CMI/SavedItems.yml中,可以在该文件中对物品的附魔、染色、损坏值等等通过修改ItemMeta进行进一步设置。
-
/cmi saveditems <save/get/remove/list> <保存物品名>
保存/获得/移除/列出保存物品列表中某物品
|
世界与重生
涉及CMI功能:重生处理
每个服务器都有“主城”作为玩家世界重生点,若玩家在该世界死亡,将会在此处重生。
使用指令
/cmi setspawn
将你所站的位置设置为世界重生点(主城)
相关的设置在CMI/config.yml的ReSpawn相关设置项中:请注意,在默认的配置文件中,重生锚(anchor)的重生优先度最高,如果你想让玩家无论怎样死后都要回到世界重生点,请把spawn设置为最优先。
-
ReSpawn:
-
# 玩家重生后有多少秒时间是无敌的
-
# 这个设置可以防止玩家刚重生就又被砍死
-
# 设置为 0 可关闭此设置
-
Immortality: 3
-
# 如果你想让第三方插件处理玩家重生,请设置此项为false并重载插件
-
Enabled: true
-
Global:
-
# 世界重生优先顺序(仅适用于不在Specific列表里的世界)
-
# 可重生的地点: 重生锚anchor, 主城spawn, 床的位置bedLocation, 家的位置homeLocation, 世界重生点worldSpawn, warp![地标名]
-
# 主城spawn可以使用/cmi setspawn设置位置
-
# warp![warName] 可设置为可传送的地标, 使用此法传送至地标无视权限限制
-
PriorityOrder:
-
- anchor
-
- spawn
-
- bedLocation
-
- homeLocation
-
- worldSpawn
-
# 给特定世界设置重生点
-
# 如果你想使用第三方插件(如Multiverse-core)处理重生,请把world: 及下面的内容全都删掉
-
Specific:
-
world:
-
- anchor
-
- spawn
-
- bedLocation
-
- homeLocation
-
- worldSpawn
-
world_nether:
-
- anchor
-
- bedLocation
-
- spawn
-
- homeLocation
-
- worldSpawn
-
world_the_end:
-
- anchor
-
- bedLocation
-
- spawn
-
- homeLocation
-
- worldSpawn
复制代码
另外,如果玩家有权限
cmi.autorespawn
则可以跳过死亡界面直接重生。
如果你想使用第三方插件(例如Multiverse-Core)处理重生,请将CMI/config.yml中的Enabled: 设置为false,并使用第三方插件的指令如/mv setspawn 来设置重生点。
|
CMI指令简写
涉及CMI功能:指令简写
根据无数CMI用户反馈,大部分用户对CMI相关指令前必须加个/cmi深恶痛绝,不仅操作冗余,且对已经熟悉Essentials指令的玩家也不友好。
可以使用CMI自带的指令简写功能,抹去指令前的/cmi,例如/cmi back可以简写成/back。
插件本身提供了一些常用的简写设置,请打开CMI/Alias.yml配置文件,将你需要简写的指令的Enabled设置为true。
-
Alias:
-
#
-
# /cmi actionbarmsg $1-
-
/actionbarmsg:
-
Enabled: true
-
Tab: true
复制代码
之后,你也可以在CMI/config.yml中找到如下设置项并设置为true,来让指令帮助里也显示为简写后的指令。
-
# 设置为 true, 指令帮助里以/cmi开头的指令都会以简写展示,比如 /cmi back 会显示为 /back
-
# 请注意:该功能只和展示指令有关,至于简写的指令能不能用,必须另行设置!
-
RemoveLabel: true
复制代码
CMI的指令简写功能远远没有这么简单,您可翻到下文中的
《大佬牛逼!指令简写还能这么用!》
篇查看进阶教程,也可至
这里
查看关于自定义指令简写的Wiki。
|
聊天
涉及CMI功能:聊天格式设置
CMI可以让玩家的聊天格式中新增各种变量,例如所在世界、所属公会等等,也可以设置鼠标悬停在上方时出现的提示框内容,其中都可以添加PlaceholderAPI变量。
聊天格式的设置在CMI/Settings/Chat.yml的以下位置,请先把下面这两项的开关打开:
(如果您使用的CMI是9.5.0.0以前的版本,则该设置项在config.yml中)
-
Chat:
-
# 按照本插件的格式显示聊天内容
-
ModifyChatFormat: true
-
# 设置为 true, 公共聊天和私聊消息当把鼠标放在上面时将会显示悬停消息(PlaceholderAPI变量支持)可点击快速回复
-
ClickHoverMessages: true
复制代码
之后你就可以在如下设置项设置玩家聊天格式,可以设置PlaceholderAPI变量,也可以把玩家的聊天内容设置为彩虹色(MC1.16+)
-
# 聊天格式,可用变量: {prefix} {suffix} {group}. 支持 PlaceHolderAPI 变量,例如 %player_server%
-
GeneralFormat: '{prefix}&f{displayName}&7: &r{message}'
-
# 这是消息“本身”的设置, 你可以给它添加彩色代码等
-
# 请注意务必包含聊天内容变量本身 {message} ,否则这个设置将毫无意义
-
# 对于1.16+服务器可以使用更为丰富的彩色代码,比如 '{#b3a28f>}{message}{#d7b8e6<}'
-
# 你可以在聊天中显示两种渐变色,并把聊天内容分成两段显示,例如 '{#b3a28f>}{message}{#5c6999<>}{message}{#d7b8e6<}'
-
GeneralMessageFormat: '{message}'
复制代码
关于鼠标悬停内容,可以在CMI/Translations/Locale_CN.yml语言文件中进行设置,比如下面这种:
-
publicHover: '&e发送时间: &6%server_time_hh:mm:ss% \n&e玩家等级:&f%player_level% \n&e玩家金钱:&f%cmi_user_balance%
-
\n&e玩家权限组:&f%cmi_user_group%'
复制代码
|
经济
涉及CMI功能:经济、玩家交易
在服务器里,玩家需要用钱来购买物品、出售物品,玩家也可以用钱来互相交易。
首先确保自己已经安装经济前置Vault和CMIInjector,并在config中找到如下经济启用开关,将其开启:
-
Economy:
-
# 启用 CMI 经济系统
-
# 如果检测到安装了前置 CMIInjector 那么这个设置项将会自动开启
-
# 如果没有自动开启请手动开启
-
Enabled: true
复制代码
如果你开的服务器是老服且之前使用的经济系统来源于Essentials,可使用指令/cmi importfrom essentials money 来把玩家老的金钱数据导入CMI
可以对照着如下配置注释对服务器里的“金钱”进行进一步设置,包括玩家的初始金钱设置、金钱符号等。
-
Global:
-
# 玩家初始金钱
-
StartingAmount: 100.0
-
# 玩家拥有最小金钱,如果需要的话可以设置为负数
-
MinimalAmount: 0.0
-
# 玩家拥有的最多金钱,设置为-1可取消限制
-
MaximumAmount: 1.0E8
-
# 玩家单次进行金钱交易的最小金额变动
-
# 此机制可以防止一些熊孩子多次发送超小额金钱来刷屏
-
MinimalPay: 0.5
-
# 是否允许玩家使用分数来表示交易金额
-
# 若关闭此项则玩家必须使用普通数字来进行交易
-
Fractions: true
-
# 金钱符号
-
CurrencySymbol: €
-
# 金钱显示格式
-
MoneyFormat: '###,##0.00'
-
# 长数字会变成字母缩写,比如 12305122 会缩写成 12.3m
-
UseShortNumbers: false
-
# 字母缩写
-
ShortNumbersSuffixes:
-
- ''
-
- 万-10000
-
- 亿-100000000
-
- 兆-1000000000000
-
- 吉-10000000000000000
-
# 是否使用西式计数显示法,使用圆点.代替逗号,来作为每三位数字的占位符,例如 1,000,000.00 会写成 1.000.000,00
-
SwitchPlaces: false
-
# 显示金钱时金钱数字和金钱符号的顺序
-
Placing: '[money][symbol]'
复制代码
普通玩家可以使用如下指令进行金钱交易:
-
/cmi balance
查看自己的金钱,所需权限cmi.command.balance
-
/cmi pay <玩家名> <金钱数量>
支付金钱,所需权限cmi.command.pay
-
/cmi baltop
查看金钱排行榜,所需权限cmi.command.baltop
管理员可以使用如下指令进行金钱管理:
-
/cmi money <give/pay/set/take> <玩家名> <金钱数额> (-s)
给予/支付/设定/取走某玩家的金钱,后面加-s则为静默操作
|
物资收购
涉及CMI功能:物资收购
玩家通过服务器里的生存活动可以获得很多物资,作为服主,有必要回收这些物资并将其换成金钱,这是玩家获取金钱的一个重要途径。
对于游戏内的物资收购,你当然可以使用QuickShop等第三方商店插件进行处理,但是CMI其实本身就自带了物资收购功能。
请打开CMI/Saves/Worth.yml配置文件,为你需要的收购物资设置收购价格,也可直接使用指令/cmi setworth 来设置某物品的收购价格:
-
# 可在游戏中使用 /cmi setworth 直接设置某物品收购价格
-
worth:
-
ACACIA_LEAVES: '0.5'
-
ACACIA_LOG: '0.6'
-
OAK_SAPLING: '0.22'
-
ACACIA_STAIRS: '1.09'
-
ACTIVATOR_RAIL: '1.0'
复制代码
玩家手持物品输入指令/cmi worth可以查询该物品的收购价格,或者输入/cmi worthlist可以打开一个收购物品种类的GUI,查看服务器正在收购的所有物品及其价格。
使用指令/cmi sell即可卖出手中物品,十分方便快捷,不需要一次次到服务器里专门的地点进行收购操作了。
|
MOTD
涉及CMI功能:MOTD
“MOTD”全称为message of the day,意为“每日信息”,对Minecraft服务器来说指的是在多人游戏界面显示的文字信息,一般会介绍服务器名称、玩法、服务器的特殊活动等。使用华丽的渐变色来展示MOTD,可以让你的服务器在玩家眼中脱颖而出。
提示:“渐变色”是MC1.16及之后的版本特性,对于老版本MC建议使用十六色彩色符号(例如&a)
设置服务器MOTD的指令为
/cmi setmotd <MOTD内容>
,可以使用如下彩色代码,使用
\n
可以换行。
-
&a每日信息
-
{#ff0000}每日信息
(MC1.16+)
-
{#ff0000>}每日 {#ffff00<>}信息 {#00ffff<}
(MC1.16+渐变色)
在上面的范例中,我使用的指令为:
-
/cmi setmotd {#ff0000>}PCD {#ffff00<>}Survival {#00ffff<>}Server{#9f5f9f<>} Ver0.1 {#ff0000<>}(Made With ♥){#e47833<} \n{#b3a28f>}▁▂▃▄{#5c6999<>}▅▆▇{#d7b8e6<}&f&l残叶出品{#d7b8e6>}▇▆▅{#5c6999<>}▄▃▂▁{#b3a28f<}
复制代码
但是啊……CMI只提供了设置motd功能,
没有提供“将motd变回默认”功能
,因此,想要彻底移除这些花里胡哨的MOTD内容,必须到服务器根目录/server.properties文件里,找到motd这一项,将其改成你想要的默认内容才行。
|
Tab列表
涉及CMI功能:Tab列表
玩家在游戏中按下Tab键之后,可以看到在线玩家列表,除此之外,CMI还提供了美化Tab列表顶部底部的设置,同时不同权限组的玩家还可以看到不同的Tab列表。
CMI的Tab列表配置文件在CMI/Settings/TabList.yml文件中:
-
# 想要完全禁用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:
-
- '&f------------------------------------'
-
- '&7欢迎来到PCD服务器 QQ群753198381'
-
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
-
- '&f------------------------------------'
-
Footer:
-
- '&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:
-
- '&f------------------------------------'
-
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
-
- '&f------------------------------------'
-
Footer:
-
- '&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:
-
- '&f------------------------------------'
-
- '&7当前在线 &f%server_online%&7/&f%server_max_players%'
-
- '&f------------------------------------'
-
Footer:
-
- '&f------------------------------------'
-
- '&7金钱: &f%vault_eco_balance_formatted% &7时间: &f%server_time_HH:mm:ss%'
-
- '&f------------------------------------'
复制代码
笔者个人认为,CMI的Tab列表功能在市面上的同类插件里,功能相当弱鸡,因此笔者不建议您使用CMI插件自带的此功能,如有需要,可以用用看功能更强大的
TAB
插件,支持动态Tab栏、玩家头顶自定义内容等。
|
可交互悬浮字
涉及CMI功能:悬浮字
悬浮字在大型服务器里非常常见,一般被安置在服务器主城、商店、小游戏入口等重要位置,用以显示玩家变量、标示重要位置、宣传一些重要信息等。
CMI提供了悬浮字功能,支持PlaceholderAPI变量,动/静态悬浮物品图标,甚至还可以让玩家与之进行交互,实现悬浮字翻页。
也许很多玩家使用过一款名叫HolographicDisplays的悬浮字插件,如果您在使用CMI之前已经正在使用HD悬浮字插件,可以通过以下指令将其中的数据导入CMI:
使用指令
/cmi hologram new <悬浮字名称>
来新建一个悬浮字,并在聊天框里直接编辑每行文字,可以添加PlaceholderAPI变量。
可以将
ICON:<物品ID>
写入悬浮字的某一行中来做出动态悬浮物品效果(如上图所示),也可直接使用
ICON:%iteminhand%
来把自己手中的物品直接设置为动态悬浮物品,如果想将其设置为不会动的静态悬浮物品,请将ICON:改为
SICON:
CMI提供了一个可视化的GUI菜单,可以在其中设置每行字之间的间隔,变量刷新的间隔,可视范围等等。
值得一提的是,该GUI左上角有一个“是否可交互”按钮,玩家可通过点击悬浮字底部的“上一页”“下一页”来对悬浮字进行翻页操作。
打开可交互按钮之后,可使用
!nextpage!
作为两页悬浮字的间隔,并将其插入到悬浮字分页的适当位置。
|
主城跳板
涉及CMI功能:launch指令
需搭配命令方块/第三方脚本方块插件使用
在服务器主城,玩家的出生点通常和周边的一些重要位置(例如传送门)相距很远,所以不妨在出生点附近放置一个“跳板”。玩家只要踩上去就可以“咻——”一声飞十几格远,恰好飞到世界传送门或者商店门口,当然,前提是没有飞歪。
首先设置跳板,并在其下面放置命令方块。(如果你的服务器没有开启命令方块功能,请在服务器根目录/server.properties文件中,把enable-command-block设置为true来启用命令方块)
在命令方块中,输入CMI的launch指令即可(在命令方块中,@p指代距离最近的玩家)
launch指令可以在后面添加更多参数:
-
-nodamage
玩家落地时无伤
-
p:<力度>
起跳力度,数字越大跳的越远
-
a:<仰角>
起跳仰角,缺省默认为0(即平地移动)
-
d:<方位角>
起跳方位角,0代表正南,也可直接使用如d:east这样的文字描述起跳方向
-
loc:<X>:<Y>:<Z>
起跳目标坐标,请注意这个只能决定起跳方向,是不是真的能跳到此处需考虑其他因素
你可能需要多试几次,精细调节力度、仰角和方向才能让玩家起跳刚好跳到目标位置,在下面的动图演示里,我使用的指令为:
-
/cmi launch
@p -nodamage p:2.7 a:25
除了使用命令方块+压力板来触发跳板以外,也推荐您使用第三方的脚本方块插件(例如
ScriptBlockPlus
)检测玩家踩上某脚本方块之后即触发CMI的launch指令,相对于命令方块而言要简便许多。
|
点击木牌随机传送
涉及CMI功能:木牌编辑、随机传送、ic指令绑定
作为一个生存服,随机传送功能是必要的,玩家可以通过点击位于主城的“随机传送”木牌直接进行主世界随机传送。
拥有随机传送功能可以避免玩家破坏主城周边的环境,同时也能让玩家传送到未被他人染指的新区域,进行物资采集。
首先让我们先来制作一个挂在墙上的木牌,CMI提供了指令来让你直接编辑木牌上的文字,请让鼠标对准相应木牌并输入
/cmi se <木牌行数> <内容>
即可直接编辑木牌内容,文字均可添加彩色代码。
CMI提供了指令ic来让“点击方块”这个行为和执行指令相绑定,不妨输入
/cmi ic new <绑定名称>
来新建一个绑定组合,并通过聊天栏编辑给这个组合添加目视方块以及绑定指令。
将随机传送的指令
/cmi rt [playerName] <世界名>
按照提示绑定至该木牌即可。
关于随机传送,CMI/config.yml的相关配置如下,你可以设置传送的范围、中心点、不被传送的群系等等:
-
# 随机传送
-
RandomTeleportation:
-
# 设置为 true 将对所有世界运用随机传送机制
-
# 设置为 false 将不再对新世界启用随机传送, 但你可以手动添加
-
AutoGenerateWorlds: true
-
Worlds:
-
world:
-
Enabled: true
-
MaxRange: 1000
-
MinRange: 500
-
CenterX: 0
-
CenterZ: 0
-
Circle: false
-
world_nether:
-
Enabled: true
-
MaxRange: 1000
-
MinRange: 500
-
CenterX: 0
-
CenterZ: 0
-
Circle: false
-
world_the_end:
-
Enabled: true
-
MaxRange: 1000
-
MinRange: 500
-
CenterX: 0
-
CenterZ: 0
-
Circle: false
-
# 使用指令的冷却时间秒
-
Cooldown: 5
-
# 当玩家使用随机传送时,插件最多会尝试检测多少次来寻找一个安全的坐标
-
# 尽量设置的低一些
-
MaxTries: 20
-
# 以下生物群系不可被传送到
-
ExcludedBiomes:
-
- Ocean
-
- Deep ocean
复制代码
|
传送门
涉及CMI功能:传送门
PCD服务器里不仅仅只有主世界一个世界,还有地狱、末地、地皮区、小游戏区……等等多个世界,在服务器的重要区域设置自定义的传送门,让玩家在多个世界之间穿梭,可大大增加游戏效率。
不妨尝试在服务器里搭建一个漂亮的方形传送门,使用木锹(CMI中文Wiki里误译为木锄)左键右键点击对角线两点,选出传送门区域。
输入指令
/cmi portals new <传送门名称>
即可创建传送门,之后可以使用
/cmi portals
找到此传送门。
在传送门列表里点击此传送门名称,可以弹出一个GUI菜单,可对该传送门的粒子效果、传送至的位置、传送所需权限等进一步设置,也可以设置传送门到传送门。
有关CMI的传送门,更多教程可以在
这里
看到。
|
木牌电梯
涉及CMI功能:木牌电梯
在服务器的多层建筑(如商店)中,如果玩家想在楼层与楼层之间上下移动,该用什么方案解决?Minecraft原版的“水电梯”也许不错,但CMI其实自带了“木牌电梯”玩法,更加高效快捷。
首先在config.yml中找到
ElevatorIndicator
设置项,这个设置项决定了电梯木牌第一行的内容,在我提供的汉化里,内容是“
[电梯]
”
-
ElevatorIndicator: '[电梯]'
复制代码
然后你便可以放置一个木牌,第一行写上
[电梯]
,后三行随便写什么都可以
然后你可以在同一XZ坐标点不同高度放置多个木牌。
玩家点击木牌便可以向上移动,Shift+点击木牌便可以向下移动。
|
巧用Bossbar
涉及CMI功能:bossbar动态方位、bossbar伤害提示、bossbar消息推送
Bossbar指的是游戏顶部出现的彩色血条以及信息,除了打游戏boss以及村庄袭击时会出现以外,通过CMI提供的各项功能,可以将其利用为随目视方向不断改变的方位展示指南针、显示主城、死亡地点方位、用来显示被攻击实体的剩余血量等等。
★设置Bossbar动态方位
请在CMI/config.yml中找到Compass相关设置,这个设置默认是关闭的。
-
Compass:
-
# 用bossbar显示动态方位
-
# 仅限 1.9+ 服务器
-
BossBar: false
-
# 需要手持指南针才能显示动态方位
-
RequireCompass: false
-
# 动态方位更新的频率(毫秒)
-
UpdateInterval: 200
-
# 长度可以自己决定,但请务必注意八个方向之间等长
-
Shape: '------------SW-------------W-------------NW-------------N-------------NE-------------E-------------SE-------------S-'
-
Color: '&7'
-
ShowHome: true
-
Home: ۩
-
ShowSpawn: true
-
Spawn: ⤋
-
ShowDeath: true
-
Death: ☠
-
ShowCompassTarget: true
-
CompassTarget: ꖴ
-
# 仅限 1.16+ 服务器
-
# 当指南针方向改变时,设置bossbar颜色随之改变
-
Gradient:
-
Use: true
-
SouthColor: white
-
WestColor: orange
-
NorthColor: vulcan
-
EastColor: bitter_lemon
复制代码
其中的Home/Spawn/Death/CompassTarget为玩家的家、主城、死亡地点、指南针目标,也会在动态方位中显示位置。
★设置Bossbar伤害显示
请在CMI/config.yml中找到Bossbar相关设置,默认设置是开启的。
-
BossBar:
-
# 启用或禁用 bossbar 血条显示伤害血量,仅适用于 1.9+
-
HpBarEnabled: true
-
# 不显示bossbar的实体名称
-
HpBarBlackList:
-
- Ender_dragon
复制代码
★Bossbar消息推送
你可以通过游戏内指令/cmi bossbarmsg 给玩家推送一条bossbar消息,当然,这条消息也是可以新增参数的,以下是来自CMI Wiki的相关参数:
-
-t:<消失秒数>
该bossbar消息多少秒后会消失,设置为负数则直到玩家下线前都不消失
-
-c:<颜色>
该bossbar血条颜色
-
-s:<分节>
该bossbar血条的分节,可选:1、6、10、12、20
-
-n:<名称>
该bossbar的名称,若已有一条bossbar存在又尝试创建相同名称的bossbar,则原bossbar会被覆盖而非新建一条
-
-p:<总充盈度/实际充盈度>
血条充盈度,如100/23表示23%的充盈度,分子和分母都可以是PlaceholderAPI变量
-
-p:+1/-1
让血条充盈度按照设定的百分比缓慢增加/减少,结束之后执行-pcmd指令。
-
-cmd:"不加斜杠的指令1;;不加斜杠的指令2"
倒计时结束之后,执行控制台指令
-
-pcmd:"不加斜杠的指令1;;不加斜杠的指令2"
血条充盈度到0或100之后,执行控制台指令
-
-sec:<读秒>
设置为正数,该读秒会从0开始直到读秒到这一数值,设置为负数,该读秒会从这一数值倒数到0,读秒结束之后会执行-cmd指令,可在bossbar内容中使用变量[autoTimeLeft]表示剩余秒数
-
-a:<ticks>
bossbar更新的tick间隔,20ticks=1秒
-
-cancel:<名称>
立刻终止该bossbar的显示
更多有关Bossbar消息的内容请参考Wiki→
这里
。Wiki中举了一个“关服倒计时”的例子,但是我觉得还能发掘出其他用处来:
例如,展示某项游戏统计数据和目标数据,直观地显示玩家距离目标还差百分之多少:
/cmi bossbarmsg <玩家名变量> &a已击杀僵尸数量:%cmi_user_stats_MonsterKills:zombie% &e击杀目标:100 -p:100/%cmi_user_stats_MonsterKills:zombie% -n:zombie
|
从“滚动公告”讲起
涉及CMI功能:聊天/bossbar/actionbar/title/toast消息、计划任务、特殊指令
服务器聊天栏里可以每隔一段时间推送一条宣传内容,内容可以是服务器新玩法介绍、强调服务器规则、甚至催促充钱的提醒等,此谓“滚动公告”是也。当然,这种滚动公告也可以通过bossbar/actionbar等其它形式推送给玩家!
如果你只是为了给某个玩家用某种形式发单独一条信息,CMI提供了相关指令:
发送title/subtitle标题消息:
-
/cmi titlemsg [playerName/all] [主标题 \n 副标题] (-in:[渐入ticks]) (-out:[渐出ticks]) (-keep:[持续ticks])
发送actionbar动作条消息:
-
/cmi actionbarmsg [playerName/all] (-s:[持续时间秒]) [动作条内容]
发送toast进度条消息:
-
/cmi toast [playerName/all] (-t:[进度类型]) (-icon:[物品图标]) [进度内容]
发送ctext自定义多行聊天文字消息:
-
/cmi ctext <ctext文件名> [playerName/all]
发送ctell聊天JSON文字消息:
-
/cmi ctellraw [playerName/all] <json消息内容>
但是,如果我们要做出“滚动公告”效果,让这些消息每隔一段时间向全体玩家推送一次,我们可以使用CMI的“计划任务”功能。
计划任务可以让服务器每隔一段时间、或者每日固定某一时刻触发一些事件/指令等,配置文件在CMI/schedule.yml中,比如我想做一个每隔600秒滚动展示一次的“滚动公告”,我可以这样配置:
-
AdMessages:
-
Enabled: true
-
Delay: 600
-
Repeat: true
-
Commands:
-
- actionbar! &6[PCD服务器] &a欢迎来到PCD服务器
-
- broadcast! &6[PCD服务器] &a欢迎来到PCD服务器
-
- title! &aPCD服务器
-
- subtitle! &f全提瓦特最好的服务器
-
- allPlayers! cmi toast [allPlayers] &f欢迎来到PCD服务器
-
- allPlayers! cmi bossbarmsg [allPlayers] &6[PCD服务器] &a欢迎来到PCD服务器
复制代码
以上的“滚动公告”中包含了actionbar、聊天、title、subtitle、toast进度、bossbar等六种滚动公告的展示方法,同时触发时效果是这样的:
另需注意:有用户反馈称计划任务循环触发无法生效,经过排查发现问题出在配置文件的Delay设置项上,请务必确保设置项Delay开头的D是大写,循环触发方可生效(部分旧版汉化包中写进去的是小写的delay)
不知道你有没有注意到,在上面的计划任务中,有一些开头是类似actionbar! 这样的带感叹号的指令,此为CMI的“特殊指令”,将在下一章节里详细介绍。
|
特殊指令
涉及CMI功能:特殊指令
“特殊指令”在CMI的多个功能中被使用到,其有特殊的写法,主要功能是决定某条内容以什么形式推送给玩家、某条指令执行的条件、以及指令与指令之间是否存在间隔等,功能相当强大。
特殊指令可以被用在ic指令绑定方块、attachcommand指令绑定物品,计划任务、传送门执行指令、自定义指令简写中,等等
常用“特殊指令”写法如下:
-
指令中若包含变量
[playerName]
,执行时会被替换为玩家名称。
-
指令中若包含变量
[randomPlayer]
,执行时会被替换为服务器里任意一个玩家的名称
-
指令若以
msg!
开头且后面跟了玩家名称,则为给该玩家推送一条聊天消息
-
指令若以
broadcast!
开头,则为给全服玩家推送一条聊天消息
-
指令若以
actionbar!
开头,则为给全服玩家推送一条actionbar消息
-
指令若以
title!
开头,则为给全服玩家推送一条title消息
-
指令若以
subtitle!
开头,则为给全服玩家推送一条subtitle消息
-
指令若以
kickall!
开头,则会将全服玩家踢出,可附上踢人理由
-
指令若以
asPlayer!
开头,则以玩家身份执行后续的指令
-
指令若以
asPlayer!
开头,则以玩家身份执行后续的指令
-
指令若以
asConsole!
开头,则以控制台身份执行后续的指令
-
指令若以
asFakeOp!
开头,则玩家以管理员身份执行后续的指令
-
指令若以
allPlayers!
开头,则后续指令将对全服每个玩家执行一遍,指令中需包含[allPlayers]变量指代玩家名
-
指令若以
cooldown:<秒>!
开头,则后续的指令必须经过冷却时间才能二次触发
-
指令若以
ucooldown:<秒>!
开头,虽然也是冷却时间但不同的事件里拥有单独的冷却时间,其他事件里的此指令冷却不影响本指令执行
-
指令若以
gcooldown:<秒>!
开头,则该冷却是全服性的,冷却时间内全服玩家都不能二次触发
-
指令若以
perm:<权限>!
开头,则有该权限的玩家可以触发后续指令,可放在其他特殊指令之前
-
指令若以
moneycost:<金钱>!
开头,则有足够的钱的玩家可以触发后续指令
-
指令若以
hasmoney:<金钱>!
开头,则只检测玩家是否有足够的钱,但不扣除
-
指令若以
expcost:<经验>!
开头,则有足够的经验的玩家可以触发后续指令
-
指令若以
hasexp:<经验>!
开头,则只检测玩家是否有足够的经验,但不扣除
-
指令若以
item:<物品ID>!
开头,则有该物品的玩家可以触发后续的指令,可以给其增加数量参数,写成item:<物品ID>-<数量>!
-
指令若以
hasitem:<物品ID>!
开头,则只检测玩家是否有足够的物品,但不扣除,可以给其增加数量参数,写成item:<物品ID>-<数量>!
-
指令若以
ifonline:<玩家名>!
开头,若指定玩家在线则触发后续指令
-
指令若以
ifoffline:<玩家名>!
开头,若指定玩家不在线则触发后续指令
-
指令若以
ifempty:<hand/offhand/quickbar/armor/inv/subinv>!
开头,若玩家背包里特定格子是空的则触发后续指令,其中quickbar是快捷九格栏,armor是盔甲四格栏,inv是整个背包,subinv是除掉快捷栏9格的剩下27格栏,可以给其增加数量参数,例如ifempty:quickbar-3代表快捷栏里至少要有3格空余才能触发后续指令
-
指令若以
check:<第一个值><比较符><第二个值>!
开头,则为检测某两个值(可以是PlaceholderAPI)是否一致或者孰大孰小,只有符合条件才能执行后续指令,比较符可以是==/</<=/>/>=/!=,例如check:%cmi_user_balance%>=1000!将检测玩家的金钱是否大于等于1000.
-
指令若以
votes:<票数>!
开头,若玩家获得一定投票才能执行后续指令
-
(仅适用于IC指令绑定)指令若以
click:<点击方式>!
开头,玩家必须以某种方式点击方块才能生效,可用<left/leftshift/right/rightshift>
-
在两行指令间插入
delay! <秒>
则为两行指令之间的延迟,可以给这个延迟取个名字,写法:delay! <秒> [名字]
-
使用
canceldelay:<名字>!
即可直接中止延迟
-
statement:<检测名称>! <条件1>! <条件2>! <...>!
-
if:<检测名称>! <上述条件全符合后执行的指令>
-
if:<检测名称>@! <上述条件不符合后执行的指令>
列出一系列条件,并给它取一个检测名称,若全部条件均符合则执行if:<检测名称>!后的指令,若有一个不符合则执行if:<检测名称>!@后的指令。
在以上条件检测之中,如果你想让玩家不符合检测条件时收到提示语,可以加一个问号?,例如:
perm:<权限>?!
在以上条件检测之中,如果你想让玩家不符合检测条件时直接终止整个指令队列,可以加一个#,例如:
perm:<权限>#!
你甚至可以把检测条件改为反向含义,新增一个@符号即可,例如
perm:<权限>@!
代表只有没有这个权限才能执行后续指令
以上三种特殊符号可以用在一起,例如
perm:<权限>?#@!
更多关于特殊指令的介绍请参考
这里
。
|
击杀生物掉落头颅
涉及CMI功能:掉落头颅
击杀生物掉落头颅是生存服里一种很有趣的玩法,玩家可以通过杀死动物、怪物或者其他玩家来获得他们的头,用于装饰、收藏,乃至嘲讽敌对玩家。
请在CMI/config.yml中找到Heads相关设置,设置是否开启掉落玩家/生物头颅,这些设置默认是关闭的。
-
Heads:
-
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: []
复制代码
之后也可在CMI/customHeads.yml配置文件中对每一种动物的头颅掉落概率进行进一步配置。
|
自定义死亡提示语
涉及CMI功能:自定义死亡提示语
相对于原版的死亡提示来说,自定义的死亡提示语可以让服务器与众不同,你可以就每一种死法,被每一种生物击杀都设置自定义的提示语。
请在CMI/Settings/DeathMessages.yml中,开启自定义死亡提示语,默认是关闭的。
-
# 开启自定义死亡提示
-
# 请注意目前本插件也许尚未涵盖全部种类死法
-
# 若想上报新的死法,请使用 github issue 来上报,并在其中展示新死法的触发方式
-
EnableCustom: true
复制代码
之后可以在CMI/Settings/DeathMessages/Locale_EN.yml 中,就各种死法和被各种生物/玩家击杀设定特别的提示语。
-
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的烟花炸死了'
复制代码
|
菜单中的随身GUI工具
涉及CMI功能:指令呼出工具GUI
需搭配第三方GUI菜单插件
CMI提供的“随身工作台”、“随身末影箱”等随身GUI工具,允许玩家直接使用指令呼出相应工具GUI,免去亲自跑到相应工具方块前的麻烦。
如果把这些随身GUI做成菜单按钮,并加入到“服务器菜单”之中,玩家使用起来将更方便,直接点点点就可以了。
此机制可提供给VIP玩家。
CMI提供了以下指令,用以直接呼出相应GUI工具,其中某些工具并不是所有服务器版本/种类均适配:
-
/cmi workbench
随身工具台
-
/cmi ender
随身末影箱
-
/cmi anvil
随身铁砧
-
/cmi stonecutter
随身切石机
-
/cmi loom
随身织布机
-
/cmi cartographytable
随身制图台
-
/cmi smithingtable
随身锻造台
-
/cmi grindstone
随身砂轮
如果把这些指令做进服务器菜单GUI,玩家在菜单中点击相应工具即可直接呼出GUI。
|
玩家在线奖励
涉及CMI功能:在线奖励
玩家通过在服务器里的持续在线,可以每小时领取到一些金币或者道具,对于总在线时间更长的玩家,奖励也将更加丰厚。
玩家在线奖励相关设置在CMI/Settings/PlayTimeRewards.yml配置文件中,分为以下两种:
-
按照玩家在线时间间隔,每过固定时间即可领取,一个奖励可领取多次(PayEvery)
-
按照玩家总游戏时长,到了一定时间后可以领取,一个奖励只能领取一次(PayFor)
以下是两个玩家在线奖励的设置例子,触发的指令均可使用CMI特殊指令,注意两种例子写法的不同:
-
daily1:
-
DisplayName: "&7每日奖励"
-
# 是否自动领取而不需要输入/cmi prewards领取
-
AutoClaim: true
-
Description:
-
- "&2别忘了每天的在线奖励"
-
- "&2每天只能领一次的100金币喔"
-
PayEvery: 86400
-
Commands:
-
- asConsole! cmi money give [playerName] 100
-
1day:
-
DisplayName: "&f在线一日奖励"
-
AutoClaim: true
-
Description:
-
- "&2你已经在本服务器玩了总共一天了"
-
- "&2你一次性获得了500金币!"
-
PayFor: 86400
-
Commands:
-
- asConsole! cmi money give [playerName] 500
复制代码
如果领取在线奖励再搭配上触发toast指令,想必效果会非常棒:
|
睡觉与夜晚加速
涉及CMI功能:夜晚加速
对于原版Minecraft来说,太阳落山后必须全部玩家共同入睡才能实现跳过夜晚,但CMI提供了一种机制,可以按照玩家入睡比例加快夜晚速度。
请在CMI/config.yml中找到如下配置项,该机制默认是开启的。
-
Sleeping:
-
Speedup:
-
# 设置为true,玩家睡觉时可加速夜晚进度
-
# 进入睡眠的玩家越多,夜晚加速越快
-
Enabled: true
-
# 此机制生效的世界
-
# 请务必注意:生效的世界必须是NORMAL类型的世界,也就是说地狱和末地不能设置,同时全服只能设置唯一一个世界
-
# 设置为 [] 则所有合适的NORMAL世界都会被包含在内
-
Worlds: []
-
# 设置为 true 时间只在 13000 到 24000 ticks 才会加速(也就是晚上)
-
# 设置为 false 时间在全天均可加速(包括雷暴天气)
-
OnlyDurringNight: true
-
# 夜晚加速信息显示方式: none, title, bossbar
-
InfoType: title
-
# 设置为 true, 在AFK离开模式的玩家不计入夜晚加速玩家计算之中
-
ExcludeAfk: true
-
# 基础夜晚速度,设置的越大,玩家睡觉时夜晚进度越快
-
BaseSpeed: 100
-
# 夜晚进度的最小速度
-
MinSpeed: 5
-
# 只有大于这个数量的玩家进入睡眠,夜晚加速才会开始
-
# 可有两种表示方法,具体数字代表具体入睡玩家数量,若为百分数则表示全服在线玩家多少百分比入睡
-
MinBeforeSpeeding: 50%
-
# 设置为 true,仍然没有入睡的玩家会收到催促提示
-
Inform: true
-
# 玩家开始入睡多少秒后开始出现催促提示
-
InformDelay: 30
复制代码
|
不死图腾
涉及CMI功能:不死图腾
原版Minecraft的不死图腾机制实在让人难以吐槽,必须拿在手上才能发挥机制,当玩家从背包内将其拿出时,敌对生物早就把玩家削成齑粉了。
CMI提供了一些有关不死图腾的机制,可以让不死图腾在背包内也可发挥作用,可以设定其使用冷却时间等等。
不死图腾相关配置在CMI/config.yml中,默认这项机制是关闭的:
-
Totem:
-
# 设置为 true,玩家死亡时背包里的不死图腾会自动生效,哪怕没有被拿在手上
-
RemoveFromInventory: false
-
Cooldown:
-
# 设置为 true 玩家每过 X 秒才能使用一次不死图腾
-
Use: false
-
Time: 600
-
Warmup:
-
# 设置为 true 玩家使用不死图腾后将会延迟X秒才会生效
-
# 请注意即便这个延时内玩家并没有死,不死图腾也会被消耗
-
Use: false
-
Time: 10
-
# 当玩家拥有不死图腾又掉入虚空时, 他将被传送至重生点同时消耗不死图腾
-
ProtectFromVoid: true
-
Effects:
-
# 不死图腾被使用后,作用的三个正面效果(再生/火焰抗性/伤害吸收)可以持续多少秒?. 设置为 0 则禁用
-
Regeneration: 45
-
FireResistance: 40
-
Absorbtion: 5
复制代码
|
附魔书回收
涉及CMI功能:附魔书回收
Minecraft的附魔书系统是单向的,一旦附魔上了绝无可能再把附魔书取回,但CMI对于这种情况提供了“后悔药”:附魔书回收!玩家通过此功能可以从附魔物品中取回附魔书——当然,需要一定的代价。
有时,在地牢探索中也许可以在宝箱里找到一些不错的附魔,但却附魔在了垃圾工具上(例如时运III附魔在了金镐上)也可以使用附魔书回收机制将此附魔书取出来——当然,需要一定的代价。
打开附魔书回收GUI的指令为
/cmi scavenge
(权限cmi.command.scavenge),你可以把这个指令和服务器菜单里的按钮进行绑定,来让玩家直接打开。
附魔书回收需要一定代价,具体是:
-
需要花费金钱
-
物品可能彻底崩坏而无法取回(几率可调,可设置该物品组成物被取回)
-
提取附魔书可能失败
-
提取出的附魔书可能被降低附魔等级
相关设置在CMI/config.yml中:
-
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
-
# 不可进行组合物取出的物品材质
-
BlackList:
-
- diamond
-
- ironingot
-
- goldingot
-
- coal
-
# 设置为 true, 以上黑名单反转为白名单,只有以上组合物材质可取出
-
BlackToWhiteList: false
-
# 设置为 false 当玩家打开取出菜单,他们将无法从地面上捡起物品
-
AllowItemPickups: false
-
# 当某些设置物品(比如剑)被回收附魔书之后,是否重置其修理消耗,这样玩家可以将其像新武器一样重新附魔,而不会显示无法附魔
-
ResetRepairCost: true
复制代码
|
鞘翅加速
涉及CMI功能:鞘翅加速
原版Minecraft的鞘翅基本和滑翔机无异,速度慢,操作不便。
CMI给鞘翅提供了加速功能,玩家在鞘翅飞行时手持特定道具可以消耗经验/物品进行加速。
鞘翅加速相关设置在CMI/config.yml中:
-
Elytra:
-
# cmi.elytra - 允许使用鞘翅(负向权限)
-
# cmi.elytra.boost - 允许使用推进器推进鞘翅飞行
-
# cmi.elytra.superboost - 允许使用超级推进器推进鞘翅飞行
-
# cmi.elytra.speedometer - 允许看到速度显示
-
Boost:
-
# 推进器可提供的最大速度
-
SpeedLimit: 200
-
# 当玩家飞行超速后,经验/物品将不会继续消耗
-
SpeedLimitStop: false
-
# 显示飞行速度
-
SpeedDecimals: true
-
# 每次使用推进器,加速多少
-
GeneralMultyplier: 0.1
-
# 每次使用超级推进器,加速多少
-
# 使用普通推进器时按住shift即可切换至超级推进器
-
SuperMultyplier: 0.3
-
# 消耗物品,而不消耗经验
-
UseItems: false
-
# 每次推进要消耗的物品ID
-
ConsumedItem: STONE
-
# 每次推进手里必须拿着的物品ID
-
# 如果你不需要这个设置,想让玩家手里拿什么都可以,可设置为 AIR
-
# 但请注意AIR不代表空手,想要推进依然需要手里拿着某一物品并点击鼠标左键
-
Item: FEATHER
-
# 每次起飞手里必须拿着的物品ID
-
# 如果你不需要这个设置,想让玩家手里拿什么都可以,可设置为 AIR
-
# 但请注意AIR不代表空手,想要起飞依然需要手里拿着某一物品并点击方块
-
LaunchItem: FEATHER
-
# 需要把要消耗的物品拿在手上,UseItems 需要设置为 false
-
RequiresItem: trueytraay
-
# 每次普通推进消耗的物品数量
-
Amount: 1
-
# 每次超级推进消耗的物品数量
-
SuperAmount: 5
-
# 飞行时显示粒子效果
-
ShowParticles: true
-
# 手持特定物品按住Shift原地充能飞起的时间秒
-
Launch:
-
Time: 2
-
# 对于1.13以上的服务器,玩家在飞行时是否禁用“激流”附魔加速?
-
# 飞行加速合并激流附魔加速将会使玩家飞行速度快到难以控制,因此请考虑周全
-
DisableRiptide: false
-
Fix:
-
# 当使用鞘翅飞行时,使用箭来加速不会伤到自己
-
PreventSelfDamage: false
-
# 当使用鞘翅飞行时,禁止使用烟花火箭来加速
-
PreventRocketUsage: false
复制代码
以下是鞘翅加速玩法需要的权限:
-
-cmi.elytra
完全禁用鞘翅(负向权限)
-
cmi.elytra.boost
使用普通鞘翅加速
-
cmi.elytra.superboost
使用超级鞘翅加速
-
cmi.elytralaunch
使用飞行前原地充能发射
-
cmi.elytra.speedometer
鞘翅飞行时显示速度
就原版Minecraft而言,鞘翅起飞通常要找到一个高地/悬崖起跳,但是CMI提供了原地充能发射功能,站在地面手持某一设定物品(默认为羽毛)按住Shift指向地面即可原地充能,充能完毕松开Shift键即可原地发射,此时就能自动进入鞘翅飞行模式。
CMI提供了两种鞘翅加速:
-
普通加速(boost):
手持设定物品(默认为羽毛)点击鼠标右键即可加速,最快速度可自行设置(默认0.1约80km/h)
-
超级加速(superboost):
手持设定物品(默认为羽毛)点击鼠标右键同时长按Shift键,最快速度可自行设置(默认0.3约120km/h)
以下是加速前和普通加速后的飞行速度变化:
玩家必须消耗代价才能使用鞘翅加速,目前有两种:
-
消耗经验:
请在配置中把UseItems: 设置为false
-
消耗特定物品:
请在配置中把UseItems: 设置为true,并设置ConsumedItem: 等物品有关的设置项
|
|
|
|
神奇食品道具
涉及CMI功能:物品绑定指令,物品编辑,物品保存
我的PCD服务器里有一些神奇的食品道具,吃下它们可以大量回复血量、大量回复饥饿、获得药水效果,甚至直接变成OP……实现这些功能不需要第三方插件,只要CMI就够了!
我们已经在上文中介绍了CMI的物品绑定指令、物品编辑、物品保存等功能,如果我现在让你做一个和下图一样的带自定义名称、lore、隐藏附魔文字flag的物品,相信你很快就能做出来:
做不出来?那我把物品ItemMeta放出来总可以了吧?
-
superapple:
-
Item:
-
v: 2975
-
type: APPLE
-
meta:
-
==: ItemMeta
-
meta-type: UNSPECIFIC
-
display-name: '{"extra":[{"bold":true,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gold","text":"野兽先辈の神奇林檎"}],"text":""}'
-
lore:
-
- '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"我说那个上杉夏相啊"}],"text":""}'
-
- '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"刚刚我在写教程的时候"}],"text":""}'
-
- '{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"yellow","text":"你有偷看吧?"}],"text":""}'
-
enchants:
-
ARROW_DAMAGE: 3
-
ItemFlags:
-
- HIDE_ENCHANTS
复制代码
在“钟表菜单”那个例子里,我们之前还学习了CMI的attachcommand物品绑定指令,玩家只要通过手持物品点击即可触发指令打开菜单,但对于食物来说,如果想做出“吃掉食物时触发指令”,需要对attachcommand添加一些参数。
比如我想做一个“
吃掉以后饥饿值恢复全满
”的苹果,我可以手持此物品在游戏中输入以下指令:
/cmi attachcommand !consume!;;!cc!cmi hunger [playerName] 20
该指令中包含两个附加的参数,
!consume!
代表吃下该物品时触发,
!cc!
代表从控制台执行此指令,参数与参数之间用两个英文分号;;分隔开来,
[playerName]
是玩家名变量。
同理,以下神奇食品也可以通过增加参数的attachcommand指令制作出来:
/cmi attachcommand !consume!;;!cc!cmi heal [playerName]
/cmi attachcommand !consume!;;!cc!cmi suicide [playerName]
-
吃掉以后获得跳跃提升II 60秒同时播放射箭的声音效果
/cmi attachcommand !consume!;;!cc!effect give [playerName] minecraft:jump_boost 60 1
;;!cc!cmi sound entity_arrow_shoot [playerName] -s
制作好这些神奇食品之后,可以通过商店、奖励等途径分发给玩家,或者放入kit礼包等等。
attachcommand可以添加更多附加参数,可以在
这里
查到详细介绍。
|
枪
械射击玩法
涉及CMI功能:物品绑定指令,物品编辑,物品保存,shoot指令
我的PCD服务器里有枪/械射击玩法,把枪道具发给玩家们,看他们互射,多有趣啊,你以为我安装了CrackShot?我只用CMI就能做到!
通过上面“神奇食品”的例子,想必你已经学会了给attachcommand新增附加参数,接下来将要介绍的是一些新的附加参数,利用这些,可以做出一把如下图所示的,可以射出弹射物的“枪”。
如何给这个物品更改名称、添加lore、设置附魔、修改ItemMeta等等我们已经在之前的教程中讲了很多遍了,这里不再赘述。
可以在attachcommand中添加的参数列表如下:
-
!cc!
从控制台执行此指令,请注意控制台并非玩家,某些指令有必要指定生效的玩家名。
-
!left!
鼠标左键点击触发
-
!right!
鼠标右键点击触发
-
!cooldown:[冷却秒数]!
两次触发指令的冷却时间
-
!limiteduse:[限制使用次数]!
这个物品只能使用的次数,次数使用完毕物品即消失
-
!safelimiteduse:[限制使用次数]!
也是使用次数限制,但次数使用完毕后物品不消失,变回普通物品
-
!consume!
对于食物,吃下以后触发一次(不可与limiteduse同时使用)
-
!silent!
执行指令时屏蔽对玩家的消息提示
-
!ignore!
执行物品左右键点击时原本的机制,例如方块类的物品,点击地面以后真的会放到地上
-
对于多个参数,使用双英文分号;;隔开
关于射出弹射物,CMI提供了shoot指令来实现,假如我想给上图中的枪新增attachcommand,左键点击射出火球,右键点击射出箭,两次使用有5秒冷却,最多可以使用100次之后就会消失,我使用的指令是如下这样的
(根据联机教程版版规2-13,您可能需要回复此帖才可看到此指令)
斯巴拉西哟!还要啥自行车啊?
此外,CMI自带的shoot指令可以射出任何实体,理论上诸如药水云、TNT、凋零之首、甚至熊猫都能射出去,看你怎么玩了。
|
“脱洞绳”道具
涉及CMI功能:物品绑定指令,物品编辑,物品保存,top指令
脱洞绳道具创意来自“宝可梦”系列游戏,当玩家困在洞穴里无法脱身时,使用此道具可以迅速脱离洞穴回到地面。
自Minecraft“洞穴与山崖”更新之后,MC的地下矿洞越来越深,玩家在下矿时因迷路、火把耗尽等原因导致无法脱困的情况越来越常见了,如果这时使用了道具“脱洞绳”,就可以瞬间回到安全的地面,保住玩家来之不易的矿物战利品。
此机制主要用到的指令是/cmi top ,玩家使用此指令后即可在坐标Y轴上瞬移并到达地表。
给“脱洞绳”设定attachcommand的参数很简单,如下所示,因为是一次性的道具所以要加个limiteduse参数
-
/cmi attachcommand !limiteduse:1!;;!cc!cmi top [playerName]
|
“临时飞行券”道具
涉及CMI功能:物品绑定指令,物品编辑,物品保存,tfly临时飞行,flightcharge飞行能量
出于安全方面和服务器平衡考虑,大部分生存服务器不会给玩家开放永久飞行权限,但其实CMI提供了“临时飞行”功能,可以让玩家在限定条件下短暂的飞行,并花费一些金钱/经验等等,对服务器平衡影响不大。
CMI提供了两种可让玩家临时飞行的功能,一种是限时飞行(tfly),还有一种是飞行能量(flightcharge),玩家可消耗金钱/经验购买飞行能量,飞行能量会随着飞行移动距离而消耗。
有关玩家飞行的指令如下所示:
-
/cmi fly [playerName] [true/false]
切换玩家飞行模式
-
/cmi tfly [playerName] <临时飞行时间>
设置临时飞行时间秒,设置为0则为下线前无限时飞行,设置为+10则为原有时间加10秒
-
/cmi flightcharge <add/take/set/show/recharge> [playerName] [充能数]
设置飞行能量/飞行充能
-
/cmi flyc [playerName] [true/false]
启用/禁用飞行能量
-
/cmi flyspeed [playerName] <0~10>
切换飞行速度
虽然把这些指令的使用权限交给玩家也未尝不可,但我总觉得“把指令绑定在飞行券上,玩家点击使用即可临时飞行”这种方案更好一些,玩家不需要记这些乱七八糟的指令,而且飞行期间可以热充能,不需要专门停下来敲指令。
这是一张“飞行限时券”,玩家点击使用可以限时飞行60秒:
-
/cmi attachcommand !limiteduse:1!;;!cc!cmi tfly [playerName] 60
这是一张“飞行充能券”,玩家点击使用即可为飞行能量充能,可以飞行60格:
-
/cmi attachcommand !limiteduse:1!;;!cc!cmi flightcharge add [playerName] 60
这些飞行券道具可以通过商店、奖励等途径分发给玩家,或者放入kit礼包等等。
有关“飞行能量”相关设置,在CMI/config.yml中:
-
# 飞行能量系统
-
FlightCharge:
-
# 默认情况下bossbar会显示剩余的飞行能量. 若设置为false,bossbar只在人为更改飞行能量时会显示,正常的飞行消耗不再显示
-
ShowBossBar: true
-
# 设置为 true, 每次玩家获得新的飞行能量或者下线重登后,其飞行模式都会自动开启
-
# 设置为 false, 玩家必须使用 /cmi flyc 指令来手动开启飞行
-
EnabledByDefault: true
-
# 设置为 true, 如果玩家把游戏模式从 survival/adventure 调至 creative/spectator ,其飞行能量系统将被禁用
-
# 反过来也一样,从 creative/spectator 调至 survival/adventure
-
AutoSwitch: false
-
# 1经验可以兑换多少飞行能量
-
# 设置为 0 则禁用经验兑换
-
ExpRechargeCost: 1.0
-
# 1金钱可以兑换多少飞行能量
-
# 设置为 0 则禁用金钱兑换
-
MoneyRechargeRCost: 1.0
-
# 一个玩家最多能拥有多少飞行能量?
-
# 1飞行能量代表飞行一方快距离消耗的能量
-
# 如果处在飞行状态的玩家悬浮在原地没有移动,则每秒扣除1飞行能量
-
MaxChargeLevel: 1000
-
# 如果处在飞行状态的玩家悬浮在原地没有移动,则每秒扣除飞行能量的倍增数是多少
-
# 设置为 0 则禁用
-
DeductOnIdling: 1.0
-
# 如果设置的大于 0, 玩家在飞行时将会每秒都损失相应的飞行能量,而非按照飞行距离来计算损失能量
-
# 设置为 0 可关闭此设定并按照飞行距离计算飞行能量损耗
-
DeductOnlyForTime: 0.0
-
AutoRecharge:
-
# 若玩家使用/autorecharge指令开启了自动装填飞行能量,每次增加百分之多少飞行能量
-
From: 10.0
-
# 最大可自动装填多少飞行能量
-
# 25 代表最大可装填 25% 的飞行能量
-
Amount: 25.0
-
# 设置玩家从高处摔下来时扣除的飞行能量
-
# 只在玩家从3格以上高度摔下时有效
-
# 例如,玩家从 10 格高的地方摔下, 那么 (10-3) * 2 = 14 飞行能量将被扣除
-
# 设置为 0 来禁用
-
DeductOnFallMulti: 2
-
# 当玩家从 3 格以上高度摔落,是否产生摔落伤害
-
# 无论玩家从多高摔下来,哪怕从200格高度摔下来,都会给他留1格血,不让他摔死(除非KillOnFall启用)
-
# 如果在摔落过程中关闭飞行,则该机制失效,该摔死还摔死
-
DamageOnFall: true
-
# DamageOnFall 必须先开启
-
# 如果玩家在飞行中途突然关闭飞行模式,是否让他受到伤害
-
DamageOnToggle: false
-
# DamageOnFall 必须先开启
-
# 是否让他摔死
-
KillOnFall: false
-
# 如果此处设定了颜色,当玩家使用飞行能量开始飞行时会开始按照设定颜色发光
-
# 设置为 'none' 则禁用发光
-
GlowColor: none
复制代码
|
大佬专用“致富卡”道具
涉及CMI功能:物品绑定指令,物品编辑,物品保存,特殊指令:权限限制与check检测,CMI变量
随着服务器玩家进入后期,一些老玩家手里拥有大量的金钱,必须想个法子把这些玩家手里的金钱坑出来才行。
不妨新增一款道具,给他取个名字叫“致富卡”,售价500金钱,玩家手持并点击之后,有概率获得0-750之间的任意金钱数额。
为了保护新人玩家不被此物毒害,该物品使用需要以下限制:
1、只有拥有权限“server.vip”的玩家才能使用此物品;
2、有50%概率使用后啥都不出;
3、最终获得的金钱为0-750之间的随机数。
本道具没有恶意影射某论坛的想法。
制作此道具所需的attackcommand指令如下:
(根据联机教程版版规2-13,您可能需要回复此帖才能看到致富卡的指令写法)
用到的机制如下:
-
使用limiteduse参数让物品只能用一次
-
使用特殊指令perm:来检测玩家是否有某权限
-
使用特殊指令check:检测一个CMI随机数变量是否小于50,该随机数取的是0-100之间的一个数,以此做出“50%出货概率”效果
-
使用CMI随机数变量取一个0-750之间的值,作为最终金钱数额
|
皮肤购买与更衣室
涉及CMI功能:更换皮肤
需搭配第三方GUI菜单插件
巧妙使用CMI的指令换肤功能和第三方GUI菜单插件,可以制作出“皮肤商店”并让玩家从中购买皮肤,并在“更衣室”菜单中点击相应皮肤进行更换。
注:本章节教程只提供思路,不会让你必须选择某一款菜单插件,也不会手把手教学
使用第三方GUI菜单插件新建一个
“皮肤商城”
菜单,在其中列入可购买的皮肤按钮,玩家点击相应按钮可以购买皮肤,这个按钮需要有以下特征:
-
按钮材质可以是玩家头颅,名称和lore需要清晰的皮肤介绍。
-
点击此按钮购买皮肤之后,会扣除金钱/点券等,相应货币不够的玩家不能成功点击此按钮。
-
点击此按钮购买皮肤之后,会通过控制台指令给予相应玩家权限,用于在“更衣室”菜单中与相应皮肤按钮交互。
再新建一个
“更衣室”
菜单,在其中列入所有皮肤按钮,玩家点击即可换肤,这个按钮需要有以下特征:
-
按钮材质可以是玩家头颅,名称和lore需要清晰的皮肤介绍。
-
玩家需要拥有之前通过购买皮肤获取的权限才能看到此换肤按钮/与按钮交互。
-
点击此按钮更换皮肤之后,通过控制台执行指令
/cmi skin <该皮肤ID> <玩家名变量>
更换玩家的皮肤。
你可以将这俩菜单均放入玩家的服务器菜单中,同时别忘了在更衣室菜单中加一个移除皮肤的按钮,玩家点击后可触发控制台指令
/cmi skin off
又或者,通过某些菜单插件的层级权限功能,可以将皮肤商城和更衣室合二为一,玩家购买皮肤后原按钮位置即为换肤按钮。
|
“服务器娘”定时清理垃圾
涉及CMI功能:计划任务、清理掉落物
相信玩过一些老生存服的玩家肯定听说过“服务器娘”,她可以定时清理服务器的掉落物,而且即将清理之前还会有倒计时提示。利用CMI提供的计划任务和清理掉落物功能,你就可以自己创造一只萌萌哒的“服务器娘”!
提示:“服务器娘”名称创意来自服务器清理类插件Neverlag,非本人原创。
请打开CMI/schedules.yml计划任务配置文件,新增一个“服务器娘”清理垃圾计划任务,这个计划任务每隔10分钟会触发一次,且每隔1分钟会有actionbar消息提示即将清理,主要使用到的指令为
/cmi groundclean
清理掉落物。
配置如下:
(根据联机教程版版规2-13,您可能需要回复此帖才能看到服务器娘的配置写法)
另需注意:有用户反馈称计划任务循环触发无法生效,经过排查发现问题出在配置文件的Delay设置项上,请务必确保设置项Delay开头的D是大写,循环触发方可生效(部分旧版汉化包中写进去的是小写的delay)
|
木牌商店
第一弹:仿QuickShop收购商店&出售商店
涉及CMI功能:木牌编辑、ic指令绑定、特殊指令:item/moneycost、悬浮字ICON
前面的教程中介绍了CMI的worth和sell指令,玩家只需敲个指令即可卖出背包内的物品换来金钱,现在不如让我们回归传统,按照玩家们熟悉的QuickShop那种使用习惯来处理“卖出物品”操作,玩家到“商店”地点点击相应箱子木牌,可以卖出物品换来金钱,箱子上方还有悬浮物来确定收购物种类,简直就是如假包换的QuickShop商店插件功能。
上面的图片里,木牌上拥有自定义的彩色字符,可以使用
/cmi se
指令进行编辑(如果你不懂这一步怎么做,请翻阅前文的“
点击木牌随机传送
”部分)
上面的图片里,箱子顶端有一个悬浮的南瓜,此为CMI的悬浮字功能,和箱子/木牌本身关系不大(如果你不懂这一步怎么做,请翻阅前文的“
悬浮字
”部分)
本章节教程主要介绍的是“玩家点击木牌即可出售1个南瓜换回10金钱”这个操作,这个需要使用到CMI的ic指令绑定功能,以及特殊指令item.
请使用指令
/cmi ic new <绑定名称>
来新建一个绑定组合,并通过聊天栏编辑给这个组合添加目视方块(也就是箱子上的木牌)以及绑定指令。
在聊天栏的编辑界面点击橙色的小感叹号,并输入以下绑定指令,注意不要加斜杠:
-
item:PUMPKIN-1! asConsole! cmi money give [playerName] 10
此指令中使用到了特殊指令item,玩家点击木牌并执行此特殊指令后,会先尝试扣除玩家背包内的1个南瓜,再给予玩家10金钱(通过asConsole! 特殊指令来通过控制台执行),若玩家背包里没有南瓜,则该指令无法成功执行,玩家无法得到金钱。
现在我们来尝试举一反三一下,如果我让你把这个木牌收购商店改成木牌出售商店,玩家点击木牌即可花费金钱购买物品,你会做吗?
别忘了,特殊指令中也提供了扣除金钱的功能——moneycost。
想改成出售商店,例如玩家点击即可花费114514金钱买一个信标,在聊天栏的ic指令绑定编辑界面点击橙色的小感叹号,并输入以下绑定指令,注意不要加斜杠:
-
moneycost:114514! asConsole! cmi give [playerName] BEACON 1
出售商店中绑定的指令不一定非要用cmi give 指令,可以是saveditems获得已保存物品的指令,cmi kit礼包指令,乃至第三方插件的获得物品指令等等,随你选择。
|
木牌商店
第二弹:PlayerPoints点券也能交易了!
涉及CMI功能:木牌编辑、ic指令绑定、特殊指令:check检测
需搭配PlayerPoints点券插件/或其他支持PlaceholderAPI的货币插件
也许你的服务器里安装了不止一种货币系统,比较热门的例如PlayerPoints点券插件等等,如果我想做到“玩家点击木牌即可花费100PlayerPoints点券购买一个信标”,该怎么办啊?把CMI Wiki特殊指令部分从头到尾翻了一遍都没找到和点券对应的指令啊!
你说的没错,CMI没有提供和点券有关的特殊指令,但这不意味着我们束手无策,我们还有check检测功能可以使用!
开始这一部分教学前,你需要先把PlayerPoints点券插件和PlaceholderAPI变量插件准备好,而且你需要提前下载适用于PlayerPoints的papi变量拓展,在接下来的教程中我们主要会用到这个papi变量:
%playerpoints_points%
(玩家拥有点券数)
如何制作上图所示的木牌以及ic指令绑定怎么用,上一章节里已经讲过了,废话不多说,你需要给该木牌绑定如下两个指令(不加斜杠):
-
check:%playerpoints_points%>=100! asConsole! points take [playerName] 100
-
check:%playerpoints_points%>=100! asConsole! cmi give [playerName] BEACON 1
应该很容易理解吧?两个指令均用到了check检测,检测玩家的点券数量是否大于等于100,如果符合,则执行后续的指令(扣费100点券,获得1个信标)如果玩家点券不够,check检测将直接把玩家拦下,玩家什么都得不到(不会扣费,也得不到物品)
其实,不止是PlayerPoints点券插件,只要是支持PlaceholderAPI变量的,不管什么货币插件都可以使用这个机制。
|
木牌商店
第三弹:反寡头刷钱机制
涉及CMI功能:木牌编辑、ic指令绑定、特殊指令:statement,usermeta机制
生存服务器内的玩家都太过聪明了,他们懂得建造各种复杂的红石机械来快速获得农作物或怪物战利品(例如:全自动甘蔗机、南瓜机、全自动刷怪塔等)使得他们可以通过大量卖出某一种物品来快速刷钱,最终可能造成“寡头”的出现,我想这绝对不是你想看到的。
是时候该让他们醒醒了!现在我将介绍给大家一种“反刷钱机制”来彻底治一治服务器里的经济乱象,例如,服务器里南瓜的收购价格是10金钱1个,当玩家卖出超过10000个之后,他的收购价格立刻变成0.1金钱一个,利益降低至百分之一,将逼得他不得不寻找别的收购产品,但又不会影响到其他新人玩家(新人玩家的收购价格没有变化)。
还是那句话,你不需要安装第三方插件,我只用CMI就能实现这一切!
在正式介绍怎么制作这种木牌商店之前,必须先了解CMI的一种机制:
usermeta机制
。
usermeta你可以理解为为每个玩家专门准备的一种“特殊属性”,一个玩家可以拥有无数个不同名字的usermeta属性,一个usermeta属性可以所有玩家都有但每个玩家都不同,每个属性有自己的值,这些值还可以通过指令修改以及通过PlaceholderAPI变量读取。如果你听不懂这段话在说什么,不妨把usermeta想象为每个玩家的年龄、性别、地址等信息,每个玩家都不同,还可以修改。
你可以使用如下指令设定一个玩家的usermeta,usermeta的值设定成数字或是文字都可以,你可以为一位玩家设定无数个usermeta。
-
/cmi usermeta <玩家名> add/remove <usermeta名称> <值>
- 给玩家添加/移除一条usermeta
-
/cmi usermeta <玩家名> increment <usermeta名称> <增减值>
- 修改usermeta的值,仅适用于数字型值,例如+10/-5等等
-
/cmi usermeta <玩家名> list
- 列出玩家所有的usermeta数据
-
/cmi usermeta <玩家名> clear
- 清空玩家的usermeta数据
此外,你还可以随时调用usermeta相关的PlaceholderAPI变量:
%cmi_user_meta_<usermeta名称>%
,也可随时使用如下指令查询某usermeta的值:
-
/cmi placeholders parse %cmi_user_meta_<usermeta名称>%
★我已经理解usermeta的功能了!可是这和你说的“反刷钱机制”有个毛关系啊?
别急,我马上就告诉你如何来做出这种带有反刷钱机制的木牌商店,为了更好地理解玩家点击了“反刷钱机制”木牌商店后发生了什么,不如我们一步一步分析:
-
玩家点击了一个收购南瓜的“反刷钱机制”的木牌商店,
-
如果玩家是新人玩家(没有卖出超过10000个南瓜)。扣除他背包里1个南瓜并给予他10金钱,
-
如果玩家是寡头玩家(已经卖出过10000个南瓜了),扣除他背包里1个南瓜并给予他0.1金钱。
那该如何判断一个玩家卖出过多少个南瓜了呢?锵锵!我们之前学过的
usermeta机制
将于此时闪亮登场!
现在我们重新理解一下上面的分析步骤:
-
玩家点击了一个收购南瓜的“反刷钱机制”的木牌商店,判断他的一个usermeta数据超过10000了没有,
-
如果没有超过10000,那么这个玩家是新人玩家,扣除他背包里1个南瓜并给予他10金钱,
-
同时,要给这位新人玩家这个usermeta数据加1,表示他已经卖出过1次了,
-
如果超过10000了,那么这个玩家已经成为寡头玩家,扣除他背包里1个南瓜并给予他0.1金钱。
现在理解了吗?
要实现这个区分,我们要用到一种特殊指令:
statement
,以下就是在制作该“反刷钱机制”木牌商店时绑定的四条指令,刚好对应上文中的四条分析
(根据联机教程版版规2-13,您可能需要回复此帖才能看到相关四条绑定指令)
其中用于记录玩家卖出过多少次南瓜的usermeta名称为
level
,用于判断玩家类型的statement特殊指令名称为
shop
,这两个名称你可以自己指定。关于statement特殊指令的格式,不妨参考本文上方的“
特殊指令
”章节。
|
PVP与武神升级系统
涉及CMI功能:eventCommands事件触发指令,usermeta机制,特殊指令:check检测,CMI变量
PVP是玩家之间竞争性很强的对抗活动,利用CMI提供的一些机制,可以给PVP新增一个残酷的“积分”系统,击杀者可以加分,而被杀者将被减分,通过PVP不断击杀而积分达到一定水平的玩家可以获得很多特殊的权利(例如购买更高级武器的权限等等)
其实这个机制使用CMI提供的Ranks升级系统也是能做的,但本教程的残酷之处在于:在PVP中被击杀的玩家将被倒扣PVP积分(或其他惩罚),可谓是残酷的零和游戏了。
阅读本章节教程前请确保自己已经认真阅读了上一章
《木牌商店第三弹:反寡头刷钱机制》
并理解了usermeta的用法。
CMI提供了服务器内产生一些事件时触发控制台指令的机制,请参考CMI/eventCommands.yml 配置文件。
请找到
playerKillPlayer:
这一设置项,这一设置项即为“玩家击杀玩家时触发的控制台指令”,可以使用的变量包括:[playerName]被杀者,[sourceName]击杀者
按照上一章节教程中介绍的usermeta的用法,不妨我们新建一个叫“
pvpscore
”的usermeta名称,当玩家击杀玩家这一事件发生时,给击杀者这个数据加1,给被杀者减1(你也可以设置为不对等加减分,例如击杀+5,被杀-2这种,或者被杀不扣分,改为其它方式惩罚等等)
-
playerKillPlayer:
-
Enabled: true
-
Commands:
-
- cmi usermeta [sourceName] increment pvpscore +1
-
- cmi usermeta [playerName] increment pvpscore -1
复制代码
若你之前没有设置过这个usermeta,则该usermeta数据默认为0,如果你想给每一位新人玩家设置一个基础值,也可以在CMI/Settings/EventCommands.yml 里设置:
如下,每一位新进服的玩家将获得名为
pvpscore
的usermeta数据,基础值100。
-
firstJoinServer:
-
Enabled: true
-
Commands:
-
- cmi usermeta [playerName] add pvpscore 100
-
- ...其它第一次进服可触发的指令?
复制代码
随着玩家在不断的PVP之中斩杀无数,pvpscore的积分将会越来越高,此时,可以设置一些PVP大佬专用的“武神礼包”供玩家领取,或是一些特殊的商店,供玩家购买特殊的武器道具等。
例如我想制作一个木牌商店,只有pvpscore数据超过1919的玩家可以在此花费10000金钱买到一把下界合金剑,我就可以在木牌商店里写上下面这个指令:
(根据联机教程版规2-13,您可能需要回复此帖才能看到此木牌商店指令)
|
|
|
|
CMI插件拥有数百个权限,部分权限甚至涉及了Minecraft原版机制,没有任何权限的玩家在服务器里将寸步难行,作为一个生存服务器,我们当然要把合适的权限分配给玩家,使得玩家可以互相交易金钱、互相传送等等。同时,CMI还提供了一些稍高级的权限,可以用来作为分配给氪金VIP玩家的特权等。合理使用权限来管理、分化玩家,有助于提升玩家的游戏体验,也会让羡慕VIP特权的玩家氪金欲望大大提升。
笔者将建议分配给玩家的权限分为三类,主观性很强,仅供参考:
普通权限:
玩家基础权限,建议把此类权限给予全部玩家
cmi.bedhome - 玩家点击床即可在此位置设家
cmi.elevator.use – 使用木牌电梯
cmi.autorespawn - 死亡后跳过死亡界面直接重生
cmi.chorusteleport - 吃掉紫颂果可以随机传送(原版特性)
cmi.deathlocation - 死亡后可以看到死亡位置
cmi.command.afk.auto - 自动进入AFK离开状态
cmi.command.warp.<地标名> - 传送至地标(若设置了权限)
cmi.command.sethome - 使用sethome指令设置家
cmi.command.sethome.<最大数量> - 设置家的最大数量
cmi.command.back.ondeath - 使用back指令回到死亡地点
cmi.command.afk - 使用指令进入AFK离开状态
cmi.command.back - 使用back指令
cmi.command.balance - 使用balance指令查看金钱
cmi.command.baltop - 使用baltop指令查看金钱排行榜
cmi.command.dback - 使用dback指令回到死亡地点
cmi.command.dispose - 使用dispose指令打开垃圾桶
cmi.command.helpop - 使用helpop指令向在线管理员求助
cmi.command.home - 使用home指令回家
cmi.command.homes - 使用homes指令查看家列表
cmi.command.ignore - 使用ignore指令无视某个玩家
cmi.command.msg - 使用msg指令发送私聊
cmi.command.nick - 使用nick指令设置昵称
cmi.command.pay - 使用pay指令支付金钱
cmi.command.ping - 使用ping指令
cmi.command.playtime - 使用playtime指令查看在线时长
cmi.command.playtimetop - 使用playtimetop指令查看在线时长排行榜
cmi.command.rankinfo - 使用rankinfo指令查看当前rank信息
cmi.command.ranklist - 使用ranklist指令查看所有存在的rank
cmi.command.recipe - 使用recipe指令查看某物品的合成配方
cmi.command.removehome - 使用removehome指令移除家
cmi.command.sell - 使用sell指令卖出背包内物品
cmi.command.spawn - 使用spawn指令回到主城
cmi.command.suicide - 使用suicide指令
cmi.command.tpa - 使用指令tpa传送至其他玩家
cmi.command.tpaccept - 使用指令tpaccept接受传送请求
cmi.command.tpahere - 使用指令tpahere请求其他玩家传送至自己
cmi.command.tpdeny - 使用tpdeny指令拒绝传送请求
cmi.command.worth - 查询手上物品的价值
cmi.command.worthlist - 查询所有物品的价值
|
基础特权:
此类权限请酌情给予全部玩家,或仅给予少数特权玩家,玩家也许需要付出一定代价才能获得这些权限(例如:氪金购买 等)
cmi.anvil.colors - 使用铁砧命名物品时允许彩色命名
cmi.colors.[文字来源].[颜色代码/hex] - 允许在一些输入文字的地方使用彩色符号
[文字来源]可选:公聊publicmessage, 私聊privatemessage, 昵称nickname, 木牌编辑signs, 成书内容books, 消息me
[颜色代码]设置为 * 代表所有颜色
cmi.elytralaunch - 使用鞘翅原地充能发射功能
cmi.randomteleport.cooldownbypass - 随机传送时无视冷却时间
cmi.inventoryhat - 可直接从背包里拖拽物品放到头上
cmi.kit.<礼包名> - 获得kit礼包
cmi.rank.<Rank等级名> - 玩家的默认等级
cmi.elytra - 装备鞘翅
cmi.elytra.boost - 右键点击使用鞘翅加速
cmi.elytra.superboost - Shift+右键点击使用鞘翅超级加速
cmi.elytra.speedometer - 在鞘翅飞行之时显示速度表
cmi.keepinventory - 死亡不掉落物品
cmi.keepexp - 死亡不掉落经验
cmi.informDurability - 物品耐久值快爆掉时收到提醒
cmi.command.afk.kickbypass - 进入AFK离开模式后不会因为长时间不动而被踢出
cmi.command.tpa.warmupbypass - 使用tpa指令传送时无延迟
cmi.command.tpahere.warmupbypass - 使用tpahere指令传送时无延迟
cmi.command.mail - 使用指令操作邮件
cmi.command.mail.read - 阅读邮件
cmi.command.mail.clear - 清空邮件
cmi.command.mail.send - 发送邮件
cmi.command.sit.stairs - 坐上椅子
cmi.command.anvil - 使用指令打开铁砧界面
cmi.command.cartographytable - 使用指令打开制图台
cmi.command.cheque - 制作支票
cmi.command.ender - 使用指令打开末影箱
cmi.command.grindstone - 使用指令打开砂轮
cmi.command.hat - 将手上的物品戴到头上
cmi.command.loom - 使用指令打开织布机
cmi.command.me - 使用me指令发送消息
cmi.command.near - 使用near指令查看附近的玩家
cmi.command.rt - 使用指令rt随机传送
cmi.command.scavenge - 使用scavenge指令进行附魔书回收
cmi.command.silence - 使用silence指令完全屏蔽公共聊天
cmi.command.smithingtable - 使用指令打开锻造台
cmi.command.stonecutter - 使用指令打开切石机
|
高级特权:
此类权限有破坏服务器平衡的可能,若确有需要,可将其给予极少数特权玩家。
cmi.seevanished - 允许看到隐身玩家
cmi.messages.disablelogin - 不显示上线消息
cmi.messages.disablequit - 不显示下线消息
cmi.fullserver.bypass - 无视服务器最大人数进服
cmi.kit.bypass.money - 在获得必须花费金钱才能获得的礼包时,不需花费金钱
cmi.kit.bypass.exp - 在获得必须花费经验才能获得的礼包时,不需花费经验
cmi.spawnonjoin.bypass - 若服务器已开启进服时强制在主城登录,无视此限制
cmi.dropspawner - 挖掉刷怪笼之后掉落刷怪笼方块
cmi.dropspawner.<实体名> - 挖掉刷怪笼之后掉落刷怪笼方块(具体实体)
cmi.egginteract.<实体名> - 使用刷怪蛋修改刷怪笼(具体实体)
cmi.placespawner - 放置刷怪笼
cmi.placespawner.<实体名> - 放置刷怪笼(具体实体)
cmi.costbypass.<指令名> - 若一个指令需要付费,无视付费
cmi.cooldownbypass.<指令名> - 若一个指令有冷却时间,无视冷却时间
cmi.command.walkspeed.<最大速度0-10> - 使用指令设置行走最大速度
cmi.command.ride - 骑上实体
cmi.command.ride.<实体名> - 骑上实体(具体实体)
cmi.command.maintenance.bypass - 若服务器正处于维护模式,无视维护模式并进服游戏
cmi.command.feed - 使用feed指令恢复饥饿值
cmi.command.findbiome - 使用findbiome指令找到最近的某个生物群系
cmi.command.fly - 使用fly指令开启飞行
cmi.command.flyspeed - 使用flyspeed指令设置飞行速度
cmi.command.heal - 使用heal指令治疗自己
cmi.command.merchant - 使用merchant指令直接调出村民交易界面
cmi.command.notarget - 使用notarget指令取消怪物对自己的仇恨
cmi.command.repair - 使用repair指令修理手上的物品
cmi.command.vanish - 使用指令vanish隐身
|
其余权限为不建议给玩家的管理员权限,可至
权限Wiki
查看更多信息。
|
|
|
当我们把服务器的大框架整齐全以后,玩家们也开始陆陆续续进服游戏了,作为服务器的管理者,你可能想随时知道你的玩家们在做什么,有没有干一些鸡鸣狗盗的事情,对于一些恶劣的玩家,也要即时出以重拳,使用各种程度的惩罚让他们知道厉害,同时也保障正常玩家的游戏体验。
OP隐身、巡逻和监视
涉及CMI功能:隐身与隐身编辑,巡逻,指令监视
身为拥有服务器大权的服务器管理员(OP),虽然掌控玩家们的动态很重要,但若是过分介入玩家的游戏活动,只会惹人生厌而已,因此我建议所有拥有服务器OP权限的人应该学会“隐藏”自己,无论是OP玩家的实体还是Tab列表还是别的什么地方,最好不留下一点存在痕迹,以免让玩家觉得不适,同时也可以钓出那些自认为OP不在而胡作非为的玩家。
★OP隐身与隐身编辑
进入隐身状态的指令为
/cmi vanish
,但实际上CMI提供的隐身功能远远比让别的玩家看不见你要多得多,可以使用指令
/cmi vanishedit
进入如下隐身编辑界面:
在这个隐身编辑界面里,可以看到CMI提供了很多有用的隐身特性,而且都可以设置开/关:
-
总是以隐身模式进服
-
静默打开箱子(不会有开箱动画)
-
自动获得夜视效果
-
无法捡起物品(避免被发现端倪)
-
怪物不会在周围生成
-
无视夜晚睡眠加速计数
-
进入隐身状态后显示假的下线消息(专门钓玩家)
同时隐身后的玩家也会在Tab列表里消失。
★在金钱排行榜里消失
请打开CMI/config.yml并找到如下设置项,可在此处添加管理员的玩家ID,以将其排除出金钱排行榜。
-
BalTop:
-
# 玩家金钱排行榜上不会显示下列玩家的金钱数量,适合把OP添加到这里
-
Exclude:
-
- Notch
复制代码
★OP巡逻玩家
CMI提供了一个指令
/cmi patrol
,当OP进入隐身状态后,多次使用此指令可以挨个传送到每个在线玩家旁边,偷看玩家们在做什么,以此发现作奸犯科的玩家。
★指令监视
CMI提供了玩家指令监视的功能,且最新版本的CMI将其整合进了一个可视化GUI菜单中,可以偷看到玩家们的私聊内容以及指令使用情况。
可使用指令
/cmi options
打开相关设置项菜单,设置指令监视。
|
聊天脏话过滤与防广告机刷屏
涉及CMI功能:聊天过滤ChatFilter
也许你的服务器里会时常有一些玩家嘴巴不干净,脏话连篇,也许你的服务器里会时常有广告dog来打广告,CMI提供了聊天过滤功能来帮你赶走这些恼人的家伙。
聊天过滤的功能可以在CMI/Settings/ChatFilter.yml文件里设置,关于需要过滤的聊天内容,配置注释如下:
你可以利用正则识别玩家发的内容,并设置该信息是否可被其他玩家看到,以及过滤后可触发什么控制台指令等。
-
ChatFilter:
-
Enabled: true
-
Deny:
-
ipBlock:
-
# 启用聊天过滤
-
Enabled: true
-
# 设置需要过滤聊天的组名,且只有拥有此权限才能无视过滤: cmi.chatfilter.bypass.[组名]
-
Group: Advertising
-
# 设置为 true, 每次玩家触发过滤, 控制台将记录玩家名称,违反的过滤规则以及聊天内容
-
InformConsole: true
-
# 发送什么内容会触发过滤,更多信息请访问 https://regexone.com/
-
Regex:
-
- '[a-zA-Z0-9\-\.]+\s?(\.|dot|\(dot\)|-|;|:|,|_|\/)\s?([a-zA-Z]{2}|aero|asia|biz|cat|com|coop|edu|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel)\b'
-
- \b[0-9]{1,3}(\.|dot|\(dot\)|-|;|:|,|(\W|\d|_)*\s)+[0-9]{1,3}(\.|dot|\(dot\)|-|;|:|,|(\W|\d|_)*\s)+[0-9]{1,3}(\.|dot|\(dot\)|-|;|:|,|(\W|\d|_)*\s)+[0-9]{1,3}\b
-
# 需要将过滤的内容更换为什么内容?
-
ReplaceWith: ''
-
# 可选: none, orhers, all
-
# 'none' 代表所有人都将收到此消息
-
# 'others' 代表只有发聊天的人能看到聊天消息,其他玩家看不到,适合静默阻止发广告的玩家
-
# 'all' 代表没人能看到消息
-
BlockType: others
-
# 开启此项,私聊内容也会被过滤
-
includePrivateMessages: true
-
# 有权限 cmi.chatfilter.inform 的玩家,当有玩家发了需要被过滤的内容时,会收到如下提示
-
msgToStaff: '&4!&6[playerName] &4广告dog正在打广告: &r[message]'
-
# 当有玩家发了需要过滤的消息时,执行的控制台指令,可使用 [senderName] 指代发消息的玩家
-
# 可设置将其踢出,等等
-
Commands: []
复制代码
ChatFilter.yml同时提供了聊天内容替换的功能,可将玩家发言中的被过滤内容替换成其他预设的内容(类似某MC论坛可以把“你母亲”发言替换为“我母亲”)玩家端效果如下图所示:
同时,为了防止一些机器人广告机玩家在服务器聊天栏里用大量相同/相似内容刷屏,ChatFilter.yml提供了相似内容屏蔽机制,配置如下:
-
DuplicatedMessagePrevention:
-
# 阻止玩家短时间内发送大量相同内容刷屏,有此权限的玩家无视此限制 cmi.chatfilter.spambypass
-
Use: false
-
# 两条消息中有百分之多少的字符相似则判定为“相同的内容”
-
Percentage: 80
-
# 你只能每隔多少秒才能发送相同的内容
-
Interval: 5
-
# 若一个指令还在冷却中,你最多能重复执行此指令多少次?
-
MinAmount: 2
复制代码
|
禁言与封禁
涉及CMI功能:禁言,封禁
对于作奸犯科的玩家,我们有很多手段予以惩罚,比较经典的惩罚手段就是禁言(mute)和封禁(ban)
有关禁言的指令如下,其中CMI还提供了shadowmute静默式禁言功能:
-
/cmi mute <玩家名> [时间] [-s] [原因]
暂时禁言玩家
-
/cmi unmute <玩家名>
解除禁言
-
/cmi mutechat [时间] [-s] [原因]
暂时全服禁言
-
/cmi unmutechat
解除全服禁言
-
/cmi shadowmute <玩家名> [时间] [-s] [原因]
暂时禁言玩家,但玩家不知道自己被禁言,依然可以正常发送消息,只是消息别人根本看不到
有关封禁的指令如下,其中封禁也可以规定时限:
-
/cmi ban <玩家名> [-s] [原因]
永久封禁玩家
-
/cmi banlist
查看封禁列表
-
/cmi checkban <玩家名>
查询某玩家是否被封禁
-
/cmi ipban <IP/玩家名> [-s] [原因]
永久封禁玩家IP
-
/cmi ipbanlist
查看封禁IP列表
-
/cmi tempban <玩家名> <时间> [-s] [原因]
暂时封禁玩家
-
/cmi tempipban <IP/玩家名> <时间> [-s] [原因]
暂时封禁玩家IP
|
监狱
涉及CMI功能:监狱
对于作奸犯科的玩家,你还可以通过将其打入大牢的方式来惩罚他们,玩家在刑期结束之前只能待在牢房里,牢房有预设好的“边界”,哪怕逃出监狱区域也只会瞬间传送回监狱而已。
不妨在服务器中建造一个“监狱”,使用工具(默认为木锹)左键右键方块来选出一个长方体区域,之后可输入指令
/cmi jailedit addjail <监狱名>
来创建这个监狱。一个监狱里可以新增多个“牢房”(即传送点),可站在监狱区域的选定位置并在聊天栏-编辑牢房列表 里进行编辑。如下图,是一间牢房的样子:
和监狱相关的指令如下:
-
/cmi jail <玩家名> [时间] [监狱名] [牢房序号] [-s] [r:入狱理由]
将玩家打入监狱
-
/cmi unjail <玩家名>
让玩家离开监狱
-
/cmi jailedit
编辑监狱
-
/cmi jaillist
列出监狱列表
和监狱相关的设定,请在CMI/config.yml寻找相关设置项:
-
Jail:
-
# 每过多少毫秒检查玩家是否逃出监狱范围
-
# 设置的大一点可以减少服务器负担
-
CheckInterval: 500
-
# 如果把玩家关进监狱时没有指定时间,默认的时间是?
-
DefaultTime: 300
-
# 当玩家在监狱里时聊天可被多少半径的玩家听到
-
# 设置为 0 则聊天没有范围限制
-
# 设置为 -1 则禁止聊天
-
ChatRange: 20
-
# 设置为 true 监狱服刑时间包括离线时间
-
# 设置为 false 只有在线时间算进服刑时间
-
CountWhileOffline: false
-
# 设置为 true 监狱服刑时间包括离开(AFK)时间
-
# 设置为 false, 则不包括
-
NoAfk: false
-
# 当玩家正在监狱服刑,是否让其避免一切伤害
-
PreventDamage: true
-
# 当玩家正在监狱服刑,是否让其避免饥饿
-
PreventHunger: true
-
# 允许在监狱里执行的指令
-
WhiteListedCmds:
-
- cmi msg
-
- cmi reply
复制代码
由于在监狱中玩家使用指令会受到限制,所以需考虑到玩家在服刑期间登录时可能要敲指令输密码的情况,请把玩家登录时可能需要使用的指令添加进
WhiteListedCmds:
列表(例如Authme-Reloaded的/login 或者/l 指令)
|
[小游戏]
监狱寻宝大作战
涉及CMI功能:监狱
需搭配命令方块/第三方脚本方块插件
本游戏是利用CMI提供的“监狱”机制衍生出的小游戏,本身与监狱和惩罚无关。
你和其它玩家在一片死气沉沉的建筑物中醒来,这片区域被一片神秘的结界包围,无论从哪里尝试出去最终只是传送回原地而已。
通过一些零碎的资料,你了解到这里是PCD服务器里早就废弃的监狱,而你在阴差阳错下不小心进入了监狱的结界之中,现在你唯一能做的只有——寻找线索,离开监狱。
游戏的建筑场景以破败的建筑物为主,某些地方甚至需要跑酷才能到达,玩家要不断探索整个建筑,尝试与方块进行多种不同形式的交互才能最终触发逃出去的密码,而且说不定还能获得令人惊喜的宝藏...
注:本章节教程只提供思路。
CMI提供的“监狱”功能其实非常适合用来做场地小游戏,得益于以下几个特点:
-
自带边界,监狱内玩家无法跑到监狱外
-
游戏时间限定(即刑期)
-
不同玩家可有不同的游戏开始点(即“牢房”位置)
-
防作弊机制(刑期内玩家只能使用限定的指令,且刑期恒定,也无法通过遁下线来消极游戏)
所以如果把思路打开,还是能想到不少有趣的小游戏创意的,这里我就给大家介绍一个有趣的
“监狱寻宝大作战”
小游戏的制作方法,本章节教程只提供思路,不会手把手教学。
请按照上一章教程来新建一个“监狱”区域,该区域应纳入整个游戏用地图建筑。游戏用的地图建筑最好能包含红石解谜或者跑酷元素,且不需要特地做围栏防止玩家跑出去(玩家尝试跑出去只会传送回原牢房位置)
请按照教程在监狱中设定数个“牢房”,此即为玩家的游戏开始点,玩家在游戏中若尝试跑出结界也会被传送回此点。
可通过服务器GUI菜单执行指令或者让玩家点击ic指令木牌等方法,来执行指令让玩家“进入监狱”(即进入游戏),不同的触发指令可以指向不同的监狱牢房(即游戏开始点)当然,只设一个游戏开始点也可以。玩家进入监狱以后会有一个刑期,可以设置的尽量长一些,玩家的游戏目标为找到方法提前出狱并获得最终宝藏,若始终找不到,把漫长的刑期熬完以后也可以出狱。
关于进入游戏并选择游戏开始点(即牢房),假如我想制作一个ic指令木牌,玩家点击以后有50%几率传送到监狱牢房1,有50%几率可以传送到监狱牢房2,我可以给木牌绑定如下指令:
-
statement:jail_start! check:%cmi_random_0_100%>=50!
-
if:jail_start!@ ifempty:inv! asConsole! cmi jail [playerName] 2h jail 1 -s
-
if:jail_start!
ifempty:inv!
asConsole! cmi jail [playerName] 2h jail 2 -s
这几条指令创建的游戏时间(刑期)为2h,所传送到的监狱名称为jail,且有两个牢房点1和2,且要求玩家必须清空背包才能进入游戏(为了防止使用末影珍珠等作弊)如果你不理解ic指令木牌的做法,或不理解这些指令是什么原理,请参考本帖子的
“点击木牌随机传送”
和
“特殊指令”
章节。
之后,你可以在游戏场景地图内设置如下可交互元素,让玩家在探索监狱时触发,可以使用红石-命令方块触发,ic指令绑定方块触发,或者
脚本方块
触发等等:
-
[BUFF]
交互后获得增益性药水效果,例如触发以下指令可以给玩家跳跃提升I 60秒,帮助玩家越过高难度跑酷。
-
/cmi effect [playerName] jump 60 1
-
[DEBUFF]
交互后获得debuff药水效果,适合作为陷阱触发,例如触发以下指令可以给玩家反胃效果 60秒,干扰玩家。
-
/cmi effect [playerName] confusion 60 1
-
[传送回原地]
交互后直接传送回监狱游戏出发点并重置刑期,适合作为陷阱设置在玩家已经跑酷了半程的道路上(恶毒)
-
/cmi jail [playerName] 2h jail 1 -s
-
[强行退出]
若玩家不想玩了,交互触发此指令后强行退出游戏并传送离场,但也会错过最后的奖励。
-
/cmi unjail [playerName]
-
/cmi spawn [playerName]
-
[最终大奖]
交互后获得最终大奖,并使得玩家退出游戏并传送离场,适合设置在游戏地图的终点,唯一需要注意的是需要使用变量检测来只让正在服刑的玩家才能交互,不在服刑期内的玩家即使交互了也获得不了。
-
check:%cmi_user_jailed%! asConsole! <给予奖励的指令>
-
/cmi unjail [playerName]
-
/cmi spawn [playerName]
为了防止玩家通过设家,tp等方式作弊,请务必保证玩家在服刑期间不能使用相关指令(具体可在配置文件中的
WhiteListedCmds:
里设置)
为了防止玩家之间互相交流以便知道陷阱在哪个位置,可在配置文件中找到
ChatRange:
并设置为0,来使得服刑玩家间不能相互交流。
|
|
|
|
总论
涉及CMI功能:Ranks
Ranks是CMI提供的一种“升级”机制,玩家需要通过完成一系列预设任务来一步一步升级,升级后的玩家可以获得更多权限、奖励等等。
大部分服务器将Ranks用于制作“军衔系统”。
注:本章节教程迁移来自CMI搬运贴。
在使用此特性之前,请至服务端根目录下的spigot.yml中,确认stats -> disable-saving是false
-
stats:
-
disable-saving: false
-
forced-stats: {}
复制代码
每个玩家都有自己的“级别”,玩家可以通过完成一系列任务,达到一系列要求来提升自己的“级别”
与“级别”相关的配置在插件文件夹的
Ranks.yml
里,你如果编辑了这个文件,
要重启服务器来让它生效而非使用reload指令
。
请参考以下注释来配置CMI/Settings/Ranks.yml,需要注意的是你最好不要动默认的那个级别
-
Newbie:
-
# 启用此级别?
-
Enabled: true
-
# 该级别的名称,此名称可作为聊天头衔显示在聊天里
-
DisplayName: "&aPCD新手"
-
# 该级别是默认级别?建议把第一个级别设置为默认级别,每个玩家进服后都会自动获得默认级别
-
DefaultRank: true
-
# 自动升级,当玩家达到全部升级条件后会自动升级?
-
AutoRankup: true
-
# 下一级,你可以设置多条支线,来让玩家自己选择要升级的方向
-
NextRanks:
-
- Branch1
-
- Branch2
-
Branch1:
-
# 启用此级别?
-
Enabled: true
-
DisplayName: "&6PCD搬运大佬"
-
AutoRankup: true
-
# 升级至此级别之前需要二次确认?
-
# 这是为了防止玩家稀里糊涂就升级到了不想要的等级
-
RankupConfirmation: true
-
# 升级至此级别需要被投多少票?
-
# 其他玩家可使用/cmi votes来给你投票
-
Votes: 5
-
# 升级至此级别需要什么权限?
-
# 冒号后面是该权限在需求列表里显示的内容
-
PermissionRequirement:
-
- "cmi.command.fly:Fly"
-
# 升级至此等级需要什么MCMMO技能及其等级?
-
McMMORequirement:
-
- "woodcutting:10"
-
- "power:20"
-
# 升级至此等级需要什么Jobs职业及其等级?
-
JobsRequirement:
-
- "miner:10"
-
- "totallevel:20"
-
# 升级至此等级需要背包里准备哪些物品及其数量?
-
ItemRequirement:
-
- "stone:10"
-
- "stone:1:20"
-
- "book:20"
-
NextRanks:
-
# 下一级,你可以设置多条支线,来让玩家自己选择要升级的方向
-
- Branch1Rank1
-
# 升级至此等级需要花费的金钱
-
MoneyCost: 100
-
# 升级至此等级后执行的控制台指令
-
Commands:
-
- "broadcast! &6[playerDisplayName] &e刚刚成为了PCD搬运大佬!"
-
# 其它需要达到的统计条件,请参帖子内教程
-
StatsRequirements:
-
- "PlayTime:3600"
-
- "travel:1000"
-
- "MonsterKills:zombie:10"
-
- "MonsterKills:slime:5"
-
- "MonsterKills:wolf:5"
复制代码
然后呢,玩家使用
/cmi rankinfo
可以查看自己当前的级别以及接下来可以升级到哪些级别。
如下图,玩家当前级别是“PCD新手”,玩家可以升级为“PCD搬运大佬”或者“PCD开发大佬”,二者选其一。
点击“下一级”里的级别可以查看想升级到此级别还需要什么条件:
你在ranks.yml里编辑级别时可以在StatsRequirements里设置其它升级所需条件,请至原
Wiki
看查看所需条件的写法。
级别的名称可设置在聊天中显示,首先需安装PlaceholderAPI前置,并且搞清楚级别的变量是
%cmi_user_rank%
(更多变量请参
这里
)打开CMI/Settings/Chat.yml,先启用本插件的聊天机制(ModifyChatFormat -> true)然后在聊天格式里写上级别变量即可
-
Chat:
-
# 按照本插件的格式显示聊天内容
-
ModifyChatFormat: true
-
# 聊天格式,可用变量: {prefix} {suffix} {group}. 支持 PlaceHolderAPI 变量,例如 %player_server%
-
GeneralFormat: '&f[&r%cmi_user_rank%&f]{displayName}&7: &r{message}'
复制代码
|
“游客世界”与“正式玩家世界”
涉及CMI功能:Ranks,重生处理
你的服务器无法挑选进服游戏的玩家,总有些玩家进服玩了几分钟后觉得无趣就离开了,然而,这些游客玩家却会在你的服务器世界中留下一堆“垃圾痕迹”:主城周围乱七八糟的地形破坏、毫无卵用的火柴盒、甚至还会拆毁其他老玩家苦心建筑的房子等等,可谓让人头疼。
现在我提出一种解决办法:设置两个生存世界,分别取名为“游客世界”和“正式玩家世界”,所有玩家刚进服均出生在“游客世界”,只有玩家完成一些生存任务之后(例如在线超过2h,杀死了20只僵尸,行走距离超过2000m了)才可以判断这个玩家“有可能一直在服里玩下去”这时才给他开放去“正式玩家世界”的权限,让他在那里和“正式玩家”们一起愉快生活。
你的理解没错,“游客世界”就是挡在垃圾游客玩家和正常游戏玩家之间的屏障,可以随时换档,把这些游客玩家的垃圾痕迹一并抹去。
要实现两种世界的区分,首先当然两种玩家也要区分开来,请在您的权限插件里设置两种权限组,一种为“游客玩家”,一种为“正式玩家”。
“游客玩家”为默认组,拥有极其受到限制的权限数量,诸如设家、地标传送、tp等权限都可以不给。“正式玩家”的权限组等级稍高,拥有一切正常游戏所需的权限。
“游客玩家”和“正式玩家”的重生地点必须不同,“游客玩家”只能在游客世界重生,以避免其乱跑。
站在地图内相应位置输入指令
/cmi setspawn true -g:<组名>
可以为某一组玩家设置重生点,玩家拥有下列权限可以在此处出生/重生:
-
cmi.spawngroup.<组名>
-
cmi.respawngroup.<组名>
紧接着,要开始设置Ranks,默认的级别当然是“游客玩家”,他们要完成一系列任务才能被认作是“正试玩家”(即Ranks升级)
-
游客玩家:
-
Enabled: true
-
DisplayName: '&2游客玩家'
-
DefaultRank: true
-
AutoRankup: true
-
NextRanks:
-
- 正常玩家
复制代码
再设置“正式玩家”的Ranks以及达成此级别需要什么条件(在下面的例子中,条件为:玩游戏3600秒,移动超过1000格,击杀僵尸10只)
-
正常玩家:
-
Enabled: true
-
DisplayName: '&a正常玩家'
-
AutoRankup: true
-
RankupConfirmation: true
-
NextRanks:
-
- 如有必要可以继续新增别的级别
-
- 如没有必要,则把这个NextRanks删掉
-
Commands:
-
- broadcast! &6[playerDisplayName] &e已升级为正常玩家
-
- asConsole! <给玩家升级权限组的指令>
-
# 所需条件:玩游戏3600秒,移动超过1000格,击杀僵尸10只
-
StatsRequirements:
-
- PlayTime:3600
-
- travel:1000
-
- MonsterKills:zombie:10
复制代码
“游客玩家”达成这些条件之后便可自动升级为“正式玩家”,并在更加安全的“正式玩家世界”获得更完整的游戏体验。
|
|
|
|
总论
涉及CMI功能:自定义指令简写
如前文介绍,CMI提供了“指令简写”来抹去指令前面的cmi前缀,比如/cmi back可以简写成/back,让玩家更易记易用。通过指令简写功能,复杂的指令可以变得简单便捷,但实际上CMI的指令简写功能相当强大,远远比抹去cmi前缀要更加厉害,你可以自定义你想执行的指令,使用拼音乃至中文来写指令,添加Tab补全,做到很多想都想不到事情!
在总论中,我将用三种方式给服务器添加一个新指令:
/zhiliao <治疗血量>
玩家执行此指令后,可以给自己治疗一定血量。
第一种方法:游戏内编辑
请在游戏内输入指令
/cmi aliaseditor
然后点击绿色新建符号并输入新的指令简写 zhiliao,请注意不需要加斜杠
再点击“新建”按钮输入指代的原版指令即可,此处我使用的指令是
cmi heal [playerName] $1-
,其中[playerName]变量指代的是执行玩家名称,$1-指代的是在此简写指令后面添加的参数(治疗血量)也会被应用进原版指令的参数里。
第二种方法:游戏内指令一步生成
可以直接通过游戏内指令一步生成自定义指令简写,不需要像上一个方法里那样一步一步点按钮,指令为:
/cmi aliaseditor new <指令简写>-<原指令> [其余变量]
比如
/cmi aliaseditor new zhiliao-cmi heal [playerName] $1-
执行效果同第一种方法。
第三种方法:配置文件编辑
自定义指令简写默认保存在CMI/CustomAlias/CustomAlias.yml配置文件里,可直接打开此文件进行编辑(你还可以指定其他文件用来保存):
-
CustomAlias:
-
zhiliao:
-
Cmds:
-
- cmi heal [playerName] $1-
复制代码
此外,由于新增的指令不被Bukkit识别,输入指令时可能会标红并显示“发现未知或不完整指令”,可在游戏内编辑指令时点开
新增Tab补全
,或者在配置文件编辑时新增一行:
|
有奖竞猜
涉及CMI功能:自定义指令简写,计划任务,特殊指令
PCD服务器每天都会在聊天栏滚动播放一道题目,玩家们只要知道正确答案,输入指令/jingcai <答案> 答对问题即可获得精美奖品,奖品只能领取一遍,答错题目的玩家没有奖励。
在聊天栏滚动播放这道题目使用的是CMI的
计划任务
机制,如果你不理解这一步,请参阅上文的
从“滚动公告”讲起
用于展示题目的计划任务配置如下,每隔600秒会在聊天栏滚动播放一次:
-
jingcai:
-
Enabled: true
-
Delay: 600
-
Repeat: true
-
Commands:
-
- broadcast! &a[有奖竞猜]&e大家好,今天的有奖竞猜来啦!
-
- broadcast! &a[有奖竞猜]&e请大家竖起耳朵听好今天的有奖竞猜题目喔~
-
- broadcast! &a[有奖竞猜]&e今天的问题是:
-
- broadcast! &a[有奖竞猜]
-
- broadcast! &a[有奖竞猜]&f MCBBS联机类优秀小组PCD是哪一年成立的?(4位数字)
-
- broadcast! &a[有奖竞猜]
-
- broadcast! &a[有奖竞猜]&e请立刻输入指令&d&l/jingcai &d&l&n你的答案&e 加入今天的竞猜吧~
-
- broadcast! &a[有奖竞猜]&e正确回答问题者将获得&b&l64钻石&e作为奖励唷~
复制代码
PCD小组是2016年成立的,因此玩家只有输入
/jingcai 2016
才算正确回答问题并获得奖品,在“有奖竞猜”这个自定义指令简写例子中,我们需要实现以下机制:
-
玩家输入任何错误答案(例如/jingcai 2333),显示答错了的提示语,不发奖励;
-
玩家第一次输入正确答案(/jingcai 2016),显示答对了的提示语,获得64钻石;
-
玩家第二次输入正确答案,显示已领取过的提示语,不发奖励。
但是我该怎么知道玩家是第一次还是第几次输入正确答案呢?如果你还记得我在上文中的
木牌商店第三弹:反寡头刷钱机制
里介绍的statement特殊指令,相信你一定会恍然大悟。
把statement特殊指令考虑进来,再重新分析一遍流程:
-
玩家输入任何错误答案(例如/jingcai 2333),显示答错了的提示语,不发奖励;
-
玩家输入正确答案(/jingcai 2016),检测他是否有一个名叫jingcai.pcd的权限
-
若没有,则该玩家是第一次答对,显示答对了的提示语,获得64钻石,并给他加上这个jingcai.pcd权限
-
若有,则该玩家已经答对过了,显示已领取过的提示语,不发奖励。
相关配置文件在CMI/CustomAlias/CustomAlias.yml配置文件里:
(根据联机教程版版规2-13,您可能需要回复此帖才能看到隐藏内容)
您可能注意到了,第一个自定义指令简写我写的是
jingcai ?
,其中这个问号可代表一切错误的答案(比如
/jingcai 2333
/jingcai 啊啊啊
甚至是
/jingcai
指令本身),唯有玩家输入正确答案
/jingcai 2016
时,优先执行预设的的正确指令,而非jingcai ? 里的指令
|
“致富卡”指令版
涉及CMI功能:自定义指令简写,特殊指令:moneycost/delay,CMI变量
通过前文进阶篇里的“大佬专用致富卡道具”小章节,我们已经见识过了物品形式的“致富卡”,接下来我们将要介绍的是致富卡的“指令版”,玩家只需执行一个简单的指令/zfk 就可以花费500金钱玩一次,金钱不够500的玩家无法执行,之后会看到一系列步进显示的提示语,之后会获得0-750范围内的随机金钱。
本道具没有恶意影射某论坛的想法。
CMI的自定义指令简写支持特殊指令,在这一篇例子中我主要会用到的是特殊指令moneycost和delay(如果你已经不记得特殊指令是怎么用的了,请参考上文的
特殊指令
章节)
废话不多说,直接上配置文件:
(根据联机教程版版规2-13,您可能需要回复此帖才能看到隐藏内容)
玩家执行/zfk 指令,会每隔1秒显示一条提示语(使用特殊指令delay)之后会收到随机金钱数额。
你也许注意到了我在moneycost后面添加了两个特殊符号 # 和 ?,这两者的含义是:
-
#:若玩家不符合此条件,终止整个指令序列(后续指令都不会执行)
-
?:若玩家不符合此条件,输出提示语(你的钱不够)
同理,使用特殊指令给自定义指令做出权限限制等级限制、消耗经验点券等等也是行得通的。
|
|
|
|
所以说……
你根本不会用CMI!
编辑记录
-
2022.04.29 发布此教程。
-
2022.05.09 对计划任务中Delay大小写问题作出解释,新增进阶教程“木牌商店系列”共三弹。
-
2022.05.17 新增《日常管理与惩罚机制》篇,目前包含5小章节。
-
2022.05.24 新增《Ranks升级系统》篇,目前包含2小章节。
-
2022.06.14 在进阶篇中新增“PVP与武神升级系统”小章节。
-
2022.11.21 新增《推荐权限设置》篇。
-
2022.12.04 新增《大佬牛逼!指令简写还能这么用!》篇,目前包含3小章节。
-
2022.12.07 在基础篇中新增“MOTD”和“Tab列表”2小章节,移除“本教程没写完”标签。
-
2023.03.26 由于CMI9.5.0.0配置文件结构大改,对教程进行适配性修改。
|
来自群组:
PluginsCDTribe
|