diff --git a/src/main/java/org/mineplugin/locusazzurro/icaruswings/client/particle/PlasmaTrailParticle.java b/src/main/java/org/mineplugin/locusazzurro/icaruswings/client/particle/PlasmaTrailParticle.java index 75c72d3..8e456df 100644 --- a/src/main/java/org/mineplugin/locusazzurro/icaruswings/client/particle/PlasmaTrailParticle.java +++ b/src/main/java/org/mineplugin/locusazzurro/icaruswings/client/particle/PlasmaTrailParticle.java @@ -19,7 +19,7 @@ public PlasmaTrailParticle(ClientLevel world, double x, double y, double z, doub this.xd = xSpeed + (Math.random() * 2.0d - 1.0d) * 0.005d; this.yd = ySpeed + (Math.random() * 2.0d - 1.0d) * 0.005d; this.zd = zSpeed + (Math.random() * 2.0d - 1.0d) * 0.005d; - this.lifetime = (int)(10 / Math.random() * 1.5f); + this.lifetime = (int)Math.min(50f, (10 / Math.random() * 1.5f)); this.hasPhysics = true; } diff --git a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/entity/ArtemisMissileEntity.java b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/entity/ArtemisMissileEntity.java index 43afb9d..c11a240 100644 --- a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/entity/ArtemisMissileEntity.java +++ b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/entity/ArtemisMissileEntity.java @@ -35,6 +35,7 @@ public class ArtemisMissileEntity extends AbstractHurtingProjectile { private static final int DEFAULT_FUEL = 1200; // Default: 1200 (60s) private int fuel; private double homingSpeed = 1.1; + private double cruisingSpeed = 0.8; private static final ParticleOptions PARTICLE = ParticleRegistry.PLASMA_TRAIL.get(); // 空白粒子 @@ -140,6 +141,10 @@ public void tick() { .normalize().scale(homingSpeed); this.setDeltaMovement(v3d); } + else { + this.setDeltaMovement(this.getDeltaMovement().normalize().scale(cruisingSpeed)); + } + if (this.fuel <= 0) { this.onEmptyFuel(); } diff --git a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisLauncher.java b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisLauncher.java index f0f7d4c..24f5654 100644 --- a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisLauncher.java +++ b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisLauncher.java @@ -32,7 +32,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In return InteractionResultHolder.pass(item); } - LivingEntity entity = ProjectileUtils.rayTraceTarget(playerIn, 0.1f, 300, 1); + LivingEntity entity = ProjectileUtils.rayTraceTarget(playerIn, ProjectileUtils.IS_HOSTILE, 0.5f, 500, 2); ArtemisMissileEntity missile; if (entity != null) { missile = new ArtemisMissileEntity(worldIn, playerIn, entity); diff --git a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisTransportCard.java b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisTransportCard.java index c056eef..5217bff 100644 --- a/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisTransportCard.java +++ b/src/main/java/org/mineplugin/locusazzurro/icaruswings/common/item/ArtemisTransportCard.java @@ -38,7 +38,7 @@ public InteractionResultHolder use(Level worldIn, Player playerIn, In LivingEntity target = null; boolean homing = (type == CardType.ARTEMIS_HOMING); if (homing) { - target = ProjectileUtils.rayTraceTarget(playerIn, 0.1d, 300, 0.2); + target = ProjectileUtils.rayTraceTarget(playerIn, ProjectileUtils.IS_HOSTILE, 0.5f, 500, 2); if (target == null) { if (!worldIn.isClientSide()) { playerIn.sendSystemMessage(Component.translatable("item.locusazzurro_icaruswings.transport_card_artemis.error1")); diff --git a/src/main/java/org/mineplugin/locusazzurro/icaruswings/util/ProjectileUtils.java b/src/main/java/org/mineplugin/locusazzurro/icaruswings/util/ProjectileUtils.java index 06044d0..ed8d476 100644 --- a/src/main/java/org/mineplugin/locusazzurro/icaruswings/util/ProjectileUtils.java +++ b/src/main/java/org/mineplugin/locusazzurro/icaruswings/util/ProjectileUtils.java @@ -1,16 +1,20 @@ package org.mineplugin.locusazzurro.icaruswings.util; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobCategory; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; import java.util.List; +import java.util.function.Predicate; public class ProjectileUtils { + public static final Predicate IS_HOSTILE = e -> e.getType().getCategory().equals(MobCategory.MONSTER); + @Nullable - public static LivingEntity rayTraceTarget(LivingEntity targeter, double step, int depth, double size){ + public static LivingEntity rayTraceTarget(LivingEntity targeter, Predicate criteria, double step, int depth, double size){ Vec3 eyePos = targeter.getEyePosition(1f); Vec3 lookVec = targeter.getViewVector(1f); Vec3 checkPos = eyePos; @@ -19,7 +23,7 @@ public static LivingEntity rayTraceTarget(LivingEntity targeter, double step, in AABB aabb = new AABB(hS,hS,hS,-hS,-hS,-hS).move(checkPos); List entities = targeter.level().getEntitiesOfClass(LivingEntity.class, aabb); for (LivingEntity entity : entities){ - if (entity != targeter && targeter.hasLineOfSight(entity)) return entity; + if (entity != targeter && criteria.test(entity) && targeter.hasLineOfSight(entity)) return entity; } checkPos = checkPos.add(lookVec.scale(step)); } @@ -27,8 +31,8 @@ public static LivingEntity rayTraceTarget(LivingEntity targeter, double step, in } @Nullable - public static LivingEntity rayTraceTargetFixedDistance(LivingEntity targeter, double step, int distance, double size){ - return rayTraceTarget(targeter, step, (int)Math.ceil(distance/step), size); + public static LivingEntity rayTraceTargetFixedDistance(LivingEntity targeter, Predicate criteria, double step, int distance, double size){ + return rayTraceTarget(targeter, criteria, step, (int)Math.ceil(distance/step), size); } }