滚木反作弊检测速查表,自用喵
BadPackets
BadPacketsA
- 描述: 发送了重复的槽位 ID (Sent duplicate slot id)。
- 检测内容: 玩家发送
HELD_ITEM_CHANGE数据包切换到的槽位与当前记录的槽位相同。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsA.java
BadPacketsB
- 描述: 忽略了强制旋转数据包 (Ignored set rotation packet)。
- 检测内容: 玩家未正确响应服务器发送的旋转/位置事务(Transaction),即未接受服务器的强制回弹或旋转。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsB.java
BadPacketsC
- 描述: 与自身交互 (Interacted with self)。
- 检测内容: 玩家尝试与自己的实体 ID 进行交互(攻击或右键),且玩家不在旁观者模式。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsC.java
BadPacketsD
- 描述: 不可能的俯仰角 (Impossible pitch)。
- 检测内容: 玩家发送的俯仰角 (Pitch) 超过了正常范围(大于 90 或小于 -90 度)。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsD.java
BadPacketsE
- 描述: 缺乏位置更新 (No reminder ticks)。
- 检测内容: 玩家连续发送了过多的纯飞行状态包 (Flying) 而没有包含位置或旋转信息的更新,超出了允许的 Tick 阈值。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsE.java
BadPacketsF
- 描述: 发送了重复的疾跑状态 (Sent duplicate sprinting status)。
- 检测内容: 玩家在已经是疾跑状态时发送“开始疾跑”,或在非疾跑状态时发送“停止疾跑”。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsF.java
BadPacketsG
- 描述: 发送了重复的潜行状态 (Sent duplicate sneaking status)。
- 检测内容: 类似于 BadPacketsF,检测重复或逻辑错误的潜行 (Sneaking) 状态切换。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsG.java
BadPacketsH
- 描述: 发送了意外的序列 ID (Sent unexpected sequence id)。
- 检测内容: 针对 1.19+ 版本,检查方块放置、挖掘或使用物品时的 Ack 序列号 (Sequence ID) 是否不连续或不符合预期。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsH.java
BadPacketsI
- 描述: 在无法飞行时声称正在飞行 (Claimed to be flying while unable to fly)。
- 检测内容: 玩家发送
PLAYER_ABILITIES包声称自己在飞行,但服务器端记录玩家无飞行权限。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsI.java
BadPacketsJ
- 描述: 物品使用包中的旋转角度与 Tick 旋转不匹配。
- 检测内容: 1.21+ 客户端在
USE_ITEM包中携带的旋转角度与玩家当前的移动/旋转 Tick 数据不一致。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsJ.java
BadPacketsK
- 描述: 非旁观者模式下发送旁观包 (Sent spectate packets while not in spectator mode)。
- 检测内容: 玩家发送
SPECTATE数据包尝试旁观实体,但其游戏模式不是旁观者。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsK.java
BadPacketsL
- 描述: 发送了不可能的挖掘包 (Sent impossible dig packet)。
- 检测内容:
PLAYER_DIGGING包中的位置、面或动作组合在特定上下文中是非法的(例如特定的丢弃物品动作必须对应特定的空位置/面)。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsL.java
BadPacketsM
- 描述: 活着时尝试重生 (Tried to respawn while alive)。
- 检测内容: 玩家发送重生请求包 (
PERFORM_RESPAWN),但服务器认为玩家并未死亡。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsM.java
BadPacketsN
- 描述: 空检测 (Reserved/Empty)。
- 检测内容: 当前代码为空,可能用于测试或预留。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsN.java
BadPacketsO
- 描述: KeepAlive 异常 (Duplicate/Unknown KeepAlive IDs)。
- 检测内容: 玩家发送的
KEEP_ALIVEID 不在服务器发送的待确认列表中,可能是重复确认或伪造数据包。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsO.java
BadPacketsP
- 描述: 无效的点击窗口包 (Invalid click packets)。
- 检测内容: 检查
CLICK_WINDOW包中的点击类型与按钮 ID 的组合是否合法(例如按下键盘按键只能是 0-8 或 40)。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsP.java
BadPacketsQ
- 描述: 无效的实体动作 (Invalid EntityAction)。
- 检测内容: 检查
ENTITY_ACTION中的跳跃提升数值是否异常(如 >100),或操作的实体 ID 是否不匹配。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsQ.java
BadPacketsR
- 描述: 计时器/时钟漂移检测 (Timer check)。
- 检测内容: 监控玩家发送数据包的速率,检测是否使用了变速齿轮(Timer)或存在严重的网络拥塞/发包异常。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsR.java
BadPacketsS
- 描述: 拒绝窗口确认 (Window confirmation not accepted)。
- 检测内容: 玩家发送了
WINDOW_CONFIRMATION包但标记为未接受(Accepted=false),这通常是不正常的行为。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsS.java
BadPacketsT
- 描述: 交互实体超出范围 (Interact entity out of reach/sight)。
- 检测内容: 检查攻击或交互时,准星指向的位置是否真的落在了目标实体的碰撞箱范围内。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsT.java
BadPacketsU
- 描述: 发送了不可能的物品使用包 (Sent impossible use item packet)。
- 检测内容: 检查
PLAYER_BLOCK_PLACEMENT包(旧版本协议交互包)中的坐标、面和光标位置是否符合协议规范的特定值。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsU.java
BadPacketsV
- 描述: 移动距离不足 (Did not move far enough)。
- 检测内容: 玩家发送了位置更新包,但实际位移距离极小,可能是在尝试绕过某些检测或发送垃圾包。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsV.java
BadPacketsW
- 描述: 与不存在的实体交互 (Interacted with non-existent entity)。
- 检测内容: 描述表明用于检测与不存在实体的交互,但当前代码实现为空。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsW.java
BadPacketsX
- 描述: 频繁切换状态 (State switch spam)。
- 检测内容: 在短时间内极为频繁地切换疾跑或潜行状态,通常由作弊客户端的自动功能引起。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsX.java
BadPacketsY
- 描述: 发送越界槽位 ID (Sent out of bounds slot id)。
- 检测内容: 玩家尝试切换到的快捷栏槽位 ID 超出了允许范围(0-8)。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsY.java
BadPacketsZ
- 描述: 多个玩家输入包 (Multiple player input packets)。
- 检测内容: 在同一个客户端 Tick 周期内接收到了多个
PLAYER_INPUT包,这是不符合原版客户端行为的。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/badpackets/BadPacketsZ.java
PacketOrder
PacketOrderA
- 描述: 库存点击逻辑异常 (Inventory click logic)。
- 检测内容: 检查
CLICK_WINDOW包,确保点击类型(Pickup, QuickMove 等)与玩家当前的点击状态逻辑(例如是否在进行拾取或快速移动)相符。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderA.java
PacketOrderB
- 描述: 攻击前未挥手 (Did not swing for attack)。
- 检测内容: 检查攻击实体 (
ATTACK) 时是否伴随有挥手动作 (ANIMATION)。对于 1.9+ 客户端,顺序通常是 INTERACT -> ANIMATION;对于 1.8 客户端,顺序是 ANIMATION -> INTERACT。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderB.java
PacketOrderC
- 描述: 缺少 InteractAt 包 (Skipped Interact-At)。
- 检测内容: 1.8+ 客户端在某些交互(如与盔甲架交互或特定操作)时,应该发送
INTERACT_AT(带向量)随后发送INTERACT。此检测确保这两个包成对出现且参数(如手、实体ID、潜行状态)一致。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderC.java
PacketOrderD
- 描述: 副手交互缺少主手交互 (Skipped Mainhand)。
- 检测内容: 1.9+ 客户端在某些情况下,如果副手交互 (
OFF_HAND) 发生,通常意味着主手交互已经发生或应该有对应的逻辑顺序。此检测验证交互包的握手与动作顺序。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderD.java
PacketOrderE
- 描述: 切换物品时存在其他动作 (Action during slot switch)。
- 检测内容: 玩家在发送
HELD_ITEM_CHANGE(切换快捷栏)时,不应同时处于某些特定动作状态(如攻击、使用物品、疾跑、潜行等),防止通过快速切包隐藏动作或绕过检测。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderE.java
PacketOrderF
- 描述: 疾跑/潜行时发送特定动作包 (Action while sprinting/sneaking)。
- 检测内容: 检查在玩家处于疾跑或潜行状态时,是否发送了某些可能在物理上或逻辑上不兼容的包(如特定的物品使用、方块放置或交互),防止利用状态同步延迟作弊。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderF.java
PacketOrderG
- 描述: 挖掘或库存操作时的状态冲突 (State conflict during digging/inventory)。
- 检测内容: 检查
PLAYER_DIGGING(如丢弃物品、副手交换)或库存操作时,玩家是否处于不应有的状态(如攻击、正在挖掘方块、右键等)。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderG.java
PacketOrderH
- 描述: 疾跑与潜行状态冲突 (Sprint/Sneak conflict)。
- 检测内容: 检查玩家是否试图同时保持疾跑和潜行状态(针对特定版本客户端的行为差异),这在正常游戏中通常是不允许的。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderH.java
PacketOrderI
- 描述: 交互、放置与挖掘的顺序冲突 (Order conflict: Interact/Place/Dig)。
- 检测内容: 极其严格地检查
INTERACT_ENTITY、PLAYER_BLOCK_PLACEMENT、USE_ITEM和PLAYER_DIGGING之间的状态互斥。例如,不能在挖掘时放置,不能在释放物品使用时攻击等。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderI.java
PacketOrderJ
- 描述: 攻击时尝试放置/使用物品 (Place/Use while attacking)。
- 检测内容: 检查玩家在发送攻击包 (
ATTACK) 的同时(或极短时间内),是否发送了放置方块或使用物品的包,且未标记为交互。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderJ.java
PacketOrderK
- 描述: 库存打开/关闭状态不符 (Inventory open/close mismatch)。
- 检测内容: 检查
CLICK_WINDOW或CLOSE_WINDOW包发送时,玩家的预测状态是否确实在打开库存或点击库存。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderK.java
PacketOrderL
- 描述: 丢弃/交换物品时的状态不符 (Drop/Swap mismatch)。
- 检测内容: 检查丢弃物品或副手交换 (
SWAP_ITEM_WITH_OFFHAND) 时,玩家的预测状态是否标记为正在丢弃或操作库存。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderL.java
PacketOrderM
- 描述: 无交互的使用物品 (Use without interact)。
- 检测内容: 检查
USE_ITEM或PLAYER_BLOCK_PLACEMENT包是否在没有对应的交互状态下发送,或者与实体的交互状态不匹配。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderM.java
PacketOrderN
- 描述: 无放置的使用物品 (Use without placing)。
- 检测内容: 类似于 PacketOrderM,但侧重于检查方块放置事件 (
BlockPlace) 是否在没有正确发送使用物品/放置包的情况下触发,或者反之。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderN.java
PacketOrderO
- 描述: 飞行状态下的异常发包 (Packets while flying)。
- 检测内容: 检查在
CLIENT_TICK_END周期内,被认为是“飞行”状态(即发送了移动包但未完成 Tick)时,是否发送了不允许的包(如非载具移动包)。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderO.java
PacketOrderP
- 描述: 块批处理响应丢失 (Skipped Chunk Batch Ack)。
- 检测内容: 针对 1.20.2+ 的 Chunk Batch 功能,检查客户端是否正确响应了
CHUNK_BATCH_ACK,防止客户端丢弃或忽略服务器的区块加载确认请求。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/packetorder/PacketOrderP.java
Timer
NegativeTimer
- 描述: 负向计时器检测 (Negative timer balance)。
- 检测内容: 检测玩家的发包速度是否显著慢于正常时间流逝(即“负”计时器,有时用于积攒“时间余额”以便后续瞬间爆发加速)。通过对比玩家的移动时钟 (PlayerClock) 与实时时间 (RealTime) 的差值,如果差值过大(落后过多),则触发检测。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/timer/NegativeTimer.java
TickTimer
- 描述: Tick 结束包检测 (Tick end packet check)。
- 检测内容: 针对支持
CLIENT_TICK_END包的新版本客户端,检查在每个 Tick 周期内是否发送了正确数量的移动/飞行包。如果在一个 Tick 内发送了多个飞行包,或者发送了飞行包却没有对应的 Tick 结束包,则视为异常。 - 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/timer/TickTimer.java
Timer (Base Check / TimerA)
- 描述: 标准计时器检测 (Standard timer check)。
检测内容: 核心计时器检测逻辑。它不依赖于简单的实时时间对比,而是利用事务(Transaction/Ping)机制来构建一个与玩家网络延迟挂钩的“玩家时钟”。
- 原理: 每次收到移动包增加 50ms 余额,随时间流逝消耗余额。如果余额超过阈值(即发包过快),则判定为 Timer 作弊。
- 特点: 能够极好地抵抗网络波动和 Ping 值变化引起误报,因为它基于服务器-客户端-服务器的往返确认机制。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/timer/Timer.java
TimerLimit
- 描述: 计时器滥用限制 (Timer abuse limit)。
检测内容: 继承自 Timer 检测,用于限制玩家在极高 Ping 值下的时间余额滥用。
- 目的: 防止玩家故意利用极高的延迟(如 1000ms+)来获得巨大的时间缓冲区,从而在短时间内进行不被检测的加速。
- 逻辑: 当计算落后时间(Fall behind)时,强制设置一个最大允许的 Ping 值(如 1000ms),超过此值的延迟将不再增加允许的时间余额。
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/timer/TimerLimit.java
VehicleTimer
- 描述: 载具计时器检测 (Vehicle timer check)。
检测内容: 专门针对乘坐载具(如船、矿车、马)时的计时器检测。
- 逻辑: 继承自标准 Timer 逻辑,但针对
VEHICLE_MOVE和STEER_VEHICLE包进行了适配。区分了客户端控制载具(主动发包)和服务器控制载具(被动发包)的情况,确保只在玩家主动控制载具移动时进行计时器检查。
- 逻辑: 继承自标准 Timer 逻辑,但针对
- 代码位置:
common/src/main/java/ac/grim/grimac/checks/impl/timer/VehicleTimer.java



