以下内容来自CoralFans官方文档
CoralFans-doc
- 点击目录栏 MainDoc 开始阅读
InstallDoc
安装文档MainDoc
主要功能介绍ConfigDoc
配置文件文档ShortcutsDoc
Shortcuts文档CFSPDoc
假人文档QA
Q&A
- 欢迎参与文档站建设
- 我们需要:文档英文翻译建设
这是什么
CoralFans珊瑚扇(简称CF)是一个基于Minecraft BDS with LeviLamina的、专为MCBE生电服务的MOD。CF提供了诸多可以方便生电玩家的功能(包括一些在普通生存中看上去“非法”的功能),如物品补货、自动切换图腾、自动切换工具、调整游戏运行速度、村庄机制可视化、HSA可视化、假人、HUD信息显示、漏斗计数器等功能。更多功能还在持续增加中。
你可以把CF当作LL2 Trapdoor插件的新版本移植。不过CF目前还有一些功能没有做到,如刷怪分析。
插件特色
- 尊重原版游戏特性,不会在不告知玩家的情况下进行修改
- 支持多人游戏
- 可通过配置文件进行功能配置
你可能关心的
关于贡献者
- odorajbotoj 插件主要维护者
- hhhxiao Trapdoor-ll的主要维护者
- OEOTYAN 前置Mod开发,部分源码提供
- glibcxx 部分源代码提供
- JiaLe1135 文档贡献
- Tokong Server 提供服务器测试环境
CoralFans安装
0.阅读并同意免责声明
作为用户首先需要明确: 使用CoralFans带来的功能就意味着承担第三方软件带来的风险.为了不给开发者带来不必要的麻烦,请阅读以下的免责声明,如果您使用了CoralFans就意味着您自动同意了该声明.
免责声明
CoralFans(以下简称cf)是一个基于LeviLamina开发的BDS辅助插件,它提供了令人惊叹的方便玩家的功能,给生电玩家创造了便利.另外,cf本身是开源免费的,内部没有任何恶意代码,原则上也不会对存档造成任何损害.
但考虑到此类软件的特殊性,开发者无法完全保证对用户的存档不造成任何破坏,万一发生意外情况,开发者不会也没有能力对用户造成的损失负责.
如果您继续使用cf插件,那么就代表您同意了该声明(或者说叫用户协议),如果您不想承担此类风险,请停止使用cf插件.
1.安装BDS以及LeviLamina
CoralFans插件依赖于LeviLamina加载器,而LeviLamina基于BedrockDedicatedServer(简称BDS)官方服务端,所以在使用本插件前,你需要安装BDS和LeviLamina。
- Windows安装参考LeviLamina中文安装教程
补充
- 不建议中文路径
- 这可能会导致意料之外的行为,不建议中文路径
- 开启Loop back
- UWP应用默认关闭了loop back,你需要开启才能连接本地服务器,如果是云服务器的多人游戏可以省去这一步.以管理员权限打开
powershell
,并运行如下命令(该命令来自微软官网):CheckNetIsolation.exe LoopbackExempt -a -p=S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436
- UWP应用默认关闭了loop back,你需要开启才能连接本地服务器,如果是云服务器的多人游戏可以省去这一步.以管理员权限打开
- 关闭cmd快速编辑
- windows默认cmd窗口启用快速编辑模式,这大概率会导致你的BDS程序阻塞,右键窗口选择属性,将快速编辑模式关闭即可
2.下载并安装前置
- 使用lip进行安装:
lip install github.com/OEOTYAN/BedrockServerClientInterface
. - 在前置插件的
assets
文件夹下找到材质包,打包并安装进游戏,全局启用
3.下载并安装插件本体
- 使用lip进行安装:
lip install github.com/CoralFans-Dev/CoralFans
. - 也可以手动安装
- 前往CoralFans的下载页面下载发布的release文件
- 将解压后的插件放入服务端根目录下的
plugins
文件夹
4.配置配置文件
你可能需要根据需求关闭部分功能(如 tick
,漏斗计数器等)
5.开服
本地服务器ip一栏填写 127.0.0.1
或者 localhost
云服务器ip一栏填写其公网ip(不知道的问服务商),端口按照服务器配置文件里面改,默认 19132
CoralFans
coralfans
- 关于 CoralFans Mod
/coralfans versionCopy to clipboardErrorCopied
coralfans version
打印当前版本信息
calculate
- 统计游戏数据
/calculate ptCopy to clipboardErrorCopied
calculate pt
统计区块内计划刻数据
cfhud
- HUD信息显示
/cfhud show <isopen: Boolean>
/cfhud <add|remove> <mspt|base|redstone|village|hopper|block>Copy to clipboardErrorCopied
cfhud show
配置是否显示信息cfhud add
增加一条显示项- cfhud remove 删除一条显示项
mspt
– mspt与tps信息base
– 基本信息,如当前坐标、区块等redstone
– 红石信息,等同于执行data redstone info
village
– 村民信息,等同于执行village dweller
hopper
– 漏斗计数器信息,等同于执行counter print
block
– 方块信息,等同于执行data block
counter
- 漏斗计数器
/counter print [channel: int]
/counter reset [channel: int]Copy to clipboardErrorCopied
- 在使用 func hoppercounter true 开启漏斗计数器后,所有对准混凝土的漏斗都将变成无尽的漏斗,所有流向该漏斗的物品都会消失,但是这些数据会被插件记录下来,你可以使用 /counter 命令查看这些数据。16种混凝土每一种对应一个频道(根据特殊值)。
/counter print [channel: int]
打印频道channel的数据/counter reset [channel: int]
清除频道channel的数据- 不指定频道时,插件会获取指向的漏斗或混凝土对应频道的数据
- 注意:从使用
func hoppercounter true
这一刻开始漏斗计数器就开始计时了,而不是其他时间。数据在服务器关闭时不会保存。
data
- 获取方块或实体等的信息
/data block [blockPos: x y z]
/data block nbt [path: string]
/data block <blockPos: x y z> nbt [path: string]
/data blockentity nbt [path: string]
/data blockentity <blockPos: x y z> nbt [path: string]
/data blockentity highlight [radius: int] [time: int]
/data entity
/data entity nbt [path: string]
/data redstone <signal|info|chunk|conn> [blockPos: x y z]
/data item nbt [path: string]
/data player <player: Player> uuidCopy to clipboardErrorCopied
data block
获取方块信息data blockentity
获取方块实体信息data entity
获取实体信息- data item 获取手持物品信息
nbt
用于指定获取nbt信息path
是可选参数,用于访问特定的Nbt Tag。如a.b[1].c
指向根标签下a标签下b数组的第二个元素的c标签。
- data redstone 获取红石原件信息
chunk
标记所在区块的所有红石原件signal
打印信号相关信息info
打印红石基本信息conn
标记指定原件(绿色)、子原件(黄色)、父原件(红色)
data player
获取指定玩家的UUID
func
- 拥有调整全局功能配置的能力
/func forceopen <IsOpen: Boolean>
/func forceplace <all|entity|normal>
/func noclip <IsOpen: Boolean>
/func droppernocost <IsOpen: Boolean>
/func safeexplode <IsOpen: Boolean>
/func autotool <IsOpen: Boolean>
/func hoppercounter <IsOpen: Boolean>
/func maxpt <maxpt: int>
/func containerreader <IsOpen: Boolean>
/func autototem <IsOpen: Boolean>
/func autoitem <IsOpen: Boolean>
/func fastdrop <IsOpen: Boolean>
/func portaldisabled <IsOpen: Boolean>Copy to clipboardErrorCopied
func forceopen
强制开启容器func forceplace
方块强制放置all
表示无视所有限制,entity
表示无视实体,normal
表示正常模式
func noclip
创造模式无碰撞箱func droppernocost
投掷器不消耗物品func safeexplode
爆炸不破坏地形func autotool
自动切换工具func hoppercounter
漏斗计数器func maxpt
最大计划刻func containerreader
容器预览func autototem
自动补充图腾func autoitem
物品自动补货func fastdrop
快速扔出背包所有同类物品func portaldisabled
玩家禁用传送门- func可以开启或者关闭部分功能的全局开关。功能分为两类,全局功能和个人功能。对于个人功能,需要使用func和self同时开启该功能才会生效;对于全局功能,只需要使用func指令开启,该功能则会令全服务器的所有玩家生效。
hsa
- 拥有在游戏内可视化结构生成区域(HSA)的能力
/hsa show <isopen: Boolean>Copy to clipboardErrorCopied
hsa show
开启或者关闭HSA显示,开启后插件会在游戏内有HSA的地方使用粒子画出结构的刷怪点起始位置(需要前置Mod与对应材质包),默认黑色,如若hsa点位重合,则会出现多种色彩叠加的情况
log
- 打印一些信息
/log levelseed
/log pt
/log rptCopy to clipboardErrorCopied
log levelseed
打印存档种子log pt
打印玩家所在区块的计划刻信息log rpt
打印玩家所在区块的随机计划刻信息
minerule
- 用于修改游戏规则
/minerule fuck_bedrock_no_drop <IsOpen: Boolean>
/minerule fuck_movingBlock_no_drop <IsOpen: Boolean>
/minerule remove_portal_pigzombie_cd <IsOpen: Boolean>
/minerule replicated_portal_sand_farm <IsOpen: Boolean>Copy to clipboardErrorCopied
minerule fuck_bedrock_no_drop
还原旧版本基岩可掉落minerule fuck_movingBlock_no_drop
修复movingBlock破坏时不掉落的bugminerule remove_portal_pigzombie_cd
移除猪人15s传送cdminerule replicated_portal_sand_farm
还原旧版本折跃门刷沙机
noclip
- 创造模式无碰撞箱
/noclipCopy to clipboardErrorCopied
noclip
创造模式无碰撞箱
prof
- 拥有检查服务器健康程度以及定位卡顿源头的能力
/prof [normal|entity|chunk|pt] [numberOfTick: int]Copy to clipboardErrorCopied
prof normal
进行普通的profile,会列出游戏多个条目的执行时间prof entity
对实体更新进行profileprof chunk
对区块更新进profile(列出的坐标为区块坐标)prof pt
对计划刻进行profilenumberOfTick
是选填参数,指定prof需要执行的gt数,不填时默认为100gt
rotate
- 旋转方块
/rotateCopy to clipboardErrorCopied
rotate
可以旋转指向的方块
self
- 拥有调整个人功能配置的能力
/self autotool <IsOpen: Boolean>
/self autotool mindamage <mindamage: int>
/self containerreader <IsOpen: Boolean>
/self autototem <IsOpen: Boolean>
/self autoitem <IsOpen: Boolean>
/self fastdrop <IsOpen: Boolean>
/self portaldisabled <IsOpen: Boolean>Copy to clipboardErrorCopied
- self autotool 自动切换工具
self autotool mindamage
可以设置工具最小耐久值。低于耐久值的工具不会被自动选择
self containerreader
容器预览self autototem
自动补充图腾self autoitem
物品自动补货self fastdrop
快速扔出背包所有同类物品self portaldisabled
玩家禁用传送门- 当对应的功能没有在
func
指令中全局开启时,self
指令会一直将其配置为false
slime
- 拥有可视化史莱姆区块的能力
/slime check
/slime show <IsOpen: Boolean>Copy to clipboardErrorCopied
slime check
检测当前区块是否为史莱姆区块slime show
开启或关闭史莱姆区块可视化
sp
- 假人
- 在CoralFans 2.0.0版本中,我们移除了假人系统,并将其做成了独立插件CFSP
- 参见CFSPCommandDoc
tick
- 拥有改变世界运行速度的能力
/tick query
/tick <freeze|reset>
/tick rate <rate: float>
/tick step <step: int>Copy to clipboardErrorCopied
tick query
查询MSPTtick freeze
暂停tick执行tick reset
重置游戏速率至正常tick rate
设置游戏速率,原版为20tps- tick step 加速步进,并在步进结束后暂停游戏运行
- 该命令后可接
t
s
d
单位,分别代表步进tick,秒,游戏日。如步进一游戏日为tick step 1d
- 该命令后可接
village
- 拥有显示村庄信息的能力
/village show <bounds|raid|spawn|center|poi|bind> <IsOpen: Boolean>
/village list
/village info <id: softenum>
/village dweller
village show <bounds|raid|spawn|center|poi|bind> <IsOpen: Boolean>
用于开关村庄相关的可视化:bind
村民绑定信息可视化bounds
村庄范围可视化center
村庄中心可视化poi
POI的查询范围可视化raid
劫掠刷新边界可视化spawn
铁傀儡刷新范围可视化
village list
列出所有正在加载的村庄village info <id: softenum>
显示指定VID或UUID的村庄的信息village dweller
获取指向实体(村民)的信息
配置文件
version
- 配置文件的版本。
2.5.0
版CoralFans为5
locateName
- 插件语言。支持
zh_CN
与en_US
cfhudRefreshTime
- cfhud信息显示的刷新时间。单位:Tick
command
- 指令配置
enabled
- 是否启用该指令
permission
- 执行所需权限
- 可选值如下(从小到大排序)
Any
– 任意玩家GameDirectors
– 默认的管理员权限Admin
Host
Owner
Internal
- 自定义快捷指令
- 参见ShortcutsDoc
Shortcuts
shortcuts
是一项非常强大的配置功能。仙人掌扳手、仙人掌点击混凝土打印漏斗计数器信息皆依赖此功能。
- 自定义快捷指令
enable
是否开启- type 快捷指令类型
use
玩家使用物品useon
玩家对着方块使用物品destroy
玩家使用物品破坏任意方块command
自定义命令
item
玩家手持物品,对use
useon
destroy
type有效blcok
玩家点击的方块,对useon
type有效command
自定义的短命令,对command
type有效description
自定义短命令的描述,对command
type有效permission
自定义短命令的权限,对command
type有效。可选值同config – permissionprevent
是否拦截原有事件触发- actions 要执行的指令序列。您可以在其中使用一些内建变量,他们会在执行时被替换。
{selfname}
执行者真名{selfx}
执行者x坐标{selfy}
执行者y坐标{selfz}
执行者z坐标{itemname}
使用的物品的名称(对use
useon
destroy
type有效){itemaux}
使用的物品的特殊值(对use
useon
destroy
type有效){blockname}
对准方块的名称(对useon
type有效){blockvariant}
对准方块的特殊值(对useon
type有效){blockx}
对准方块的x坐标(对useon
type有效){blocky}
对准方块的y坐标(对useon
type有效){blockz}
对准方块的z坐标(对useon
type有效)
举例
打印漏斗计数器信息
{
"enable": true,
"type": "useon",
"item": "cactus",
"block": "black_concrete",
"command": "",
"description": "",
"permission": "Any",
"prevent": false,
"actions": [
"counter print"
]
}Copy to clipboardErrorCopied
- 上述配置代表:当对准黑色混凝土使用仙人掌时,执行
counter print
指令。此快捷方式不阻止原有事件被触发,且是开启的。
快捷切换创造
{
"enable": false,
"type": "command",
"item": "",
"block": "",
"command": "c",
"description": "creative",
"permission": "GameDirectors",
"prevent": false,
"actions": [
"gamemode creative"
]
}Copy to clipboardErrorCopied
- 上述配置代表:当玩家执行
/c
命令时,等效于执行gamemode creative
。/c
命令的描述为creative
,需要权限GameDirectors
。此快捷方式是关闭的。
CFSP配置文件
version
- 配置文件的版本。
2.2.1
版CFSP为1
locateName
- 插件语言。支持
zh_CN
与en_US
simPlayer
- 假人相关配置
namePrefix
- 假人名称前缀
namePostfix
- 假人名称后缀
maxOnline
- 最大假人同时在线数
maxOwn
- 单人最多拥有假人数
maxGroup
- 全局最多存在组个数
maxSpawnCount
- 最多生成假人次数
- 为防止内存泄漏,超过此次数后无法生成假人,重启服务器恢复
adminPermission
- 假人管理员所需权限
- 可选值如下(从小到大排序)
Any
– 任意玩家GameDirectors
– 默认的管理员权限Admin
Host
Owner
Internal
listType
- 名单类型,针对下文的list
- 可选值如下
disabled
– 禁用此功能blacklist
– 名单为黑名单whitelist
– 名单为白名单
list
- 名单
- 字符串数组,值应为玩家UUID
luaPreload
- lua预加载脚本内容
- 该段内容的执行时机为加载库之后、加载内置变量与脚本文件之前
- 可以用于禁用部分库,以创造安全的执行环境
command
- 指令配置
enabled
- 是否启用该指令
permission
- 执行所需权限,可选值同adminpermission
CoralFans SimulatedPlayer (CFSP)
Tips
CFSP假人的XUID是固定的,等于
"-" + std::to_string(std::hash<std::string>()(spname))
使用非
stop
指令执行的关服操作可能会造成数据丢失。插件不为此负责。
指令系统
/sp version
/sp c autorespawn <isopen: bool>
/sp c autojoin <isopen: bool>
/sp list g
/sp list p
/sp g <name: string> create
/sp g <name: string> delete
/sp g <name: string> addsp <simplayer: string>
/sp g <name: string> rmsp <simplayer: string>
/sp g <name: string> addadmin <player: Player>
/sp g <name: string> rmadmin <player: Player>
/sp p <name: string> spawn
/sp p <name: string> spawn pos <pos: x y z>
/sp p <name: string> spawn pos <pos: x y z> rot <rotx: float> <roty: float>
/sp g <name: string> spawn
/sp p <name: string> despawn
/sp g <name: string> despawn
/sp p <name: string> rm
/sp g <name: string> rm
/sp p <name: string> respawn
/sp g <name: string> respawn
/sp p <name: string> stop
/sp g <name: string> stop
/sp p <name: string> sneaking <enable: bool>
/sp g <name: string> sneaking <enable: bool>
/sp p <name: string> swimming <enable: bool>
/sp g <name: string> swimming <enable: bool>
/sp p <name: string> attack [interval: int] [times: int]
/sp g <name: string> attack [interval: int] [times: int]
/sp p <name: string> chat <str: string> [interval: int] [times: int]
/sp g <name: string> chat <str: string> [interval: int] [times: int]
/sp p <name: string> destroy [interval: int] [times: int]
/sp g <name: string> destroy [interval: int] [times: int]
/sp p <name: string> drop
/sp g <name: string> drop
/sp p <name: string> dropinv
/sp g <name: string> dropinv
/sp p <name: string> swap
/sp p <name: string> runcmd <str: string> [interval: int] [times: int]
/sp g <name: string> runcmd <str: string> [interval: int] [times: int]
/sp p <name: string> select <item: Item>
/sp g <name: string> select <item: Item>
/sp p <name: string> interact [interval: int] [times: int]
/sp g <name: string> interact [interval: int] [times: int]
/sp p <name: string> jump [interval: int] [times: int]
/sp g <name: string> jump [interval: int] [times: int]
/sp p <name: string> use [tick: int] [interval: int] [times: int]
/sp g <name: string> use [tick: int] [interval: int] [times: int]
/sp p <name: string> build
/sp g <name: string> build
/sp p <name: string> lookat [pos: x y z]
/sp g <name: string> lookat [pos: x y z]
/sp p <name: string> moveto [pos: x y z]
/sp g <name: string> moveto [pos: x y z]
/sp p <name: string> navto [pos: x y z]
/sp g <name: string> navto [pos: x y z]
/sp p <name: string> script <path: FilePath> [interval: int]
/sp g <name: string> script <path: FilePath> [interval: int] [arg: string]Copy to clipboardErrorCopied
基本指令
sp version
用于打印插件版本信息- sp c 用于进行假人系统配置。仅假人管理员可执行
sp c autorespawn
假人死亡自动重生sp c autojoin
关服时在线假人在开服时自动加入游戏
- sp list 用于列出相关信息
sp list g
列出所有组信息sp list p
列出所有假人信息
操作对象
sp p
用于操作单一假人。仅假人拥有者或假人管理员可进行操作sp g
用于操作假人组。仅组内成员或假人管理员可进行操作name
用于指定假人或组的名字
独有操作
g (group)
create
创建组delete
删除组addsp <simplayer: string>
加入假人rmsp <simplayer: string>
移出假人addadmin <player: Player>
加入成员rmadmin <player: Player>
移出成员
p (player)
spawn pos <pos: x y z>
在指定位置创建假人spawn pos <pos: x y z> rot <rotx: float> <roty: float>
在指定位置创建假人,并指定其视角swap
假人与执行该指令的玩家交换背包、副手、盔甲栏、末影箱
共有操作
- 以下是一些可选参数的默认信息
interval
默认20,单位ticktimes
默认1,为执行次数,若小于1则为无限执行tick
默认40,单位tickpos
默认为指向的方块/实体所在的位置
无参操作
spawn
上线或创建(仅p
操作)假人despawn
下线假人rm
删除假人respawn
假人重生stop
假人停止所有动作drop
假人丢出手持物品dropinv
假人丢出背包物品(不包括副手、盔甲栏、末影箱)build
假人开始搭建方块
动作设置操作
sneaking <enable: bool>
假人潜行swimming <enable: bool>
假人游泳/趴下
无参任务操作
attack [interval: int] [times: int]
假人攻击destroy [interval: int] [times: int]
假人破坏interact [interval: int] [times: int]
假人交互jump [interval: int] [times: int]
假人跳跃
有参任务操作
chat <str: string> [interval: int] [times: int]
假人发送str
消息runcmd <str: string> [interval: int] [times: int]
假人执行str
指令use [tick: int] [interval: int] [times: int]
假人使用物品,tick
后停止使用
其他操作
select <item: Item>
假人在背包内搜索指定物品的同类物品并与手持物品切换lookat [pos: x y z]
假人看向指定位置moveto [pos: x y z]
假人移动到指定位置navto [pos: x y z]
假人寻路走到指定位置script <path: FilePath> [interval: int] [arg: string]
执行指定脚本。脚本寻找的基路径为plugins/CoralFans/data/simplayer/scripts/
。interval
为脚本Tick
函数的执行间隔,arg
为传递给Init
函数的参数
CFSP Lua Api Doc
脚本系统
脚本系统使用
Lua 5.4.7
。脚本系统非常强大,但是,您只应该执行信任的脚本。否则这可能会对您的系统造成破坏。插件不对此负责。
本章内容不建议普通用户/初学者阅读。您需要拥有Lua基础才能理解本章内容。
基本介绍
脚本存放于 plugins/CoralFans/data/simplayer/scripts/
下。其内部至少应有两个函数: Init
和 Tick
。两个函数均返回 boolean
类型的值。若返回值为 false
则中断脚本执行。特别地, Init
函数接受一个 string
类型的参数,这使得玩家可以通过指令向脚本传参。
以下是一个最简单的可执行脚本。该脚本会执行一次 Init
函数与一次 Tick
函数。第一次执行 Tick
函数时就返回了 false
,故不会重复执行。
function Init(arg)
return true
end
function Tick()
return false
endCopy to clipboardErrorCopied
执行流程
- 新建Lua虚拟机并打开标准库
- 加载
log
函数 - 执行配置文件中的
preload
字符串 (luaL_dostring
) - 加载内建类型与变量
- 将脚本的执行文件夹添加到
require
的寻找路径中 - 执行脚本 (
luaL_dofile
) - 运行一次
Init
函数 (lua_pcall
) - 如果
Init
函数返回true
,则第一次执行Tick
函数 (lua_pcall
) - 如果第一次执行
Tick
函数返回true
,则将Tick
函数的执行交由调度器管理,继续执行。 - 若执行过程中出错/函数返回
false
,则中断执行。
- 你可以在src/cfsp/simplayer/luaapi/SpLuaApi.cpp#L49中找到更多信息
内建数据
函数
log
log(...)Copy to clipboardErrorCopied
- 输出传入的信息,以
\t
分隔。该函数会调用传入参数的__tostring
元方法。 - 建议在脚本中使用
log
替换print
。
类型
- 所有的类型均由
userdata
实现
vec3
- 浮点坐标
对于类型 ( foo.bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
new | number , number , number | vec3 | 构造一个 vec3 |
newHalf | – | vec3 | 构造C++中的 Vec3::HALF |
newMax | – | vec3 | 构造C++中的 Vec3::MAX |
newMin | – | vec3 | 构造C++中的 Vec3::MIN |
newNegUnitX | – | vec3 | 构造C++中的 Vec3::NEG_UNIT_X |
newNegUnitY | – | vec3 | 构造C++中的 Vec3::NEG_UNIT_Y |
newNegUnitZ | – | vec3 | 构造C++中的 Vec3::NEG_UNIT_Z |
newOne | – | vec3 | 构造C++中的 Vec3::ONE |
newTwo | – | vec3 | 构造C++中的 Vec3::TWO |
newUnitX | – | vec3 | 构造C++中的 Vec3::UNIT_X |
newUnitY | – | vec3 | 构造C++中的 Vec3::UNIT_Y |
newUnitZ | – | vec3 | 构造C++中的 Vec3::UNIT_Z |
newZero | – | vec3 | 构造C++中的 Vec3::ZERO |
newFromRotation | vec2 | vec3 | 调用C++中的 Vec3::directionFromRotation |
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
get | – | number , number , number | 获取存储的xyz值 |
元方法
函数 | 用途 |
---|---|
__tostring | 调用C++中的 Vec3::toString |
__add | 调用C++中的 Vec3::operator+ |
__sub | 调用C++中的 Vec3::operator- |
__eq | 调用C++中的 Vec3::operator== |
blockpos
- 整数坐标/方块坐标
对于类型 ( foo.bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
new | integer , integer , integer | blockpos | 构造一个 blockpos |
newMax | – | blockpos | 构造C++中的 BlockPos::MAX |
newMin | – | blockpos | 构造C++中的 BlockPos::MIN |
newOne | – | blockpos | 构造C++中的 BlockPos::ONE |
newZero | – | blockpos | 构造C++中的 BlockPos::ZERO |
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
get | – | integer , integer , integer | 获取存储的xyz值 |
bottomCenter | – | vec3 | 调用C++中的 BlockPos::bottomCenter |
center | – | vec3 | 调用C++中的 BlockPos::center |
toVec3 | – | vec3 | 调用C++中的 BlockPos::operator class Vec3 |
neighbor | – | blockpos | 调用C++中的 BlockPos::neighbor |
元方法
函数 | 用途 |
---|---|
__tostring | 调用C++中的 BlockPos::toString |
__add | 调用C++中的 BlockPos::operator+ |
__sub | 调用C++中的 BlockPos::operator- |
__eq | 调用C++中的 BlockPos::operator== |
vec2
- 浮点视角
对于类型 ( foo.bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
new | number , number | vec2 | 构造一个 vec2 |
newLowest | – | vec2 | 构造C++中的 Vec2::LOWEST |
newMax | – | vec2 | 构造C++中的 Vec2::MAX |
newMin | – | vec2 | 构造C++中的 Vec2::MIN |
newNegUnitX | – | vec2 | 构造C++中的 Vec2::NEG_UNIT_X |
newNegUnitY | – | vec2 | 构造C++中的 Vec2::NEG_UNIT_Y |
newOne | – | vec2 | 构造C++中的 Vec2::ONE |
newUnitY | – | vec2 | 构造C++中的 Vec2::UNIT_Y |
newUnitX | – | vec2 | 构造C++中的 Vec2::UNIT_X |
newZero | – | vec2 | 构造C++中的 Vec2::ZERO |
newFromRotation | vec3 | vec2 | 调用C++中的 Vec3::rotationFromDirection |
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
get | – | number , number | 获取存储的xy值 |
元方法
函数 | 用途 |
---|---|
__tostring | 调用C++中的 Vec2::toString |
__add | 调用C++中的 Vec2::operator+ |
__sub | 调用C++中的 Vec2::operator- |
__eq | 调用C++中的 Vec2::operator== |
blockinfo
- 方块信息
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
getName | – | string | 获取游戏内显示的方块名称 |
getType | – | string | 获取方块标准类型名 |
getId | – | integer | 获取方块的游戏内id |
getPos | – | blockpos | 获取方块所在坐标 |
getDim | – | integer | 获取方块所在维度ID |
getVariant | – | integer | 获取方块特殊值 |
getTranslucency | – | number | 获取方块透明度 |
getThickness | – | number | 获取方块厚度 |
isAir | – | boolean | 方块是否为空气 |
isBounceBlock | – | boolean | 是否为可弹跳方块 |
isButtonBlock | – | boolean | 是否为按钮方块 |
isCropBlock | – | boolean | 是否为农作物方块 |
isDoorBlock | – | boolean | 是否为门方块 |
isFallingBlock | – | boolean | 是否为可落下的方块 |
isFenceBlock | – | boolean | 是否为栅栏方块 |
isFenceGateBlock | – | boolean | 是否为栅栏门方块 |
isSlabBlock | – | boolean | 是否为半砖方块 |
isStemBlock | – | boolean | 是否为干方块 |
isThinFenceBlock | – | boolean | 是否为细栅栏方块 |
isUnbreakable | – | boolean | 方块是否为不可破坏 |
isWaterBlockingBlock | – | boolean | 方块是否可阻挡水 |
getNbtTable | – | table | 获取nbt转成的table |
getSnbt | – | string | 获取未格式化的Snbt |
getSnbtWithPath | string | string | 访问特定path的nbt。 a.b[1].c 指向根标签下a标签下b数组的第二个元素的c标签 |
元方法
函数 | 用途 |
---|---|
__eq | 判断两个 blockinfo 是否严格相等 |
__gc | 垃圾回收 |
blocksource
- 代表游戏中的一片区域(Region),可用于获取指定位置的方块信息
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
getBlockInfo | blockpos | blockinfo | 获取指定位置的方块信息 |
level
- 代表游戏存档,可用于获取时间/MSPT信息
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
getDayTime | – | integer | 获取自日出以来的游戏刻 |
getGameTime | – | integer | 获取世界总共流逝的游戏刻数 |
getDay | – | integer | 获取已流逝的游戏天数 |
getMspt | – | number | 获取当前的服务器MSPT信息 |
iteminfo
- 物品信息
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
getName | – | string | 游戏内显示的物品名称 |
getType | – | string | 物品标准类型名 |
getId | – | integer | 物品的游戏内id |
getCount | – | integer | 这个物品对象堆叠的个数 |
getAux | – | integer | 物品附加值 |
getDamage | – | integer | 物品当前耐久 |
getAttackDamage | – | integer | 物品攻击伤害 |
getMaxDamage | – | integer | 物品最大耐久 |
getMaxStackSize | – | integer | 物品最大堆叠数 |
getLore | – | table | 物品的Lore |
isArmorItem | – | boolean | 物品是否为盔甲 |
isBlock | – | boolean | 物品是否为方块 |
isDamageableItem | – | boolean | 物品是否可被破坏 |
isDamaged | – | boolean | 物品耐久是否被消耗 |
isEnchanted | – | boolean | 物品是否已被附魔 |
isEnchantingBook | – | boolean | 物品是否为附魔书 |
isFireResistant | – | boolean | 物品是否防火 |
isFullStack | – | boolean | 物品是否已堆叠到最大堆叠数 |
isGlint | – | boolean | 物品是否闪烁 |
isHorseArmorItem | – | boolean | 物品是否为马铠 |
isLiquidClipItem | – | boolean | 物品是否能与液体方块交互 |
isMusicDiscItem | – | boolean | 物品是否为唱片 |
isOffhandItem | – | boolean | 物品是否可设置到副手 |
isPotionItem | – | boolean | 物品是否为药水 |
isStackable | – | boolean | 物品是否可堆叠 |
isWearableItem | – | boolean | 物品是否可穿戴 |
getNbtTable | – | table | 获取nbt转成的table |
getSnbt | – | string | 获取未格式化的Snbt |
getSnbtWithPath | string | string | 访问特定path的nbt。 a.b[1].c 指向根标签下a标签下b数组的第二个元素的c标签 |
元方法
函数 | 用途 |
---|---|
__eq | 判断两个 iteminfo 是否严格相等 |
__gc | 垃圾回收 |
simplayer
- 假人对象
对于具体变量 ( foo:bar()
调用方式 )
函数 | 参数 | 返回 | 用途 |
---|---|---|---|
getName | – | string | 获取假人真名 |
getXuid | – | string | 获取假人XUID |
getStatus | – | integer | 获取假人状态 0.离线 1.存活 2.死亡 |
getPos | – | vec3 | 获取假人眼部位置 |
getFeetPos | – | vec3 | 获取假人脚部位置 |
getStandingOn | – | blockpos | 获取假人所站方块的位置 |
getRot | – | vec2 | 获取假人视角 |
getHealth | – | integer | 获取假人生命值 |
getHunger | – | number | 获取假人饥饿值 |
sneaking | boolean | boolean | 设置假人是否潜行,返回是否成功 |
swimming | boolean | – | 设置假人是否游泳/趴下 |
attack | – | boolean | 假人攻击,返回是否成功 |
chat | string | – | 假人发送消息 |
destroy | – | boolean | 假人破坏方块,返回是否成功 |
dropSelectedItem | – | boolean | 假人丢出手持物品,返回是否成功 |
dropInv | – | boolean | 假人丢出背包(不包括副手、盔甲栏、末影箱)物品,返回是否成功 |
runCmd | string | boolean | 假人执行指令,返回是否成功 |
getBlockPosFromView | – | blockpos | 获取假人视线指向的方块坐标(手长5.25f) |
searchInInvWithId | integer[, integer] | integer | 在假人背包内搜索给定id的物品,若给出第二个参数则从指定位置开始搜索。返回找到的第一个物品的槽位 |
searchInInvWithName | string[, integer] | integer | 在假人背包内搜索给定name的物品,若给出第二个参数则从指定位置开始搜索。返回找到的第一个物品的槽位 |
selectSlot | integer | boolean | 将手持物品与指定槽位物品交换,返回是否成功 |
select | integer | boolean | 将手持物品与背包内指定id的第一个物品交换,返回是否成功 |
getItemFromInv | integer | iteminfo | 返回背包内指定槽位的物品信息 |
interact | – | boolean | 假人交互,返回是否成功 |
jump | – | boolean | 假人跳跃,返回是否成功 |
useItem | integer | – | 假人使用物品,并在指定tick后停止使用 |
startBuild | – | – | 假人开始搭建方块 |
lookAt | vec3 | – | 假人看向指定坐标 |
moveTo | vec3 | – | 假人移动到指定坐标 |
navigateTo | vec3 | – | 假人寻路走到指定坐标 |
isTaskFree | – | boolean | 假人是否没有在执行动作 |
stopAction | – | – | 停止假人所有动作 |
getFirstEmptySlot | – | – | 获取假人背包内的第一个空位,全满返回-1 |
tryPutIntoContainer | integer | integer | 将假人背包内指定槽位的物品存放至指向容器。返回值枚举 |
tryGetFromContainerWithName | string | integer | 从指向容器获取一堆指定type的物品。返回值枚举 |
元方法
函数 | 用途 |
---|---|
__gc | 垃圾回收 |
变量
请不要给内置变量重新赋值!
BlockSource
代表假人所在的一片世界区域,可用于获取指定方块信息Level
代表假人所在的存档,可用于获取时间/MSPT信息SimPlayer
代表执行脚本的假人对象
其他技巧与说明信息
- 建议在非生产环境测试脚本能用后再部署到实际的服务器中,防止出现未知的错误或者崩溃
- 您只应上传受信任的脚本供玩家执行
- 如果发生错误,插件会在服务器内广播错误信息
- 设定Tick执行间隔的时候优先使用script子命令内的参数,而不是使用脚本内计数器的方案,这样可以降低一定卡顿
- 暂未性能进行测试,如果发现明显的掉刻,请优化自己编写的脚本,减少函数执行频率,甚至停止脚本的使用
- 不使用该功能时不会产生任何额外的卡顿
- 如果发现任何(非编程上的)问题,请前往GitHub反馈
实例
- 下面是两个简单的实例,可用于熟悉/测试脚本API
假人播报消息
function Init(arg) -- 初始化函数
log(SimPlayer:getName(), SimPlayer:getXuid(), "script test1 run", arg) -- 在控制台输出信息
return true -- 返回真以继续执行
end
function Tick() -- 循环执行函数
SimPlayer:chat(string.format("MSPT 是 %.3f",Level:getMspt())) -- 播报mspt
SimPlayer:chat(string.format("现在的时间是 %d 游戏刻是 %d",Level:getDayTime(),Level:getGameTime())) -- 播报时间
local x, y, z = SimPlayer:getPos():get() -- 获取眼部坐标
SimPlayer:chat(string.format("我的坐标是%.3f %.3f %.3f", x, y, z)) -- 播报坐标
local hungry = SimPlayer:getHunger() -- 获取饥饿值
local health = SimPlayer:getHealth() -- 获取生命值
SimPlayer:chat(string.format("我的饥饿度是 %.3f,我的血量是 %d",hungry,health)) -- 播报饥饿值与生命值
local stand = SimPlayer:getStandingOn() -- 获取所站方块的坐标
local sx, sy, sz = stand:get() -- 展开具体xyz
local blockInfo = BlockSource:getBlockInfo(stand) -- 获取所站方块的信息
SimPlayer:chat(string.format("我站的方块坐标是 %.3f %.3f %.3f 脚底的方块类型是 %s id 是 %d", sx, sy, sz,
blockInfo:getName(), blockInfo:getId())) -- 播报方块信息
return true -- 一直返回真,会一直循环执行
endCopy to clipboardErrorCopied
- 保存脚本至
plugins/CoralFans/data/simplayer/scripts/test1.lua
- 执行指令
sp p SIM-bot script test1.lua
,可以让假人SIM-bot
每20gt播报一次信息
假人自动搭高
TickTime = 0; -- 计时
Stand = nil -- 所站方块位置
Blocks = 0
function Init(arg) -- 初始化函数
log(SimPlayer:getName(), SimPlayer:getXuid(), "script test2 run", arg) -- 在控制台输出信息
Stand = SimPlayer:getStandingOn() -- 记录所站方块坐标
SimPlayer:select(12) -- 选中背包内的沙子
Blocks = tonumber(arg) -- 获取传入参数
SimPlayer:lookAt(Stand:center()) -- 看向脚下方块的中心
SimPlayer:startBuild() -- 开始搭建方块
return true -- 返回真以继续执行
end
function Tick() -- 循环执行函数
if TickTime == 20 * Blocks then
SimPlayer:stopAction() -- 停止操作(搭建方块)
return false
end -- 如果执行了20 * Blocks gt,中断
if TickTime % 20 == 0 then -- 每执行20gt
Stand = SimPlayer:getStandingOn() -- 记录所站坐标
SimPlayer:jump() -- 起跳
end
SimPlayer:lookAt(Stand:center()) -- 看向脚下方块的中心
TickTime = TickTime + 1 -- 计时器+1
return true -- 返回真以执行下一次
endCopy to clipboardErrorCopied
- 保存脚本至
plugins/CoralFans/data/simplayer/scripts/test2.lua
- 执行指令
sp p SIM-bot script test2.lua 1 10
,可以让假人SIM-bot
用背包里的沙子原地搭高10个方块
CFSP DLL API DOC
DLLAPI
xmake配置
- 按顺序导入相关库
- 在target内添加依赖
- 引入头文件即可使用
以下是导入相关库的例子
add_requires("boost", {configs = {all = true}})
add_requires("levilamina", "timewheel", "CFSP")Copy to clipboardErrorCopied
头文件
- 一般地,您仅需要使用
cfsp/simplayer/CFSP.h
。其他头文件定义的函数/数据并没有通过dllexport导出。 - 所有导出的函数都由
CFSP_API
标记。您可以查阅src/cfsp/simplayer/CFSP.h来查看您可以调用哪些函数。 - 大部分函数的定义都是比较易懂的。你可以看指令系统是如何调用的来理解这些函数的意义。
- 额外地,我们提供了一些接口以获取
SimPlayerInfo
以及相关信息。 SimPlayerInfo
的部分成员函数在自身指向游戏中假人的指针为空时会抛出错误。
Q&A
Linux能用吗
不直接能。目前LeviLamina和CF都没有直接支持Linux系统。你可能需要 wine
等工具模拟Windows环境来运行。
单人/手机能用吗
不直接能。CF是服务器插件,你可以开一个本地服务器来运行,然后单人/用手机加入服务器。
Realms领域服能用吗
不能。Realms没有插件加载器
我用的某(可能是公益/面板)服务器提供商,能用吗
不一定能。这取决于它是否提供BDS with LeviLamina服务器。如果没有LeviLamina此插件无法运行。建议:使用VPS自行搭建服务器。
看不懂教程怎么办
如果是教程有表达不清楚的地方,欢迎提Issue/PR。
I’m not good at Chinese
Sorry, I’m not good at English. — odorajbotoj
I18N coming soon.
我的可视化不显示怎么办
检查前置资源包是否加载并全局启用。
1.xx.xx版本能用吗
CF目前基于LL 0.13.5,BDS版本为1.21.3.01,兼容的客户端版本应为1.21.2。
会适配新版吗
取决于加载器能不能更新
假人总是崩怎么办
注意,CF旧版本自带的假人系统与CFSP并不兼容,且含有较多bug。请更新您的CF与CFSP
你可以分析log文件并提出issue。我们会阅读的。