#minecraft #execute-command #minecraft-mod #command-output #vanilla #log-file #connection

minect

一个允许 Rust 程序连接到正在运行的 Minecraft 实例而不需要任何 Minecraft 模组的库

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 中使用

GPL-3.0-or-later

140KB
2.5K SLoC

Minecraft: Java Edition 1.14.1 - 1.20.4 Minecraft: Bedrock Edition unsupported
crates.io Build Status

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 程序都可以使用不同的连接标识符。

读取日志文件

当执行应该记录输出的命令时,必须考虑以下游戏规则

  1. logAdminCommands:为了Minecraft将命令输出写入日志文件,此值必须设置为 true
  2. commandBlockOutput:为了命令方块和命令方块矿车广播它们的命令输出,此值必须设置为 true
  3. 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