傀儡玩家

傀儡玩家

简易实现,用于模拟‘木偶’玩家

游戏机制

标志

傀儡玩家

一个用于在 Minecraft 中创建虚假“傀儡”玩家的 Fabric 模组

关于项目

这是一个现代、简洁的实现,原本由 Carpet Mod 实现的虚假玩家功能。

与 Carpet Mod 的原始实现相比,这些虚假玩家的实现方式存在一些根本性差异。

此模组可以与 Carpet Mod 一同使用,carpet 的虚假玩家操作适用于这些傀儡玩家;不过,建议使用本模组提供的操作。

本模组的目的是尽可能让傀儡玩家的行为与现实玩家保持一致:

  • 所有的玩家 tick 都在正确的 tick 阶段执行。
  • 玩家行为的客户端代码在服务器端模拟。
  • 傀儡玩家像真实玩家一样发送数据包与服务器交互。
  • 保持与所有模组的兼容性。

使用

安装模组后,/puppet 命令应可供管理员使用。 通过修改配置,也可以让所有玩家使用 /puppet 命令,更多详情请参阅 配置部分

我们可以使用以下命令之一让一个傀儡玩家加入世界:

/puppet <用户名> join
/puppet <用户名> spawn
/puppet <用户名> spawn at <位置> facing <旋转> in <维度> in <游戏模式>
/puppet <用户名> shadow
  • join 子命令会在其上次注销的位置生成指定傀儡,这本质上模拟了玩家自己加入服务器的过程。
  • spawn 子命令会在指定位置或(如果未指定位置)命令执行者的位置生成指定傀儡。
  • shadow 子命令会让一个傀儡玩家在某个当前在线玩家的位置加入。

玩家加入世界后,可以通过运行以下命令让玩家离开:

/puppet <玩家> leave

操控

玩家可以接管一个傀儡并操纵它,将自己的身体留在世界中:

/puppet <玩家>

你只能指定傀儡来操控,或者如果你正在操控,可以指定自己,这会将你放回原来的身体。此功能默认禁用,必须通过设置 enable_puppeteering 来启用,请参阅 配置部分

操控期间,你向其他玩家显示为傀儡形象,并接管傀儡的位置及其物品栏。操控停止后,您对傀儡所做的一切将保留。不过,统计信息和进度仍然绑定到你的账户。聊天也是如此,消息仍然通过你的账户发送。

当你操控时,你原来的身体会变为一个傀儡,因此你可以像对待其他傀儡一样对它运行 /puppet 命令,除了 leave 命令。因为在服务器上你仍然以你的账户进行游戏,当有人运行包含你名字的命令时,它将指向你正在操控的傀儡。例如,如果玩家 senseiwells 正在操控 SuperSanta,有人运行 /tp senseiwells,他们将传送至玩家 SuperSanta。例外情况是 /puppet 命令,它指向使用该名称的任何人。

如果你在操控期间死亡,或傀儡断开连接,你将停止操控。如果你在操控期间退出游戏,你的原始身体将下线,而傀儡将保持在线。

操作

傀儡玩家能够执行模拟真实玩家行为的操作。 某些操作也可以对真实玩家执行。

以下是所有可用操作的列表:

操作 描述 参数 可独立运行 仅限傀儡
"minecraft:attack" 让玩家攻击(左键)。 <once|hold|release>
"minecraft:delay" 在连续动作之间添加延迟。 <延迟>
"minecraft:drop" 让玩家丢弃当前选中的物品。 <entire_stack>
"minecraft:interrupt_look_at" 中断当前的视线目标。
"minecraft:interrupt_move_to" 中断玩家的当前寻路。
"minecraft:jump" 让玩家跳跃。 <once|hold|release>
"minecraft:look" 让玩家朝向某个方向。 <旋转>
"minecraft:look_at" 让玩家朝向指定的目标。 position <位置> <锁定?>entity <实体> <锁定?>
"minecraft:move_to" 让玩家寻路到某个位置或实体。 position <位置> <冲刺?> <跳跃?>entity <实体> <冲刺?> <跳跃?>
"minecraft:offhand" 让玩家将物品与副手物品交换。
"minecraft:sneak" 让玩家潜行。 <潜行状态>
"minecraft:sprint" 让玩家疾跑。 <疾跑状态>
"minecraft:swap_slot" 让玩家切换到某个格子。 <格子>
"minecraft:use" 让玩家使用(右键)。 <once|hold|release>

要运行某项操作,我们可以使用以下命令独立运行:

/puppet <玩家> actions run <操作> ...

这会让玩家立即执行该操作。

例如,要让一个玩家持续攻击,需要运行:

/puppet <玩家> actions run minecraft:attack hold

我们还可以通过以下命令将多个操作串联起来:

/puppet <玩家> actions chain add <操作> ...

添加操作到链后,还可以运行以下命令来控制链式行为:

/puppet <玩家> actions chain loop <true|false> # 是否无限循环链式操作
/puppet <玩家> actions chain pause # 暂停执行链式操作
/puppet <玩家> actions chain resume # 恢复执行链式操作
/puppet <玩家> actions chain restart # 重新开始执行链式操作(从第一个操作开始)
/puppet <玩家> actions chain stop # 停止执行链式操作(并清除所有操作)

例如,要让一个玩家攻击5秒,然后松开2秒,再重复执行,可以运行:

/puppet <玩家> actions chain add minecraft:attack hold
/puppet <玩家> actions chain add minecraft:delay 5s
/puppet <玩家> actions chain add minecraft:attack release
/puppet <玩家> actions chain add minecraft:delay 2s
/puppet <玩家> actions chain loop true

配置

配置文件位于 ./config/puppet-player-config.json,默认内容如下:

{
  "reload_puppet_players": true,
  "respawn_puppet_players": true,
  "puppet_player_death_delay": 0,
  "operator_required_for_puppets": true,
  "can_players_puppet_themselves": true,
  "can_spawn_puppets_anywhere": true,
  "can_spawn_whitelisted_players_as_puppets": true,
  "enable_puppeteering": false,
  "enabled_actions": "*"
}
  • "reload_puppet_players" - 如果服务器停止时傀儡最后在线,是否让它们重新加入
  • "respawn_puppet_players" - 傀儡死亡后是否重生,如果禁用,它们将直接离开游戏
  • "puppet_player_death_delay" - 傀儡死亡后重生/离开的延迟(由 respawn_puppet_players 决定)
  • "operator_required_for_puppets" - 玩家是否需要管理员权限才能运行 /puppet 命令
  • "can_players_puppet_themselves" - 非管理员玩家是否可以对自身运行 /puppet 命令
  • "can_spawn_puppets_anywhere" - 是否可以在世界各地生成傀儡(而不是 join 那样仅在其上次注销处生成)
  • "can_spawn_whitelisted_players_as_puppets" - 是否可以将白名单玩家生成为傀儡
  • "enable_puppeteering" - 玩家是否能够接管傀儡并操控
  • "enabled_actions" - 允许傀儡执行的操作列表,"*" 表示全部操作,或者列出已启用的操作,例如 ["attack", "use"]

对于生存服务器,可以使用以下推荐配置,从而让模组减少“作弊”性质:

{
  "reload_puppet_players": true,
  "respawn_puppet_players": false,
  "puppet_player_death_delay": 20,
  "operator_required_for_puppets": true,
  "can_players_puppet_themselves": true,
  "can_spawn_puppets_anywhere": false,
  "can_spawn_whitelisted_players_as_puppets": false,
  "enable_puppeteering": false,
  "enabled_actions": ["use", "attack", "drop", "swap_slot"]
}