首页 | Blogs | 项目合集 | Bilibili↗
←返回 |
创建:2025-05-03 | 最后更新:2025-06-23
[i] 栈流Streack服务器฿,原版高版本,双端互通,欢迎来看。
Placeholder
CMI 所有地方都支持Placeholder全局变量,下面这些是CMI默认有的
占位符名称 | 描述 |
---|---|
%cmi_user_charges_left% |
|
%cmi_user_charges_max% |
|
%cmi_user_charges_time% |
|
%cmi_user_charges_cooldown% |
|
%cmi_user_display_name% |
|
%cmi_p_[playerName]_display_name% |
|
%cmi_user_cleannickname% |
|
%cmi_user_nickname% |
|
%cmi_user_name% |
|
%cmi_user_uuid% |
|
%cmi_user_uuid_% |
|
%cmi_user_deathloc% |
|
%cmi_user_backloc% |
|
%cmi_user_cuffed% |
|
%cmi_p_[playerName]_cuffed% |
|
%cmi_user_muted% |
|
%cmi_p_[playerName]_muted% |
|
%cmi_user_inpvp% |
|
%cmi_user_god% |
|
%cmi_p_[playerName]_god% |
|
%cmi_user_sneaking% |
|
%cmi_user_mail_count% |
|
%cmi_user_warning_count% |
|
%cmi_user_warning_points% |
|
%cmi_user_afk% |
|
%cmi_user_afk_symbol% |
|
%cmi_user_afk_msg% |
|
%cmi_user_afk_for% |
|
%cmi_user_afk_in% |
|
%cmi_user_spy% |
|
%cmi_user_cmdspy% |
|
%cmi_user_signspy% |
|
%cmi_user_joinedcounter% |
|
%cmi_user_banned% |
|
%cmi_p_[playerName]_banned% |
|
%cmi_user_maxhomes% |
|
%cmi_user_homeamount% |
|
%cmi_user_homelist% |
|
%cmi_user_missingexp% |
|
%cmi_user_missingexpp% |
|
%cmi_user_exp% |
|
%cmi_user_expp% |
|
%cmi_user_totalexp% |
|
%cmi_user_level% |
|
%cmi_user_ping% |
|
%cmi_user_gamemode% |
|
%cmi_user_op% |
|
%cmi_user_pweather% |
|
%cmi_user_weather% |
|
%cmi_user_weatherduration% |
|
%cmi_user_canfly% |
|
%cmi_user_flying% |
|
%cmi_user_vanished_symbol% |
|
%cmi_user_balance_formatted% |
|
%cmi_user_balance% |
|
%cmi_user_prefix% |
|
%cmi_user_suffix% |
|
%cmi_user_group% |
|
%cmi_user_nameplate_prefix% |
|
%cmi_user_nameplate_suffix% |
|
%cmi_user_tfly% |
|
%cmi_user_tfly_formatted% |
|
%cmi_user_flightcharge% |
|
%cmi_user_tgod% |
|
%cmi_user_tgod_formatted% |
|
%cmi_user_votecount% |
|
%cmi_user_dailyvotecount% |
|
%cmi_user_chatcolor% |
|
%cmi_user_rank_displayname% |
|
%cmi_user_rank_name% |
|
%cmi_user_nextranks% |
|
%cmi_user_nextrankpercent% |
|
%cmi_user_nextvalidranks% |
|
%cmi_user_canrankup% |
|
%cmi_user_country% |
|
%cmi_user_country_code% |
|
%cmi_user_city% |
|
%cmi_user_name_colorcode% |
|
%cmi_user_glow_code% |
|
%cmi_user_glow_name% |
|
%cmi_user_jailed% |
|
%cmi_p_[playerName]_jailed% |
|
%cmi_user_jailname% |
|
%cmi_p_[playerName]_jailname% |
|
%cmi_user_jailcell% |
|
%cmi_p_[playerName]_jailcell% |
|
%cmi_user_jailtime% |
|
%cmi_p_[playerName]_jailtime% |
|
%cmi_user_jailreason% |
|
%cmi_p_[playerName]_jailreason% |
|
%cmi_user_jailedby% |
|
%cmi_p_[playerName]_jailedby% |
|
%cmi_user_riding% |
|
%cmi_user_beingriddenby% |
|
%cmi_user_bungeeserver% |
|
%cmi_user_rt_cooldown% |
|
%cmi_user_rt_cooldown_[worldName]% |
|
%cmi_user_playtime_formatted% |
|
%cmi_user_playtime_days% |
|
%cmi_user_playtime_dayst% |
|
%cmi_user_playtime_hours% |
|
%cmi_user_playtime_hoursf% |
|
%cmi_user_playtime_hourst% |
|
%cmi_user_playtime_minutes% |
|
%cmi_user_playtime_minutest% |
|
%cmi_user_playtime_seconds% |
|
%cmi_user_playtime_secondst% |
|
%cmi_user_prewards_count% |
|
%cmi_user_world_formatted% |
|
%cmi_user_online% |
|
%cmi_p_[playerName]_online% |
|
%cmi_user_itemcount_[itemIdName(:data)]% |
|
%cmi_user_maxperm_[playerName]_[corePerm]_[defaultValue]% |
|
%cmi_user_toggle_[msg\|pay\|tp\|compass\|sospy\|sispy\|cospy\|schest\|autoflightrecharge\|totem\|shiftedit\|tagsound\|chatbubble]% |
|
%cmi_user_togglename_[msg\|pay\|tp\|compass\|sospy\|sispy\|cospy\|schest\|autoflightrecharge\|totem\|shiftedit\|tagsound\|chatbubble]% |
|
%cmi_user_holo_page_[hologramName]% |
|
%cmi_equation_[equation]% |
计算一个算式 |
%cmi_equationint_[equation]% |
计算一个算式,结果取整 |
%cmi_color_[text]% |
|
%cmi_iteminhand_displayname% |
|
%cmi_iteminhand_realname% |
|
%cmi_iteminhand_type% |
|
%cmi_iteminhand_itemdata% |
|
%cmi_iteminhand_amount% |
|
%cmi_iteminhand_durability% |
|
%cmi_iteminhand_maxdurability% |
|
%cmi_iteminhand_custommodeldata% |
|
%cmi_iteminhand_worth% |
|
%cmi_iteminhand_worth_one% |
|
%cmi_iteminhand_worthc% |
|
%cmi_iteminhand_worthc_one% |
|
%cmi_schedule_nextin_[schedName]% |
|
%cmi_schedule_endat_[schedName]% |
|
%cmi_baltop_name_[1-10]% |
|
%cmi_baltop_money_[1-10]% |
|
%cmi_baltop_shortmoney_[1-10]% |
|
%cmi_playtimetop_name_[1-10]% |
|
%cmi_playtimetop_time_[1-10]% |
|
%cmi_votetop_[1-10]% |
|
%cmi_votetopcount_[1-10]% |
|
%cmi_worth_buy_[itemIdName(:data)]% |
|
%cmi_worth_sell_[itemIdName(:data)]% |
|
%cmi_worthc_buy_[itemIdName(:data)]% |
|
%cmi_worthc_sell_[itemIdName(:data)]% |
|
%cmi_bungee_total_[serverName]% |
|
%cmi_bungee_current_[serverName]% |
|
%cmi_bungee_motd_[serverName]% |
|
%cmi_bungee_onlinestatus_[serverName]% |
|
%cmi_tps_1% |
这个不知道为什么,值为20 的时候不会交替显示一个* |
%cmi_tps_60% |
|
%cmi_tps_300% |
|
%cmi_tps_[range]_colored% |
|
%cmi_tps_[range]% |
|
%cmi_random_player_name% |
|
%cmi_lastrandom_player_name% |
|
%cmi_random_[from]_[to]% |
|
%cmi_lastrandom_[playerName]% |
|
%cmi_user_rank_percent[rankName]% |
|
%cmi_user_meta_[key]% |
这两个用法见下文 |
%cmi_user_metaint_[key]% |
|
%cmi_chatmute_time% |
|
%cmi_chatmute_reason% |
|
%cmi_user_baltop% |
|
%cmi_user_stats_[mainStat(:optionalSubStat)]% |
|
%cmi_user_kitcd_[kitName]% |
|
%cmi_user_kit_available% |
|
%cmi_user_kit_available_[kitName]% |
|
%cmi_user_kit_hasaccess_[kitName]% |
|
%cmi_jail_time_[playerName]_[cellId]% |
|
%cmi_jail_username_[playerName]_[cellId]% |
|
%cmi_jail_reason_[playerName]_[cellId]% |
|
%cmi_weather_[worldName]% |
|
%cmi_weatherduration_[worldName]% |
|
%cmi_afk_count% |
|
%cmi_maintenance_state% |
|
%cmi_maintenance_message% |
|
%cmi_chat_range% |
|
%cmi_server_uptime% |
获取服务器运行时长,需要注意是有格式的,末尾要用§r 重置一下 |
%cmi_server_uptime_seconds% |
|
%cmi_server_worlds% |
|
%cmi_server_vanished% |
|
%cmi_server_users% |
|
%player_world% |
|
%cmi_player_world% |
|
%player_x% |
|
%cmi_player_x% |
|
%player_y% |
|
%cmi_player_y% |
|
%player_z% |
|
%cmi_player_z% |
|
%player_biome% |
|
%cmi_player_biome% |
|
%vault_eco_balance_formatted% |
|
%server_online% |
|
%cmi_server_online% |
|
%server_max_players% |
|
%cmi_server_max_players% |
|
%cmi_server_online_[worldName]% |
|
%server_unique_joins% |
|
%cmi_server_unique_joins% |
|
%onlineplayers_names% |
|
%cmi_onlineplayers_names% |
|
%onlineplayers_displaynames% |
|
%cmi_onlineplayers_displaynames% |
|
%cmi_server_time_[timeFormat]_[timeZone]% |
|
%cmi_server_time_[timeFormat]% |
|
%cmi_world_time12_[worldName]% |
|
%cmi_world_time24_[worldName]% |
Usermate
CMI的Usermeta可以理解为一个以玩家为核心的记分板:
项目 | /scoreboard |
/cmi usermeta |
/data stroge |
---|---|---|---|
对象 | 先创建记分板再操作分数 | 直接将分数赋值到玩家上 | 操作对象的NBT数据 |
目标 | 任一实体或虚拟对象 | 玩家 | 任一实体或虚拟对象 |
非法玩家名支持 | ✓ | ||
UUID支持 | ✓ | ✓ | ✓ |
目标选择器 | ✓ | ✓ | |
Placeholder | 需要额外插件 | ✓ | 需要额外插件 |
数据包友好 | ✓ | ✓ |
Usermeta可以用Placeholder%cmi_user_meta_[key]%
和%cmi_user_metaint_[key]%
读取,配合下方脚本操作符可以实现一些好玩的功能。
脚本操作符
CMI 的几乎所有预置命令部分都支持下方的操作符。
可以说这几乎构成了一个脚本语言……
下列场景均可以使用:
- CustomAlias(自定义别名,不过我建议改名叫自定义命令,因为实在是太强大了)
/cmi attachcommand
- 牌子命令
Schedules.yml
EventCommands.yml
- ……
占位符
需要命令上文含有玩家
内容 | 描述 |
---|---|
[playerName] |
插入玩家名 |
[playerDisplayName] |
插入玩家显示名 |
[lvl] |
插入玩家等级 |
[exp] |
插入玩家经验 |
[hp] |
插入玩家血量 |
[maxHp] |
插入玩家最大血量 |
[hunger] |
插入玩家饥饿值 |
[gameMode] |
插入玩家游戏模式 |
[randomPlayer] |
等效于选择器@r ,即随机玩家,不会选中有权限cmi.scheduler.exclude 的玩家 |
快捷子命令
内容 | 描述 |
---|---|
msg! <玩家> |
给玩家发私聊,等效于/tellraw <玩家> "消息" |
broadcast! |
|
actionbar! <玩家> |
给玩家展示物品栏标题 |
title! <玩家> |
给玩家展示标题 |
subtitle! <玩家> |
给玩家展示副标题 |
kickall! |
以后面接的理由踢出全部玩家,OP除外(准确来说是拥有对应bypass权限节点) |
closeinv! |
执行到此时关闭玩家正在打开的物品栏界面 |
ph! |
取消此行的Placeholders处理 例如 ph! cmi bossbarmsg %cmi_server_time_ss% 会显示一个实时更新当前秒数的Bossbar,但是不带ph! 显示的数字就是执行时的秒数。在上例中 ph! 使得Placeholders被传递给了cmi bossbarmsg 命令,由cmi bossbarmsg 命令执行时解析 |
ch! |
取消此行的颜色代码处理 |
提权子命令
内容 | 描述 |
---|---|
asPlayer! |
作为输入命令的玩家执行命令,可以防止意外提权 |
asConsole! |
作为控制台执行命令,需要在config.yml 中启用 |
asFakeOp! |
作为玩家执行命令,该命令视为管理员执行,需要在config.yml 中启用 |
allPlayers! |
作为所有玩家执行命令 |
bperm:<权限>! |
忽略CMI权限节点执行后方命令 |
逻辑子命令
以下逻辑和条件子命令的!
前面可以接符号:
?
会在检验失败时通知玩家#
会在检验失败后直接结束当前任务,即后续命令(包含该行)不再执行~
会在检验成功后执行后面的命令,并结束后续执行@
反转检验条件- 可以混合使用
内容 | 描述 |
---|---|
statement:<检测名称>! <条件1>! <条件2>! <...>! |
|
if:<检测名称>! <上述条件全符合后执行的指令> |
|
if:<检测名称>@! <上述条件不符合后执行的指令> |
|
delay! <秒> [名字] |
暂停执行 |
canceldelay:<名字>! |
取消暂停执行 |
cooldown:<秒>! |
其后指令在冷却结束后才能触发 |
ucooldown:<秒>! |
相同事件的冷却 |
gcooldown:<秒>! |
冷却时间内全服玩家都不能二次触发 |
条件子命令
内容 | 描述 |
---|---|
check:<第一个值><比较符><第二个值>! |
比较两个值(可以是Placeholder),只有符合条件才能执行后续指令,比较符可以是==/</<=/>/>=/!= |
contains:你好>=我好! |
只有当你好 处的值包含我好 处的文本才会成功 |
ptarget:<玩家>! |
将当前行的条件子命令判断和Placeholders处理的目标设为指定玩家 只能在 asConsole! 上下文中使用 |
perm:[permissionNode]! |
拥有权限节点才执行 |
perm:[permissionNode]@! |
权限节点被拒绝时执行后方命令 |
moneycost:<金钱>! |
有足够的钱的玩家可以触发后续指令 |
hasmoney:<金钱>! |
检测玩家是否有足够的钱,但不扣除 |
expcost:<经验>! |
有足够的经验的玩家可以触发后续指令 |
hasexp:<经验>! |
检测玩家是否有足够的经验,但不扣除 |
item:<物品>! |
有该物品的玩家可以触发后续的指令 这里和下面两个命令的物品格式见于Zrips官网฿ |
exactitem:<物品>! |
有该物品的玩家可以触发后续的指令,该匹配必须精确匹配,即不得含有未指定的物品组件 |
hasitem:<物品>! |
检测玩家是否有足够的物品,但不扣除 |
hasexactitem:<物品>! |
检测玩家是否有足够的物品,但不扣除,该匹配必须精确匹配 |
ifonline:<玩家名>! |
若指定玩家在线则触发后续指令 |
ifoffline:<玩家名>! |
若指定玩家不在线则触发后续指令 |
ifempty:<hand/offhand/quickbar/armor/inv/subinv/ender>! |
若玩家背包里特定格子是空的则触发后续指令;可以给其增加数量参数,例如ifempty:<位置>-<数量> 其中 quickbar 是快捷九格栏,armor 是盔甲四格栏,inv 是整个背包,subinv 是除掉快捷栏9格的剩下27格栏 |
ifinworld:世界名! |
判断处在指定世界/维度 |
ifingamemode:游戏模式! |
判断游戏模式 |
ifhashealth:生命值! |
判断生命值 |
ifhashunger:饥饿值! |
判断饥饿值 |
ifhasair:氧气! |
判断剩余氧气 |
votes:<票数>! |
玩家获得一定投票才能执行后续指令 |
click:<点击方式>! |
仅适用于IC指令绑定 玩家必须以某种方式点击方块才能生效,可用 left /leftshift /right /rightshift |