Spigot 1.20.1中如何替换PathEntity与EntityInsentient类?
在Spigot 1.20.1中替换PathEntity和EntityInsentient的解决方案
Spigot 1.20.1对应Minecraft 1.20.1的NMS(Net Minecraft Server)代码有较大重构,原EntityInsentient和PathEntity类已被重命名,同时导航相关方法也做了调整。以下是适配后的代码及关键说明:
适配后的代码
import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.level.pathfinder.Path; import net.minecraft.world.entity.ai.navigation.Navigation; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity; // 注意版本号对应,1.20.1的CraftBukkit包为v1_20_R1 // ... 保留原有其他导入类 public void lungeTask(Entity entity) { this.entity = entity; Location spawnLoc = getLocAroundCircle(this.player.getLocation(), Double.valueOf(Lunged.getInstance().getConfiguration().getRadius()), Double.valueOf(0.0D)); // 校验实体类型,避免非导航型实体强转报错 if (!(entity instanceof CraftEntity) || !(((CraftEntity) entity).getHandle() instanceof PathfinderMob)) { return; } PathfinderMob nmsEntity = ((PathfinderMob) ((CraftEntity) entity).getHandle()); Navigation navigation = nmsEntity.getNavigation(); // 生成目标路径(替代原PathEntity) Path path = navigation.createPath(spawnLoc.getX(), spawnLoc.getY(), spawnLoc.getZ(), 0); Location center = this.player.getLocation(); // 启动实体导航移动(替代原a()方法) navigation.moveTo(path, 1.78D); this.task = Bukkit.getScheduler().runTaskTimer(Lunged.getInstance(), () -> { if (entity.getLocation().distance(spawnLoc) < 1.0D) { lunge(entity, center); this.task.cancel(); } else { navigation.moveTo(path, 1.78D); } }, 0L, 2L); }
关键变更点
- EntityInsentient → PathfinderMob:Mojang在1.19+版本中将具有自主导航能力的智能实体统一归类到
PathfinderMob类,替代了旧版的EntityInsentient。 - PathEntity → Path:路径对象类重命名为
net.minecraft.world.level.pathfinder.Path,功能与旧版一致,但包路径和类名调整。 - 导航方法调整:
- 原
getNavigation().a(x,y,z, range)替换为navigation.createPath(x,y,z, range),用于生成目标点的导航路径。 - 原
getNavigation().a(path, speed)替换为navigation.moveTo(path, speed),用于驱动实体沿生成的路径移动。
- 原
- 版本兼容性:CraftBukkit的包版本(如
v1_20_R1)必须与你的Spigot版本严格对应,否则会出现类加载错误。
内容的提问来源于stack exchange,提问作者Kifo
相关产品推荐
相关产品推荐

