5 个版本
0.2.1 | 2023 年 12 月 30 日 |
---|---|
0.2.0 | 2023 年 6 月 29 日 |
0.1.2 | 2023 年 4 月 2 日 |
0.1.1 | 2023 年 3 月 27 日 |
0.1.0 | 2023 年 1 月 29 日 |
#28 在 游戏中
每月 49 次下载
在 2 crates 中使用
140KB
2.5K SLoC
Minect
Minect(发音为 maɪnɛkt,类似于 Minecraft 的 connection)是一个允许 Rust 程序连接到正在运行的 Minecraft 实例而不需要任何 Minecraft 模组的库。这个想法起源于 Java 库 Vanilla Injection。
使用 Minect,Rust 程序可以在 Minecraft 中执行命令并监听命令输出。这样,Rust 程序就可以控制或被 Minecraft 控制。
连接需要 Minecraft 中的建筑,该建筑持续加载包含由 Rust 程序生成的命令的结构文件。通过轮询 Minecraft 的日志文件来监听它们的输出。
示例
let identifier = "MyProgram";
let world_dir = "C:/Users/Herobrine/AppData/Roaming/.minecraft/saves/New World";
let mut connection = MinecraftConnection::builder(identifier, world_dir).build();
println!("If you are connecting for the first time please execute /reload in Minecraft.");
connection.connect().await?;
let events = connection.add_listener();
connection.execute_commands([
Command::new("scoreboard objectives add example dummy"),
Command::new("scoreboard players set Herobrine example 42"),
Command::new(query_scoreboard_command("Herobrine", "example")),
])?;
let output = events
.filter_map(|event| event.output.parse::<QueryScoreboardOutput>().ok())
.next()
.await
.expect("Minecraft connection was closed unexpectedly");
println!("{}'s score is {}", output.entity, output.score);
安装
为了设置 Minecraft 中的建筑,Minect 提供了函数 MinecraftConnection::connect
。在此函数阻塞时,玩家可以在 Minecraft 中执行 /reload
命令来启动一个交互式安装程序。
配置
默认情况下,连接以每秒 20 次执行的最大速率运行(每个游戏刻一次执行)。对于较慢的计算机,可以通过在分数板 minect_config
中增加评分 update_delay
来进行配置。例如,要使所有连接每秒更新一次(每个 20 个游戏刻更新一次),请执行以下命令
scoreboard players set update_delay minect_config 20
连接标识符
Minect 支持并行运行多个连接建筑,每个都有唯一的标识符。单个连接建筑可以被任何数量的 Rust 程序共享,但它被限制为每个 update_delay
游戏刻执行一次。为了获得最佳性能,每个 Rust 程序都可以使用不同的连接标识符。
读取日志文件
当执行应该记录输出的命令时,必须考虑以下游戏规则
logAdminCommands
:为了Minecraft将命令输出写入日志文件,此值必须设置为true
。commandBlockOutput
:为了命令方块和命令方块矿车广播它们的命令输出,此值必须设置为true
。sendCommandFeedback
:应将其设置为false
以防止输出也被写入聊天,这可能会让玩家感到烦恼。
为了简化操作,Minect提供了一个函数 enable_logging_command()
来生成一个设置这些游戏规则的命令,以及 reset_logging_command()
来将它们重置为之前的值。默认情况下,这两个命令会在将所有命令传递给 execute_commands
之前/之后自动执行。为了完全控制,可以在创建 MinecraftConnection
时禁用此功能。
数据包
即使在上述提到的游戏规则设置正确的情况下,数据包(在mcfunction文件中的命令)的输出也不会被记录。Minect提供了两种方法来解决这个问题:您可以使用函数 logged_block_commands(command)
来生成一个命令方块,或者使用函数 logged_cart_command(command)
来生成一个命令方块矿车,然后执行提供的命令。命令会在数据包函数完成后稍作延迟后执行。
let mut commands = Vec::new();
commands.push("say querying scoreboard ...".to_string());
commands.extend(logged_block_commands(query_scoreboard_command("@p", "my_scoreboard")));
let my_function = commands.join("\n");
// Generate datapack containing my_function ...
// Call my_function (could also be done in Minecraft)
connection.execute_commands(["function my_namespace:my_function"])?;
删除连接
要删除在Minecraft中构建的连接,玩家可以执行 function minect:disconnect
来选择要删除的连接。
卸载
要完全卸载Minecraft中的Minect,玩家可以执行 function minect:uninstall
来启动交互式卸载程序。
或者,function minect:uninstall_completely
将无条件卸载Minect。
在Minecraft中卸载Minect会删除计分板、连接并禁用数据包。之后,以下目录仍需要手动从世界目录中删除
- datapacks/minect
- generated/minect
依赖项
~8–18MB
~298K SLoC