AimAssist

基于carpet 1.20的提前辅助瞄准

适用版本:1.20.x

目录结构

1
2
3
4
5
6
7
8
├── helpers
│ ├── BallisticCalculator // 弹道计算
│ └── generateEmissionAngle(Player)
└── mixins
├── BowItem_aimAssistMixin // 捕获目标
├── getTarget(Level, Player, InteractionHand, CallbackInfoReturnable<InteractionResultHolder<ItemStack>>)
├── LivingEntity_aimAssistMixin // 准心控制
└── directionControl(CallbackInfo) // tick级物品栏检测

基本处理逻辑

  1. 输入指令,标记为true

  2. 鼠标右键(mouseDown)发出射线追踪获取实体信息,如果为Mob类,添加到目标队列,并且高亮目标,再次右键同一目标,移出队列,取消高亮

  3. 鼠标右键(mouseOn),根据目标的坐标和速度,计算弹道,并将准心设置在预设点,蓄力完毕后会持续跟踪,直到生物被移除目标队列

代码参考

  • carpet命令
    carpet.commands.PlayerCommand
    carpet.CarpetSettings
    carpet.commands

  • 使用mixin注入代码,检测玩家对于物品弓的使用事件
    carpet检测玩家手持物品

  • 射线检测获取目标
    carpet.script.utils.Tracer.rayTrace
    net.minecraft.world.phys.EntityHitResult
    net.minecraft.world.entity.Entity.getViewVector

  • 添加到目标队列
    // TODO

  • 获取目标坐标,速度等信息
    net.minecraft.world.entity.getDeltaMovement
    net.minecraft.world.entity.spawnSprintParticle
    net.minecraft.world.entity.getYRotf

  • 获取轨迹所经过的方块,添加到队列
    package net.minecraft.world.entity.projectile.shoot

  • 箭的运动
    net.minecraft.world.entity.projectile.AbstractArrow.tick

  • tick级计算并获取计算后的角度和力度
    // TODO

  • 方向控制
    carpet.helpers.EntityPlayerActionPack.look
    net.minecraft.world.entity.ai.control.LookControl.tick
    net.minecraft.world.entity.Entity.setRot

  • 火力控制
    carpet.helpers.EntityPlayerActionPack.ActionType.USE
    net.minecraft.world.item.SnowballItem.use
    net.minecraft.world.entity.projectile.Projectile.shoot
    net.minecraft.world.entity.projectile.Projectile.shootFromRotation
    net.minecraft.world.item.BowItem.releaseUsing

  • 检查弓物品的使用状态
    net.minecraft.world.entity.ai.goal.RangedBowAttackGoal.isHoldingBow

  • 图腾检测
    net.minecraft.world.entity.LivingEntity.checkTotemDeathProtection

待研究

  • 检测弓的使用*
    net.minecraft.world.entity.LivingEntity.releaseUsingItem 结束阶段
    net.minecraft.world.entity.LivingEntity.updateUsingItem 可能是中期阶段,待验证

  • 实体
    net.minecraft.world.entity.Entity.getOnPos 脚底方块
    net.minecraft.world.entity.Entity.getXRot 角度