Skip to content

常见问题

插件启动后提示版本不支持怎么办?

LyAutoAttack 1.2.2 会读取 Bukkit 版本,并且只支持以下服务端版本:

  • 1.7.10
  • 1.8.x
  • 1.12.2

使用其他版本时,控制台会提示当前游戏版本不受支持,随后禁用插件。需要将服务端更换为受支持的版本,不能只通过修改配置绕过版本检查。

插件需要安装哪些前置?

plugin.yml 中登记了以下软依赖:

插件用途注意事项
PlaceholderAPI注册 %laa_*% 变量、解析条件和属性加成变量未正常启动时,LyAutoAttack 不会注册自己的变量扩展,依赖变量解析的功能也无法正常工作
ProtocolLib发送攻击动作数据包、拦截自动攻击期间的普通攻击包自动攻击的数据包处理代码依赖 ProtocolLib,应确保它先于 LyAutoAttack 正常启动

DragonCore、GermPlugin 和配套的 LyAutoAttackMod 只用于对应的扩展功能,不是所有服务器都必须安装。

缺少 PlaceholderAPI 会怎样?

PlaceholderAPI 未启动时,控制台会显示基础前置未启动,并且不会注册 LyAutoAttack 的变量扩展。

以下功能依赖 PlaceholderAPI:

  • %laa_status%%laa_lock% 等状态变量。
  • papi:{...} 分组条件。
  • 进入服务器、重生和跨世界时的 papi:{...} 自动开启条件。
  • attribute-addition 中的范围、数量、速度和抗击退变量。
  • 条件文本中需要先解析的其他 PlaceholderAPI 变量。

如果配置使用了这些功能,应安装 PlaceholderAPI,并确认相关变量能够返回预期内容。属性加成变量必须返回纯数字;解析失败时,插件会在控制台输出玩家名、变量和原始解析值,并按 0 处理本次加成。

自动攻击无法开启怎么办?

先按以下顺序检查:

  1. 使用 /laa check 切换状态,再通过 %laa_status% 判断是否已经开启。
  2. 检查玩家是否处于受支持的游戏状态。在 1.12.2 中,旁观模式玩家无法开启自动攻击。
  3. 检查分组配置是否已经通过 /laa reload 重载。
  4. 检查分组条件中的 PlaceholderAPI 变量、权限或物品名称是否匹配。
  5. 检查 PlaceholderAPI 和 ProtocolLib 是否正常启动。

分组均不匹配时,插件会使用默认参数,不会因为没有匹配到自定义分组而直接拒绝普通玩家开启。

自动攻击开启后没有伤害怎么办?

先按顺序检查:

  1. 玩家是否已经开启自动攻击,可使用 %laa_status% 确认。
  2. 目标实体类型是否存在于 filter-entities 中。
  3. 目标是否为插件内置过滤的盔甲架或特殊坐骑实体。
  4. default-range 或当前分组的 range 是否足够。
  5. default-speed 或当前分组的 speed 是否过大。该值单位为 tick,数值越大,攻击间隔越长。
  6. max 是否被设置为 0 或更小。最大目标数不大于 0 时不会选取目标。
  7. 当前 attack-mode 是否适合服务器使用的伤害体系。
  8. force-attack 关闭后,目标是否一直处于原版受击冷却中。
  9. 是否有其他插件取消伤害事件、修改攻击流程或覆盖受击冷却。

可以临时开启 debug-show-target-entity-type。开启后,作为 OP 的攻击玩家会在每次真实攻击前收到目标实体类型,便于确认目标是否已经进入攻击流程。

attack-mode 应该如何选择?

配置文件提供了四种伤害模式:

配置文件中的用途说明
1兼容动作大师的伤害屏蔽
2原版模拟伤害
3原版 MythicMobs 造成伤害
4兼容 SX 伤害

默认值为 4。不同模式走的伤害调用方式不同;出现无伤害、伤害事件不兼容或伤害插件无法识别时,可以逐项测试,但应同时检查其他插件是否取消了伤害事件。

为什么攻击范围和配置值不一致?

开启自动攻击时,插件会先读取默认组或匹配分组的基础范围,再计算 attribute-addition.range 提供的百分比加成。

最终范围还会被限制在 064 之间:

  • 计算结果小于 0 时按 0 使用。
  • 计算结果大于 64 时按 64 使用。

玩家开启后,本次运行使用的是开启瞬间计算出的范围。之后变量发生变化不会自动刷新,需要关闭并重新开启自动攻击。

为什么攻击速度和预期不一致?

default-speed 和分组 speed 表示攻击任务的触发间隔,单位为 tick:

  • 20 表示约每秒触发一次。
  • 10 表示约每 0.5 秒触发一次。
  • 数值越小,触发越快。

启用 attribute-addition 后,插件按照“基础间隔除以速度加成系数”计算最终间隔。变量按百分比读取,例如变量返回 100 时按 100% 加成计算。

最终攻击间隔小于 1 tick 时会被限制为 1 tick。实际造成伤害的频率还会受到目标受击冷却、force-attack 和其他伤害插件影响。

为什么 near 模式只攻击一个目标?

这是正常行为。near 模式每次触发只处理距离最近的一个目标,并且最大攻击数量固定表现为 1。即使默认或分组的 max 大于 1near 模式也不会同时攻击多个目标。

对应的 %laa_max%near 模式下同样固定返回 1

为什么 all 模式没有攻击很多目标?

all 模式仍然受到以下限制:

  • 最多选取当前默认组或分组 max 指定的目标数量。
  • 只选取水平范围内且垂直距离不超过 3 格的生物实体。
  • 跳过已死亡的目标。
  • 跳过 filter-entities 中的实体类型。
  • 跳过盔甲架和插件内置过滤的特殊坐骑实体。
  • force-attackfalse 时,跳过仍有受击冷却的目标。

目标会按与玩家的距离从近到远排列,再截取最多 max 个目标。

为什么范围内上下方的目标没有被攻击?

插件搜索目标时,水平方向使用当前攻击范围,垂直方向固定搜索玩家上下 3 格。即使 range 大于 3,与玩家垂直距离超过该范围的实体也不会进入附近目标列表。

此外,插件还会使用球形距离再次判断目标是否处于攻击范围内,并不是只要位于搜索方盒中就会被攻击。

玩家换装备、权限或变量后,分组为什么没有变化?

分组在开启自动攻击时从上到下判断,首个满足全部条件的分组会成为玩家本次使用的分组。开启后再更换装备、调整权限或改变变量,不会自动刷新已经记录的攻击参数和停止动作。

让玩家执行 /laa check 关闭后再次执行以重新开启,或者由 OP 依次执行:

text
/laa disable 玩家名
/laa enable 玩家名

重新开启时,插件会再次匹配分组,并重新计算属性加成。

分组条件为什么没有按 OP 身份直接通过?

permission:{权限节点} 不会因为玩家是 OP 就自动视为满足。对于 OP 玩家,插件会遍历玩家的有效权限,仅在确实找到对应权限节点且值为 true 时通过。

同理,nopermission:{权限节点} 会在玩家确实拥有该节点时判定失败。需要通过权限插件或权限附件明确授予、拒绝对应节点。

多个分组都满足时会使用哪个?

插件按照 group 中的配置顺序从上到下检查,使用第一个全部条件都满足的分组,之后不再继续匹配。

同一分组内列出的条件需要全部满足。没有任何自定义分组满足时,使用 default-* 配置组成的默认分组。

物品名称条件一直无法匹配怎么办?

name:{...} 条件执行的是完整显示名称匹配,不是包含匹配。需要确认:

  • 指定槽位中确实存在物品。
  • 物品拥有自定义显示名称。
  • 配置名称与物品显示名称完全一致。
  • 颜色代码一致,配置中的 & 会转换为 § 后再比较。
  • 插件名、背包 ID、槽位名或槽位编号填写正确。

项目代码能够确认处理的来源包括 DragonCore、GermPlugin、LyInventoryReload、YeeJewelry、Minecraft 原版背包,以及 Origin 的主手、副手和各护甲槽位。配置示例中虽然列出了其他背包格式,但当前证据没有显示对应的实际读取分支,无法匹配时应优先检查当前版本是否真正实现了该来源。

开启 attribute-addition 后属性没有增加怎么办?

检查以下内容:

  1. attribute-addition.enable 是否为 true
  2. PlaceholderAPI 是否已经正常启动。
  3. 配置的变量是否能返回纯数字,不要包含 %、单位文字或颜色代码。
  4. 玩家是否在变量变化后重新开启了自动攻击。
  5. 控制台是否出现变量读取错误。

各属性的处理方式不同:

属性计算方式
range按基础范围的百分比增加
max将变量整数部分直接加到基础目标数
speed按百分比缩短基础攻击间隔
knockback将变量整数部分直接加到基础抗击退值

变量无法解析时,本次加成按 0 处理。

为什么开启自动攻击后不能再手动攻击?

plugin-switch-nodamageticktrue 时,插件会在自动攻击运行期间接管攻击伤害:

  • 拦截客户端发送的普通实体攻击包。
  • 屏蔽不属于 LyAutoAttack 攻击上下文的额外伤害。
  • 对 DragonCore 的部分攻击交互通道进行额外拦截。
  • 放行插件自身攻击流程中的首条真实伤害。

该功能用于避免自动攻击和手动攻击叠加造成高频伤害。希望保留手动攻击时可以关闭此项,但可能重新出现伤害叠加问题。

为什么技能或额外伤害被自动攻击拦截?

plugin-switch-nodamagetick 开启后,自动攻击玩家造成的非 LyAutoAttack 伤害通常会被取消。

项目内置了以下放行方式:

  • 伤害来源实体带有 doing-skill-damage metadata 时直接放行。
  • 外部代码通过临时放行标记允许一次伤害。
  • 当前伤害属于 LyAutoAttack 自身攻击上下文中的首条伤害。

如果某个技能插件没有使用这些识别方式,其额外伤害可能被拦截。可以关闭伤害接管进行对比测试,但需要注意手动攻击和自动攻击可能叠加。

force-attack 有什么影响?

force-attack 控制自动攻击是否无视目标的原版受击冷却:

  • true:即使目标仍有受击冷却,也会继续进入伤害流程。
  • false:只有目标受击冷却为 0 时才会攻击。

关闭后如果攻击速度较快,部分任务周期只会播放摆手动作而不会实际造成伤害。开启后则可能改变其他伤害系统依赖的原版受击节奏。

开启摆手动作后仍然看不到动作怎么办?

send-swap-hand 控制服务端是否发送主手摆动动画包。该功能依赖 ProtocolLib 初始化的数据包管理器。

如果没有动作或出现异常,检查:

  • send-swap-hand 是否为 true
  • ProtocolLib 是否正常启动。
  • 是否有动作、模型或客户端插件覆盖玩家动画。

该配置只影响动作显示,不决定目标筛选。

动作序列为什么没有播放?

动作序列只会在实际触发攻击后处理,附近没有合格目标或本次没有造成攻击时不会前进序列。

还需要满足以下条件:

  • default-animation-sequence 或当前分组的 animation-sequence 不为空。
  • 安装 GermPlugin 或 DragonCore。
  • 动作名称在对应客户端资源中有效。
  • 玩家使用的是 1.12.2。项目中的动作序列处理逻辑位于 1.12.2 攻击任务中。

插件会按列表顺序循环播放动作。delay:毫秒 只负责推迟下一次动作播放,本身不会播放动作。

delay:毫秒 为什么没有精确在指定时间播放动作?

延迟值表示在此时间之前不再播放动作,但动作序列仍然只在后续成功攻击时继续处理。因此延迟结束后如果玩家没有命中目标,不会立即自动播放下一项动作。

延迟必须使用非负整数,例如:

yaml
default-animation-sequence:
  - '攻击动作一'
  - 'delay:500'
  - '攻击动作二'

光环没有显示怎么办?

光环需要客户端安装配套 LyAutoAttackMod。服务端会通过 lyautoattack 插件消息通道发送以下状态:

  • 开启自动攻击时发送范围、颜色、线宽、高度、透明度和渐变时间。
  • 实际命中目标时发送命中状态。
  • 关闭自动攻击时发送关闭状态。

未安装客户端配套时,不影响服务端自动攻击本身。

如果已安装客户端配套仍不显示,检查玩家是否真正开启了自动攻击,以及客户端与服务端是否能正常接收该插件消息通道。

分组光环缺少部分配置时会怎样?

分组的 arua-effect 会按配置项读取。缺少的项目会回退到 default-arua-effect 对应值,而不是要求每个分组都完整重复全部光环配置。

如果默认光环配置也缺少对应项,代码还提供了颜色、线宽、高度、透明度和时间参数的内置回退值。

配置键使用项目现有拼写 arua-effect,不要自行改成其他名称。

开启增强抗击退后,技能位移为什么失效?

strengthen-knockbak-mode 会监听玩家速度变化。当玩家的当前分组抗击退值大于 0 时,插件会取消速度事件并将速度设为零。

这不仅会阻止普通攻击和爆炸击退,也可能影响:

  • 翻滚。
  • 冲刺位移。
  • 击飞。
  • MythicMobs 等插件通过速度实现的技能移动。

遇到此类冲突时,优先关闭 strengthen-knockbak-mode,只使用普通抗击退属性。

persistent-knockback 开启后有什么变化?

开启后,玩家进入服务器时会立即根据当前匹配分组启用抗击退,不需要先开启自动攻击。关闭自动攻击时也不会自动清除抗击退。

关闭该配置时,抗击退在开启自动攻击时启用,并在正常关闭自动攻击时清除。

persistent-knockback 不代表数据写入磁盘。玩家的运行状态仍由插件在内存中处理。

/laa lock 锁定不了玩家怎么办?

该指令要求:

  • 指令发送者是 OP。
  • 目标玩家在线。
  • 目标玩家当前位于地面。

玩家处于空中、飞行、下落或其他导致 isOnGround() 返回 false 的状态时,指令会提示玩家不在地面。

再次对已锁定玩家执行同一指令会解除锁定。

锁定位置后玩家还能转动视角吗?

锁定逻辑会在移动事件中把目标位置的世界和 XYZ 坐标恢复为移动前的值。代码没有恢复偏航角和俯仰角,因此锁定的是坐标位置,不是玩家视角。

锁定状态保存在内存中,服务器重启后不会保留。

玩家退出后锁定状态会怎样?

玩家退出时会停止自动攻击并移除网络拦截。现有退出处理没有明确从 lockPlayers 列表移除玩家 UUID,因此同一服务器运行期间,该玩家重新进入后可能仍处于锁定列表。

如遇到重新进入后仍被锁定,可由 OP 在玩家站在地面时再次执行:

text
/laa lock 玩家名

为什么玩家跨世界后自动攻击关闭了?

changeworld-auto-autoattack-enablefalse 时,玩家跨世界会直接关闭自动攻击。

当该配置为 true 时,插件会等待 changeworld-auto-attack-delay 指定的 tick 数,再检查全部跨世界条件。所有条件通过后重新开启自动攻击。

因此,想让玩家跨世界后保持自动攻击,需要启用跨世界自动开启,并正确配置条件和延迟。

进入服务器、重生或跨世界后为什么没有自动开启?

分别检查对应事件的开关、延迟和条件:

事件开关延迟条件列表
进入服务器join-auto-autoattack-enablejoin-auto-attack-delayjoin-auto-autoattack-condition
重生respawn-auto-autoattack-enablerespawn-auto-attack-delayrespawn-auto-autoattack-condition
跨世界changeworld-auto-autoattack-enablechangeworld-auto-attack-delaychangeworld-auto-autoattack-condition

延迟单位为 tick。条件列表中的每一项都必须通过,否则本次不会自动开启。

条件依赖 PlaceholderAPI 时,还需要确认 PlaceholderAPI 和对应变量扩展已经正常工作。

为什么进入服务器时会自动获得抗击退,但自动攻击没有开启?

persistent-knockbackjoin-auto-autoattack-enable 是两个独立开关:

  • persistent-knockback 控制进服时是否启用抗击退。
  • join-auto-autoattack-enable 控制进服后是否检查条件并开启自动攻击。

只开启前者时,玩家会获得抗击退,但不会自动开始攻击。

玩家死亡、退出或进入旁观模式后会怎样?

插件会在以下情况停止自动攻击:

  • 玩家死亡。
  • 玩家退出服务器。
  • 1.12.2 玩家切换到旁观模式。
  • 玩家跨世界且未启用跨世界自动开启。

停止时会取消玩家的攻击任务、发送关闭状态给客户端,并清理本次自动攻击参数。未开启持久抗击退时,还会清除插件设置的抗击退值。

/laa reload 后在线玩家的参数会立即变化吗?

不会完全立即变化。

/laa reload 会重新读取 config.yml 并重建分组列表,但已经开启自动攻击的玩家仍然使用开启时保存的范围、数量、速度、抗击退、模式和动作序列。

要让在线玩家应用新的分组和属性参数,需要关闭后重新开启自动攻击。

为什么修改停止消息后玩家仍收到旧消息?

玩家开启自动攻击时,插件会记录当时匹配到的分组。关闭时使用该分组保存的停止消息和停止命令。

仅执行 /laa reload 不会替换已开启玩家记录的分组。需要让玩家关闭并重新开启后,新配置才会用于下一次停止流程。

开启或关闭后配置命令没有按预期执行怎么办?

命令列表支持以下执行标记:

写法执行身份
[console]命令控制台
[op]命令玩家临时以 OP 身份执行,完成后恢复原状态
[player]命令玩家身份
不写标记玩家身份

命令中的 {player} 会替换为玩家名称。配置列表中不要带命令开头的 /,并确认目标命令本身存在。

为什么非 OP 玩家执行 /laa 看不到帮助?

无参数帮助只会在发送者是 OP 时显示。普通玩家可使用 /laa check 切换自己的自动攻击状态,但无参数执行不会显示 OP 管理指令列表。

项目没有在 plugin.yml 中声明独立权限节点。reloadenabledisablelock 直接通过 OP 状态限制。

/laa enable/laa disable 没有效果怎么办?

这两个指令要求:

  • 指令发送者是 OP。
  • 必须填写目标玩家名。
  • 目标玩家必须在线。

enable 只会对尚未开启的玩家执行开启,disable 只会对已经开启的玩家执行关闭。目标状态本来就相同时,不会重复启动或重复停止。

%laa_speed%%laa_range% 等变量为什么返回错误?

%laa_status%%laa_lock% 外,其余运行参数变量只在玩家已经开启自动攻击并存在运行数据时有效。

未开启时,以下变量会返回错误文本:

  • %laa_speed%
  • %laa_max%
  • %laa_knockback%
  • %laa_range%
  • %laa_mode%

如果玩家已经开启仍返回错误,检查 PlaceholderAPI 是否加载了标识为 laa 的扩展,以及插件是否在开启过程中因版本、游戏模式或分组数据异常而拒绝启动。

%laa_range% 后面的 x 是倍率吗?

不是。变量实现会直接把当前范围数值与字符 x 拼接返回,例如 5.0x。该字符只是变量输出格式的一部分,不代表再次进行倍率计算。

实际攻击范围以玩家开启时保存的数值为准。

调试目标实体类型为什么只有 OP 能看到?

debug-show-target-entity-type 的提示只发送给当前执行自动攻击且具有 OP 身份的玩家。普通玩家即使开启该配置也不会收到提示。

该提示显示 Bukkit 实体类型名称,可用于确定应该向 filter-entities 填写什么类型。

filter-entities 应该填写什么?

填写 Bukkit 实体类型名称,例如配置中的 COWPLAYER。插件会将目标的 entity.getType().name() 与列表内容直接比较,因此应使用对应版本的实体类型名称和一致的大写格式。

盔甲架以及插件识别的部分特殊坐骑实体已在代码中单独过滤,不需要依赖该列表。

配置了玩家过滤后,为什么仍担心误伤玩家?

玩家属于 LivingEntity,默认目标筛选会把范围内玩家视为候选目标。需要在 filter-entities 中保留:

yaml
filter-entities:
  - 'PLAYER'

删除该项后,附近玩家可能进入目标列表。

自动攻击状态会保存到数据库或配置文件吗?

不会。项目证据中没有 MySQL 存储,也没有自动攻击状态持久化逻辑。

玩家的自动攻击参数、运行任务和坐标锁定状态都保存在内存中。服务器重启后需要重新开启;进入服务器自动开启可以通过对应配置实现。