Skip to content
全文约 2619 字 预计阅读 9 分钟

LOICollectionAPI

NOTE

以下内容取自 LOICollectionA 1.15.0 的 LOICollectionAPI 结构,对于后续版本的 LOICollectionAPI 结构可能会有所不同。

默认变量

LOICollectionAPI备注类型
{version_mc}当前服务器 Minecraft 版本string
{version_ll}当前服务器 LeviLamina 版本string
{version_protocol}当前服务器协议版本string
{player}当前玩家名称string
{player_language}获取玩家使用的语言IDstring
{player_language_name}获取玩家使用的语言名称string
{player_title}获取玩家当前佩戴称号string
{player_title_time}获取玩家剩余拥有称号时间string
{player_mute}玩家是否被禁言boolean
{player_pvp}玩家是否开启PVPboolean
{player_statistcs_onlinetime}玩家在线时长string
{player_statistcs_kills}玩家击杀生物数量int
{player_statistcs_deaths}玩家死亡次数int
{player_statistcs_place}玩家放置方块数量int
{player_statistcs_destroy}玩家破坏方块数量int
{player_statistcs_respawn}玩家重生次数int
{player_statistcs_join}玩家加入服务器次数int
{player_gamemode}玩家当前游戏模式string
{player_pos}玩家所在坐标string
{player_pos_x}玩家所在X坐标int
{player_pos_y}玩家所在Y坐标int
{player_pos_z}玩家所在Z坐标int
{player_pos_respawn}玩家重生坐标string
{player_pos_respawn_x}玩家重生X坐标int / string(None)
{player_pos_respawn_y}玩家重生Y坐标int / string(None)
{player_pos_respawn_z}玩家重生Z坐标int / string(None)
{player_pos_block}玩家所在的方块坐标string
{player_pos_lastdeath}玩家上次死亡的坐标string
{player_realname}玩家的真实名字string
{player_xuid}玩家XUID字符串string
{player_uuid}玩家Uuid字符串string
{player_is_op}玩家是否为OPboolean
{player_can_fly}玩家是否可以飞行boolean
{player_health}玩家当前生命值int
{player_max_health}玩家最大生命值int
{player_hunger}玩家当前饥饿值int / string(None)
{player_max_hunger}玩家最大饥饿值int / string(None)
{player_saturation}玩家当前饱和度int / string(None)
{player_max_saturation}玩家最大饱和度int / string(None)
{player_speed}玩家当前速度float
{player_direction}玩家当前朝向string
{player_dimension}玩家当前维度IDint
{player_ip}玩家连接IPstring
{player_exp_xp}玩家当前经验int / string(None)
{player_exp_level}玩家当前等级int / string(None)
{player_exp_level_next}玩家下一等级所需经验int
{player_handitem}玩家手持物品名称string
{player_offhand}玩家副手持物品名称string
{player_os}玩家设备名称string
{player_ms}玩家的网络延迟时间 (ms)int
{player_ms_avg}玩家的平均网络延迟时间 (ms)int
{player_packet}玩家的网络丢包率 (%)int
{player_packet_avg}玩家的平均网络丢包率 (%)int
{server_tps}获取当前服务器TPSfloat
{server_mspt}获取当前服务器MSPTfloat
{server_time}当前时间string
{server_player_max}最大玩家数量int
{server_player_online}在线玩家数量int
{server_entity}当前服务器实体数量int
{score(ScoreboardName)}玩家的计分板分数int
{tr(languageId)}获取玩家当前语言指定ID的翻译文本string
{tr(langcode, languageId)}获取指定语言指定ID的翻译文本string
{entity(typeid)}获取指定ID的实体数量int

TIP

因为解析器的原因,在传递任何形式的字符串时,都应使用 "' 进行包裹。


阻断标识符 - $

阻断标识符用于阻止变量的替换,即原变量内容将保留原样,不会被解析为其他内容。

text
${variable}
参数备注
variable变量名

TIP

阻断标识符通常用于变量前,且在完成替换后标识符会被移除。

阻断标识符具体使用实例

以下将展示玩家的真实名字,且不会解析其他内容

text
{player_realname} + '->' + ${team}
  • 返回结果:player -> {team}

判断语句 - if

判断语句用于判断条件是否成立,如果成立则将result_yes 的内容替换掉原语句,否则将以 result_no 的内容替换掉原语句

text
if (condition)[result_yes : result_no]
参数备注
condition判断条件
result_yes条件成立时替换的内容
result_no条件不成立时替换的内容

TIP

在判断语句中是支持 if 嵌套的,但建议不要嵌套过多,否则会导致语句难以阅读

判断语句具体使用实例

以下将以不同的颜色展示玩家的平均网络延迟时间

WARNING

需要注意的是语句的原 result 无法解析特殊字符,需要将其整合为字符串类型

text
if({player_ms_avg} <= 50)["§a" : if( {player_ms_avg} > 50 && {player_ms_avg} <= 250)["§e" : "§c"]] + {player_ms_avg} + "§bms"
  • 当判断条件满足 {player_ms_avg} <= 50 时,其会返回 "§a {player_ms_avg}§bms"
  • 当判断条件满足 {player_ms_avg} > 50 && {player_ms_avg} <= 250 时,其会返回 "§e {player_ms_avg}§bms"
  • 当判断条件不满足以上条件时,其会返回 "§c {player_ms_avg}§bms"

运算符 - operator

运算符通常是用于原始语句中进行更加方便快捷的处理工具,包括但不限于 +-*/ 等。

运算符1说明运算符2说明
+加法-减法
*乘法/除法
%取模^幂运算
!逻辑非&&逻辑与
||逻辑或==等于
!=不等于>大于
<小于>=大于等于
<=小于等于......

运算符具体使用实例

以上内容中的大部分均为表面含义,可直接使用,故不再赘述。
接下来将展示一些特殊用法

  1. 字符串拼接

    text
    "Hello" + "World"
    • 返回结果:"HelloWorld"
  2. 字符串比较

    text
    "Hello" <= "World"
    • 返回结果:false

    NOTE

    这里的比较规则大致可以参考 C++ 的比较规则


函数 - function

函数是一些常用的功能的集合,可以帮助我们更加方便的进行一些操作。
以下将提供一些内置的函数,更多函数可自行进行扩展。

text
namespaces::function_name(parameter1, parameter2,...)
参数备注
namespaces命名空间,用于区分不同功能
function_name函数名
parameter1参数1
parameter2参数2
......

WARNING

在函数调用中,参数最大数量只支持到 100 个,超出数量将会解析失败。详情见 Too many args in function call 错误

函数具体使用实例

以下将展示计算 cos(sqrt(100))sin(sqrt(100)) 的最大值,并取其绝对值。

TIP

需要注意的是,函数的调用需要使用 :: 进行分隔,且函数的参数需要使用 , 进行分隔。

text
math::abs(math::max(math::cos(math::sqrt(100)), math::sin(math::sqrt(100))))
  • 返回结果:0.544021

WARNING

每个表达式后都必须添加分隔符 ;


脚本语言特性(.lcui)

从 1.15.0 起,Menu 与 Shop 的界面数据改为 .lcui 脚本文件(见 数据文件),其余模块的内置界面也使用同一套脚本语言编写。脚本支持变量、数组、字符串、数值、布尔值与 none,并支持 ifwhileforbreakcontinuereturn 等流程控制。

函数定义与匿名函数

使用 func 定义命名函数,参数与返回值可以指定类型(未指定时为动态类型):

lcui
func add(a: int, b: int) -> int {
    return a + b;
}

result = add(1, 2);

匿名函数(Lambda)使用 func (参数) -> 返回类型 { ... } 定义,可以赋值给变量或直接作为参数传递:

lcui
double = func (x: int) -> int {
    return x * 2;
};
value = double(3);

form.button("Button", func () -> void {
    mc::runCmd("say Hello");
}, new ButtonOptions());

TIP

你知道吗:天是蓝的......虽然有时候不是蓝( ̄y▽ ̄)╭

类与继承

脚本语言支持类、继承、访问控制与静态成员:

lcui
class Animal {
public:
    name = "unknown";

    Animal(name) {
        this.name = name;
    }

    func speak() -> string {
        return "...";
    }
}

class Dog extends Animal {
    func speak() -> string {
        return "Woof";
    }
}

dog = new Dog("dog");
if (dog instanceof Animal) [
    mc::runCmd("say " + dog.speak());
]

类相关的关键字与运算符:

关键字/运算符说明
class定义类
extends继承基类
new创建对象
this当前对象
super调用基类方法,super(...) 调用基类构造器
instanceof判断对象是否为指定类的实例
public: / private:访问控制段
static静态成员或静态方法
using Alias = Type;类型别名

内置命名空间与函数

命名空间函数说明
mathabsmaxminsqrtpowlogsincosrandom数学函数
stringlengthupperlowersubstrtrimreplace字符串函数
stdformat(formatStr, array)使用数组中的值格式化字符串
mcrunCmd(command)以当前玩家身份执行命令
GUIManagervalue(id)获取 GUI 注册值
GUIManagerrequest(id, args)请求 GUI 注册数据
GUIManagercallback(id, args)调用 GUI 注册回调
GUIManageropen(id, formId, type[, ctx])打开指定类型的 GUI
GUIManagerswitchTo(id, type)将当前 GUI 切换为指定类型

TIP

GUIManager::openGUIManager::switchTo 中的 type 为整数:1 为 CustomForm,2 为 MessageBox,3 为 PaginatedForm,4 为 ScriptForm。

常用内置类

说明
MenuData菜单数据,包含 idtypetitlecontentpermissionexitCommandscoreCommandpermissionCommanditemscontrolsconfirmcancelrunsubmit
MenuItemData菜单按钮数据,包含 typetitleidrunpermissionscores
MenuForm菜单表单,new MenuForm(id, title);方法:headerlabeldividerspacertextFielddropdowntogglesliderbuttoncloseButtonshow;回调结果为 closeReasonactionIndexaction
MenuMessageBox菜单对话框,new MenuMessageBox(id, title);方法:bodybutton1button2show;回调结果为 closeReasonselectionaction
ShopData商店数据,包含 idtypetitlecontentexitCommandscoreCommandtitleCommanditemCommanditems
ShopItemData商店商品数据,包含 typetitleintroducenumberidnbtconfirmButtoncancelButtontimescores
ShopForm商店表单,new ShopForm(id, data);方法:labeldividerpreviousButtonnextButtonchooseButtoncloseButtonshow;回调结果为 closeReasonresultCodeshopitemIndexitemfromId
ScoreRequirementScore 需求,包含 objectivevalue
PaginatedForm分页表单,new PaginatedForm(guiId, title, elements[, pageSize]);方法:previousnextchoosepreviousButtonnextButtonchooseButtonbuttoncloseButtondividerdropdownheaderlabelsliderspacertextFieldtoggleshowcloseisShowing;回调结果为 closeReasonselectionselectionIndexpage
ObservableString / ObservableNumber / ObservableBoolean可观察数据,构造参数为(初始值,客户端是否可写);方法:getDatasetDatasubscribeunsubscribeisClientWritable
TextOptions / ButtonOptions / TextFieldOptions / DropdownOptions / DropdownItem / SliderOptions / ToggleOptions / DividerOptions / SpacingOptions表单控件选项类
GlobalValue全局值容器,包含 value 字段

脚本语言的常见错误及解决方案,请参见 常见错误含义。 原生 UI 的完整类与方法说明,请参见 原生 UI(Native UI)

LOICollectionA · 开箱即用的 LeviLamina 多功能插件集