27个版本 (破坏性)
0.31.0 | 2024年1月29日 |
---|---|
0.30.0 | 2023年9月23日 |
0.29.0 | 2023年8月14日 |
0.28.0 | 2023年4月8日 |
0.14.1 | 2020年11月27日 |
#104 in 游戏
每月301次下载
在 3 个crate中使用
3.5MB
14K SLoC
fastnbt项目
FastNBT是用于《Minecraft: Java版》NBT格式的序列化和反序列化工具,包括Value
类型和nbt!
宏。有关字符串化NBT(sNBT)信息,请参阅FastSNBT。
FastAnvil允许渲染世界地图,并提供Region
结构以使用区域文件格式。支持从1.20到1.13的所有版本,并对1.12版本提供有限的兼容性。
以下是一个基于浏览器、由Rust到WASM驱动的Minecraft地图渲染器演示。
演示
在owengage.com/anvil上查看Hermitcraft第8季和其他演示。
来自fastnbt-tools
的anvil
二进制文件可以充分利用您的CPU来渲染世界。
示例
可以在fastnbt/examples
、fastanvil/examples
和tools/src
中找到许多示例。以下是一些示例的重现。
示例:编辑level.dat
以下操作将世界出生点设置为250,200,250(可能不是好主意!)。完整的示例在fastnbt/examples目录中。
#[derive(Serialize, Deserialize)]
struct LevelDat {
#[serde(rename = "Data")]
data: Data,
}
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct Data {
spawn_x: i32,
spawn_y: i32,
spawn_z: i32,
#[serde(flatten)]
other: HashMap<String, Value>,
}
fn main() {
let args: Vec<_> = std::env::args_os().collect();
let file = std::fs::File::open(&args[1]).unwrap();
let mut decoder = GzDecoder::new(file);
let mut bytes = vec![];
decoder.read_to_end(&mut bytes).unwrap();
let mut leveldat: LevelDat = fastnbt::from_bytes(&bytes).unwrap();
leveldat.data.spawn_x = 250;
leveldat.data.spawn_y = 200;
leveldat.data.spawn_z = 250;
let new_bytes = fastnbt::to_bytes(&leveldat).unwrap();
let outfile = std::fs::File::create("level.dat").unwrap();
let mut encoder = GzEncoder::new(outfile, Compression::fast());
encoder.write_all(&new_bytes).unwrap();
}
示例:打印玩家库存
此示例演示如何从世界中的玩家数据文件打印出玩家的库存和末影箱内容。我们
- 使用serde的重命名属性以使rustfmt符合字段名称,
- 使用生命周期以节省字符串分配,并
- 使用
Value
类型反序列化我们未指定确切结构的字段。
#[derive(Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
struct PlayerDat<'a> {
data_version: i32,
#[serde(borrow)]
inventory: Vec<InventorySlot<'a>>,
ender_items: Vec<InventorySlot<'a>>,
}
#[derive(Deserialize, Debug)]
struct InventorySlot<'a> {
id: &'a str, // We avoid allocating a string here.
tag: Option<Value>, // Also get the less structured properties of the object.
// We need to rename fields a lot.
#[serde(rename = "Count")]
count: i8,
}
fn main() {
let args: Vec<_> = std::env::args().skip(1).collect();
let file = std::fs::File::open(args[0].clone()).unwrap();
// Player dat files are compressed with GZip.
let mut decoder = GzDecoder::new(file);
let mut data = vec![];
decoder.read_to_end(&mut data).unwrap();
let player: Result<PlayerDat> = from_bytes(data.as_slice());
println!("{:#?}", player);
}
用法
对于库
[dependencies]
fastnbt = "2"
fastanvil = "0.31"
对于anvil
可执行文件
cargo install fastnbt-tools
lib.rs
:
用于处理Minecraft的区域格式Anvil。这个crate主要用于支持创建Minecraft世界的地图,目前尚不稳定(针对1.0版本)。在这个crate中,`Region` 结构体可能是最通用的部分。
这个crate还包含一个 JavaChunk
,允许将1.18版本及以下版本的数据块反序列化为一些结构体。然而,这并不记录数据块中的所有信息,例如实体信息会丢失。因此,它不适用于将数据块重新序列化到区域中。
您可以使用 fastnbt
创建自己的数据块结构来(反)序列化。
Region
可以提供一个 Read
、Write
和 Seek
类型,例如一个文件,以便读取和写入数据块数据。
crate功能
- render - 默认启用此功能,它封装了所有与世界渲染相关的功能。
依赖关系
~0.9–9MB
~81K SLoC