Skip to content

Commit

Permalink
完成弓箭、弹幕、枪械的骑乘 AI 设计
Browse files Browse the repository at this point in the history
  • Loading branch information
TartaricAcid committed Oct 2, 2024
1 parent 55c3ebc commit 6796fab
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ protected void start(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn)
@Override
protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) {
owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).ifPresent((target) -> {
//实际上按照原版mc判定是看不见的,强行看见并朝向(没关就是开了?)
// 实际上按照原版mc判定是看不见的,强行看见并朝向(没关就是开了?)
owner.getLookControl().setLookAt(target.getX(), target.getY(), target.getZ());
boolean canSee = GunBehaviorUtils.canSee(owner, target);
boolean seeTimeMoreThanZero = this.seeTime > 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,19 @@ public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createBrainTasks
);
}

@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createRideBrainTasks(EntityMaid maid) {
BehaviorControl<EntityMaid> supplementedTask = StartAttacking.create(this::mainhandHoldGun, GunBehaviorUtils::findFirstValidAttackTarget);
BehaviorControl<EntityMaid> findTargetTask = StopAttackingIfTargetInvalid.create(target -> !mainhandHoldGun(maid) || farAway(target, maid));
BehaviorControl<EntityMaid> gunShootTargetTask = new GunShootTargetTask();

return Lists.newArrayList(
Pair.of(5, supplementedTask),
Pair.of(5, findTargetTask),
Pair.of(5, gunShootTargetTask)
);
}

@Override
public List<Pair<String, Predicate<EntityMaid>>> getConditionDescription(EntityMaid maid) {
return Collections.singletonList(Pair.of("has_tacz_gun", this::mainhandHoldGun));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ private static void registerRideWorkGoals(Brain<EntityMaid> brain, EntityMaid ma
if (task.enableLookAndRandomWalk(maid)) {
pairMaidList.add(Pair.of(20, getLook()));
}
brain.addActivity(InitEntities.RIDE_WORK.get(), ImmutableList.of(updateActivity));
brain.addActivity(InitEntities.RIDE_WORK.get(), ImmutableList.copyOf(pairMaidList));
}

private static void registerRideRestGoals(Brain<EntityMaid> brain) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ protected boolean checkExtraStartConditions(ServerLevel worldIn, EntityMaid owne
if (memory.isPresent()) {
LivingEntity target = memory.get();
return owner.isHolding(item -> item.getItem() instanceof ProjectileWeaponItem)
&& BehaviorUtils.canSee(owner, target)
&& BehaviorUtils.isWithinAttackRange(owner, target, 0);
&& BehaviorUtils.canSee(owner, target)
&& BehaviorUtils.isWithinAttackRange(owner, target, 0);
}
return false;
}
Expand All @@ -51,6 +51,8 @@ protected void start(ServerLevel worldIn, EntityMaid entityIn, long gameTimeIn)
@Override
protected void tick(ServerLevel worldIn, EntityMaid owner, long gameTime) {
owner.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).ifPresent((target) -> {
// 强行看见并朝向
owner.getLookControl().setLookAt(target.getX(), target.getY(), target.getZ());
boolean canSee = BehaviorUtils.canSee(owner, target);
boolean seeTimeMoreThanZero = this.seeTime > 0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,7 @@
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.ai.attributes.AttributeInstance;
import net.minecraft.world.entity.ai.attributes.Attributes;
import net.minecraft.world.entity.ai.behavior.BehaviorControl;
import net.minecraft.world.entity.ai.behavior.SetWalkTargetFromAttackTargetIfTargetOutOfReach;
import net.minecraft.world.entity.ai.behavior.StartAttacking;
import net.minecraft.world.entity.ai.behavior.StopAttackingIfTargetInvalid;
import net.minecraft.world.entity.ai.behavior.*;
import net.minecraft.world.entity.projectile.AbstractArrow;
import net.minecraft.world.entity.projectile.ProjectileUtil;
import net.minecraft.world.item.BowItem;
Expand Down Expand Up @@ -73,6 +70,19 @@ public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createBrainTasks
);
}

@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createRideBrainTasks(EntityMaid maid) {
BehaviorControl<EntityMaid> supplementedTask = StartAttacking.create(e -> hasBow(e) && hasArrow(e), IAttackTask::findFirstValidAttackTarget);
BehaviorControl<EntityMaid> findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasBow(maid) || !hasArrow(maid) || farAway(target, maid));
BehaviorControl<EntityMaid> shootTargetTask = new MaidShootTargetTask(2);

return Lists.newArrayList(
Pair.of(5, supplementedTask),
Pair.of(5, findTargetTask),
Pair.of(5, shootTargetTask)
);
}

@Override
public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) {
AbstractArrow entityArrow = getArrow(shooter, distanceFactor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,19 @@ public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createBrainTasks
);
}

@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createRideBrainTasks(EntityMaid maid) {
BehaviorControl<EntityMaid> supplementedTask = StartAttacking.create(entityMaid -> hasCrossBow(entityMaid) && hasAmmunition(entityMaid), IAttackTask::findFirstValidAttackTarget);
BehaviorControl<EntityMaid> findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasCrossBow(maid) || !hasAmmunition(maid) || farAway(target, maid));
BehaviorControl<EntityMaid> shootTargetTask = new CrossbowAttack<>();

return Lists.newArrayList(
Pair.of(5, supplementedTask),
Pair.of(5, findTargetTask),
Pair.of(5, shootTargetTask)
);
}

@Override
public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) {
shooter.performCrossbowAttack(shooter, 1.6F);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,19 @@ public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createBrainTasks
);
}

@Override
public List<Pair<Integer, BehaviorControl<? super EntityMaid>>> createRideBrainTasks(EntityMaid maid) {
BehaviorControl<EntityMaid> supplementedTask = StartAttacking.create(this::hasGohei, IAttackTask::findFirstValidAttackTarget);
BehaviorControl<EntityMaid> findTargetTask = StopAttackingIfTargetInvalid.create((target) -> !hasGohei(maid) || farAway(target, maid));
BehaviorControl<EntityMaid> shootTargetTask = new MaidShootTargetTask(2);

return Lists.newArrayList(
Pair.of(5, supplementedTask),
Pair.of(5, findTargetTask),
Pair.of(5, shootTargetTask)
);
}

@Override
public void performRangedAttack(EntityMaid shooter, LivingEntity target, float distanceFactor) {
shooter.getBrain().getMemory(MemoryModuleType.NEAREST_LIVING_ENTITIES).ifPresent(livingEntities -> {
Expand Down

0 comments on commit 6796fab

Please sign in to comment.