弹幕(ai-barrage)
基本信息
| 属性 | 值 |
|---|---|
| 类名 | toast.specialAI.ai.special.EntityAIBarrage |
| 实现接口 | ISpecialAI |
| 名称 | barrage |
| 默认权重 | 1 |
| 默认存值 | float 3.0(箭矢伤害) |
| 互斥位 | MOVEMENT + FACING + SWIMMING |
| 优先级 | 0(与基础攻击同级,独占所有移动/朝向) |
功能
怪物发现距离 5–16 格的玩家后进入"准备-射击"二阶段弹幕攻击。在约 30 tick 准备阶段锁死视线,之后 60 tick 内每 5 tick 发射 1 支箭矢(带随机散布 ±0.5 + 难度加成)。燃烧中的实体会让箭矢附燃。
准备时间
attackTime = 30是从shouldExecute才开始倒计时(外层随机命中nextInt(10) == 0),之后startExecuting重置为 30,STATE_SHOOT重置为 60。
状态机
| 状态 | 触发 | 时长 | 行为 |
|---|---|---|---|
STATE_START (1) |
进入时 | 30 tick | 锁死朝向目标,尝试计算 (x, y, z) 弹道;目标消失或死亡 → STATE_END |
STATE_SHOOT (2) |
START 结束 | 60 tick | 每 5 tick 发射 1 支箭矢(random.bow 音效),共 12 支;结束 → STATE_END |
STATE_END (0) |
中止 | - | continueExecuting 返回 false |
isInterruptible() = false:执行期间不会被其它 AI 抢占。
触发条件(shouldExecute)
- 实体在地面
- 未骑乘
- 攻击倒计时归零
nextInt(10) == 0(10 tick 中只尝试进入 1 次)- 有攻击目标,且
25 ≤ distance² ≤ 256且能直接视线可见
初始化(initialize)
- 主手位(4)装备
Block.dispenser(不渲染丢弃概率,视为头部方块) maxHealth加 +20(AttributeModifier, op 0),同时补满差量 HP
箭矢参数
| 参数 | 值 |
|---|---|
| 基础伤害 | 3.0 + nextGaussian() * 0.5 + difficulty.getDifficultyId() * 0.22 |
| 速度 | 1.8(velocity) |
| 散布 | 20.0(inaccuracy) |
| 弹道 | difficulty.getDifficultyId() * 0.22 随难度递增 |
| 附燃 | entity.isBurning() → arrow.setFire(100) |
resetTask
attackTime = 60(冷却)。