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 游戏

Download history 18/week @ 2024-04-20 29/week @ 2024-04-27 34/week @ 2024-05-04 88/week @ 2024-05-11 53/week @ 2024-05-18 41/week @ 2024-05-25 45/week @ 2024-06-01 29/week @ 2024-06-08 21/week @ 2024-06-15 21/week @ 2024-06-22 43/week @ 2024-06-29 12/week @ 2024-07-06 13/week @ 2024-07-13 13/week @ 2024-07-20 167/week @ 2024-07-27 107/week @ 2024-08-03

每月301次下载
3 个crate中使用

MIT/Apache

3.5MB
14K SLoC

fastnbt项目

fastnbt-shield fastnbt-version-shield fastnbt-docs-shield build-status-shield

fastsnbt-shield fastsnbt-version-shield fastsnbt-docs-shield

fastanvil-shield fastanvil-version-shield fastanvil-docs-shield

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季和其他演示。

alt rendered map

来自fastnbt-toolsanvil二进制文件可以充分利用您的CPU来渲染世界。

示例

可以在fastnbt/examplesfastanvil/examplestools/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 可以提供一个 ReadWriteSeek 类型,例如一个文件,以便读取和写入数据块数据。

crate功能

  • render - 默认启用此功能,它封装了所有与世界渲染相关的功能。

依赖关系

~0.9–9MB
~81K SLoC