Artificial intelligence NPC未移动到目标位置
我正在使用citizensAPI生成和操纵NPC。代码如下 我正试图找到半径为20的最近的丛林木块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.
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);