MCBE 一些基于网络数据包的作弊功能实现 2(自由视角/时间修改/药水效果/方块飞行)

  • 示例 Minecraft 版本: Bedrock 1.20.80

  • C -> S 表示客户端发往服务器的数据包

  • S -> C 表示服务器发往客户端的数据包

自由视角/Freecam

先进入 C -> S player_input

  1. 通过 C -> S player_input 记录开启功能前的玩家坐标(lastPosition)
  2. 通过 C -> S player_input 获取并记录玩家的移动输入(是否向某个方向移动,up/right/left/down/want_up/want_down)、俯仰角(pitch)和头部偏航角(head_yaw)
  3. 修改 C -> S player_input
    • 设置 position 为 lastPosition
    • 修改 input_data,禁用移动输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
jumping: false,
left: false,
right: false,
up: false,
down: false,
up_left: false,
up_right: false,
north_jump: false,
want_up: false,
want_down: false,
sneak_down: false,
sneak_toggle_down: false,
start_jumping: false,
stop_flying: false,
want_down_slow: false,
want_up_slow: false,
jump_down: false,
sneaking: false
  1. 通过移动输入和偏航角计算相机位置(camPosition)
    可参考 MCBE 偏航角到坐标移动向量的计算
  2. 构造 S -> C camera_instruction
    - 设置 instruction_set
     · runtime_id 设为当前玩家的 1
     · ease_data 置空
     · position 设为 camPosition
     · rotation 设为一个平面向量,x 为 pitch,z 为 head_yaw
    - clear 置空
    - fade 置空
  3. 发送 S -> C camera_instruction 数据包给客户端

需要定时重置玩家位置到 lastPosition,防止玩家在客户端移动
功能关闭后需要构造并发送 S -> C camera_instruction 给客户端,以恢复相机

  • instruction_set 置空
  • clear 设为 true
  • fade 置空

时间修改/FakeTime

  • 修改 S -> C set_time
    设置 time 为目标时间(0-24000)
  • 构造 S -> C set_time
    • 设置 time 为目标时间(0-24000)
    • 发送数据包给客户端

药水效果/Effect

  • 构造 S -> C mob_effect
    • runtime_entity_id 设为当前玩家的 runtime_entity_id
    • event_id 设为 add
    • effect_id 设为药水效果的 id
    • amplifier 设为药水效果的等级
    • particles 是否启用粒子效果
    • duration 设为药水效果的持续时间/Tick
    • tick 设为一个空的无符号长整数[0, 0]
  • 发送数据包给客户端

方块飞行/BlockFly

  • 进入 C -> S player_input
  • 构造 S -> C update_block
    • position 设为玩家脚底方块坐标
    • block_runtime_id 设为用作支持的方块的 runtime_id
    • flags 可填
1
2
3
4
5
6
7
8
{
_value: 1,
neighbors: true,
network: true,
no_graphic: false,
priority: false,
unused: false
}
  •  
    • layer0
    • 发送数据包给客户端

参考文献