Artificial intelligence NPC未移动到目标位置

Artificial intelligence NPC未移动到目标位置,artificial-intelligence,minecraft,bukkit,minecraft-forge,Artificial Intelligence,Minecraft,Bukkit,Minecraft Forge,我正在使用citizensAPI生成和操纵NPC。代码如下 我正试图找到半径为20的最近的丛林木块 package org.mineacademy.orion.npctest; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.PathStrategy; import net.citizensnpcs.api.hpastar.Tile; import net.citizensnpcs.api.npc.

我正在使用citizensAPI生成和操纵NPC。代码如下

我正试图找到半径为20的最近的丛林木块

package org.mineacademy.orion.npctest;

import net.citizensnpcs.api.CitizensAPI;
import net.citizensnpcs.api.ai.PathStrategy;
import net.citizensnpcs.api.hpastar.Tile;
import net.citizensnpcs.api.npc.NPC;
import net.citizensnpcs.npc.ai.AStarNavigationStrategy;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.mineacademy.fo.command.SimpleCommand;

public class BlockFinder extends SimpleCommand {

    public BlockFinder(){
        super("finder");
    }

    public void onCommand() {
        checkConsole();

        NPC npc= CitizensAPI.getNPCRegistry().createNPC(EntityType.VILLAGER,"cutter");
        Player player=getPlayer();
        npc.spawn(player.getTargetBlock(null, 5).getLocation().add(3, 3, 0));

        //add location and setTarget to that location.

        Location finalLoc=newLocation(npc,player);
        npc.setProtected(false);
        npc.faceLocation(finalLoc);
        npc.getNavigator().setTarget(finalLoc);


    }

    public Location newLocation(NPC npc, Player player) {
        double r =25;
        double x=npc.getEntity().getLocation().getX();
        double y=npc.getEntity().getLocation().getY();
        double z=npc.getEntity().getLocation().getZ();
        int minx=(int)(x-r);
        int miny=(int)(y-r);
        int minz=(int)(z-r);
        int maxx=(int)(x+r);
        int maxy=(int)(y+r);
        int maxz=(int)(z+r);
        Location nloc=new Location(npc.getEntity().getWorld(),x,y,z);
        for(int rx=minx;rx<=maxx;rx++) {
            for (int ry = miny; ry <= maxy; ry++) {
                for (int rz = minz; rz <= maxz; rz++) {
                    Block block = player.getWorld().getBlockAt(rx, ry, rz);
                    if (block.getType() == Material.JUNGLE_WOOD) {
                        nloc.setX(rx);
                        nloc.setY(ry);
                        nloc.setZ(rz);
                        return nloc;
                    }
                }
            }
        }
        return nloc;
    }

}
package org.mineaccademy.orion.npctest;
导入net.citizensnpcs.api.CitizensAPI;
导入net.citizensnpcs.api.ai.PathStrategy;
导入net.citizensnpcs.api.hpastar.Tile;
导入net.citizensnpcs.api.npc.npc;
导入net.citizensnpc.npc.ai.AStarNavigationStrategy;
导入org.bukkit.Location;
导入org.bukkit.Material;
导入org.bukkit.block.block;
导入org.bukkit.entity.EntityType;
导入org.bukkit.entity.Player;
导入org.mineaccademy.fo.command.SimpleCommand;
公共类BlockFinder扩展了SimpleCommand{
公共拦截器(){
超级(“中间人”);
}
命令()上的公共无效{
检查控制台();
NPC NPC=CitizensAPI.getNPCRegistry().createNPC(EntityType.VILLAGER,“cuter”);
Player=getPlayer();
spawn(player.getTargetBlock(null,5.getLocation().add(3,3,0));
//将位置和setTarget添加到该位置。
地点最终=新地点(npc,玩家);
npc.setProtected(假);
npc.面部定位(最终);
npc.getNavigator().setTarget(finalLoc);
}
公共位置新位置(NPC NPC,玩家){
双r=25;
双x=npc.getEntity().getLocation().getX();
双y=npc.getEntity().getLocation().getY();
双z=npc.getEntity().getLocation().getZ();
int minx=(int)(x-r);
int miny=(int)(y-r);
int minz=(int)(z-r);
int max=(int)(x+r);
int最大值=(int)(y+r);
intmaxz=(int)(z+r);
位置nloc=新位置(npc.getEntity().getWorld(),x,y,z);

对于(int rx=minx;rx首先,您应该检查NPC是否存在:
NPC.isSpawned()
-boolean

然后,您应该在NPCSpawnEvent()之后触发此部件:

顺便说一下,你可以用谷歌搜索:

我发现这真的很有用

        Location finalLoc=newLocation(npc,player);
        npc.setProtected(false);
        npc.faceLocation(finalLoc);
        npc.getNavigator().setTarget(finalLoc);