方块转换和 NBT 示例
方块转换 API
lua
local blocks = omega.blocks
1
将传统格式方块转换为 runtime id 表示
blocks.legacy_block_to_rtid
: 将传统格式方块转换为 runtime id 表示 (注意,不应在文件中保存 runtime id,因为 runtime id 会随版本变化)lualocal rtid, found = blocks.legacy_block_to_rtid("stained_glass", 1) print(found, rtid)
1
2
将 runtime id 表示的方块转为传统表示
blocks.rtid_to_legacy_block
lualocal blockName, blockData, found = blocks.rtid_to_legacy_block(rtid) print(found, blockName, blockData)
1
2
将 runtime id 表示的方块转为 block name 和 block state 表示
blocks.rtid_to_block_name_and_state
lualocal blockName, blockState, found = blocks.rtid_to_block_name_and_state(rtid) print(found, ("%s [%s]"):format(blockName, blockState))
1
2
将 block name 和 block state 表示转为 runtime id 表示
blocks.block_name_and_state_to_rtid
lualocal rtid, found = blocks.block_name_and_state_to_rtid(blockName, blockState) print(found, rtid)
1
2
将 runtime id 表示的方块转为 Java 表示
blocks.rtid_to_java_str
lualocal java_str, found = blocks.rtid_to_java_str(rtid) print(found, java_str)
1
2
将 Java 表示转为 runtime id 表示
blocks.java_str_to_rtid
lualocal rtid, found = blocks.java_str_to_rtid(java_str) print(found, rtid)
1
2
NBT 编辑与生成操作
lua
local nbt = blocks.new_nbt()
1
从方块 NBT 中读取 ID
nbt:get_id()
lualocal nbt_block_id = nbt:get_id()
1
从方块 NBT 中读取某个 key 的 string
nbt:get_string(key)
lualocal value = nbt:get_string("name")
1
将方块 NBT 中某个 key 的值设置为指定 string
nbt:set_string(key, value)
lualocal value = nbt:set_string("name", "#test")
1
复制 NBT 并获得副本
nbt:copy()
lualocal copied_nbt = nbt:copy()
1
将 NBT 转为字符串表示
nbt:to_str()
lualocal string_represent = nbt:to_str()
1
将字符串表示的内容恢复到此 NBT
nbt:from_str(string_represent)
lualocal nbt = nbt:from_str(string_represent)
1
检查 NBT 是否为空
nbt:is_empty()
lualocal is_empty = nbt:is_empty()
1
清除 NBT 内数据
nbt:empty()
luanbt:empty()
1
建筑和画布操作
structures.convert_file_to_structure(structure_path, structure_file_path)
: 实现了 AreaChunk 和 Structure 概念,将文件转换为结构lualocal structures = omega.structures local source_structure = structures.convert_file_to_structure(source_structure_dir, source_structure_file)
1
2structures.open_or_create_structure(path)
: 打开或创建结构lualocal structures = omega.structures local source_structure = structures.open_or_create_structure("some_dir")
1
2structures.new_canvas()
: 创建一个新的 Canvas 对象lualocal canvas = structures.new_canvas()
1
Area Chunk 操作
复制和移动区域
structures.copy(source, target, source_start_pos, source_end_pos, offset)
lualocal structures = omega.structures local source_start_pos = source_structure_or_canvas:get_start_pos() local source_end_pos = source_structure_or_canvas:get_end_pos() local offset = { x = 0, y = 0, z = 0 } structures.copy(source_structure_or_canvas, target_structure_or_canvas, source_start_pos, source_end_pos, offset)
1
2
3
4
5
调用 omega builder 构建区块范围的方块
when_progress_increased_by_build(aread_chunk, start_pos, end_pos, target_pos, option)
luacoromega:when_progress_increased_by_build( target_structure_or_canvas, target_structure_or_canvas:get_start_pos(), target_structure_or_canvas:get_end_pos(), { x = 31000, y = 100, z = 11000 }, { speed = 2000, incremental = false, force_use_block_state = false, ignore_nbt_block = false, clear_target_block = false, clear_dropped_item = false, auto_reverse = true, start_hop = 0, } ):start_new(function(total, current) coromega:print(("progress: %d/%d"):format(total, current)) end)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
获取和设置区域起点和终点
structure/canvas:get_start_pos()
lualocal start_pos = structure/canvas:get_start_pos()
1structure/canvas:set_start_pos(pos)
luastructure/canvas:set_start_pos(pos)
1structure/canvas:get_end_pos()
lualocal end_pos = structure/canvas:get_end_pos()
1structure/canvas:set_end_pos(pos)
luastructure/canvas:set_end_pos(pos)
1
检查和设置区域属性
structure/canvas:get_must_block_state()
lualocal must_block_state = structure/canvas:get_must_block_state()
1structure/canvas:set_must_block_state(must_block_state)
luastructure/canvas:set_must_block_state(true)
1
请求一个区域的所有方块
request_structure(start_pos, region_size, move_bot)
lualocal start_pos = { x = 10001, y = 100, z = 10000 } local region_size = { x = 14, y = 3, z = 4 } local move_bot = true local canvas = coromega:request_structure(start_pos, region_size, move_bot)
1
2
3
4
对区域内所有方块应用读取函数
structure/canvas:apply_reader_to_blocks(start_pos, end_pos, reader_fn, option_ignore_air_block, option_ignore_nbt_block, option_ignore_normal_block)
lualocal function dump_region_snbt(start_pos, region_size) local move_bot = true local canvas = coromega:request_structure(start_pos, region_size, move_bot) local start_pos = canvas:get_start_pos() local end_pos = canvas:get_end_pos() local option_ignore_air_block = true local option_ignore_nbt_block = false local option_ignore_normal_block = true local reader_fn = function(x, y, z, block_rtid, nbt) -- 实际读取和打印操作 end canvas:apply_reader_to_blocks( start_pos, end_pos, reader_fn, option_ignore_air_block, option_ignore_nbt_block, option_ignore_normal_block ) end coromega:start_new(function() coromega:sleep(1) dump_region_snbt({ x = 10001, y = 100, z = 10000 }, { x = 14, y = 3, z = 4 }) end) coromega:run()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
对区域内所有方块应用变换
structure/canvas:apply_alter_to_blocks(start_pos, end_pos, alter_fn, option_ignore_air_block, option_ignore_nbt_block, option_ignore_normal_block)
lualocal alter_start_pos = source_structure:get_start_pos() local alter_end_pos = source_structure:get_end_pos() local option_ignore_air_block = true local option_ignore_nbt_block = false local option_ignore_normal_block = true local alter_fn = function(x, y, z, block_rtid, nbt) -- 实际变换操作 return block_rtid, nbt end target_structure:apply_alter_to_blocks( alter_start_pos, alter_end_pos, alter_fn, option_ignore_air_block, option_ignore_nbt_block, option_ignore_normal_block )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Structure 操作
获得
区域块
structure:copy_area(source, start_pos, end_pos)
lualocal area = structure:copy_area(source_structure, start_pos, end_pos)
1
获得结构块的大小
structure:get_area_size()
lualocal size = structure:get_area_size()
1
请求结构块
request_structure(start_pos, region_size, move_bot)
lualocal start_pos = { x = 10001, y = 100, z = 10000 } local region_size = { x = 14, y = 3, z = 4 } local move_bot = true local canvas = coromega:request_structure(start_pos, region_size, move_bot)
1
2
3
4