import org.bukkit.entity.Ageable; //导入方法依赖的package包/类
@Override
public boolean spawn() {
// check if our current old entity is still valid:
if (this.isActive()) return true;
if (entity != null) {
// clean up metadata before replacing the currently stored entity with a new one:
this.removeShopkeeperMetadata(entity);
}
// prepare location:
World world = Bukkit.getWorld(shopkeeper.getWorldName());
Location location = new Location(world, shopkeeper.getX() + 0.5D, shopkeeper.getY() + 0.5D, shopkeeper.getZ() + 0.5D);
// find old shopkeeper entity, else spawn a new one:
if (!this.searchOldEntity(location)) {
// TODO check if the block is passable before spawning there?
// try to bypass entity-spawn blocking plugins:
EntityType entityType = this.getEntityType();
ShopkeepersPlugin.getInstance().forceCreatureSpawn(location, entityType);
entity = (LivingEntity) world.spawnEntity(location, entityType);
uuid = entity.getUniqueId().toString();
}
if (this.isActive()) {
// assign metadata for easy identification by other plugins:
this.assignShopkeeperMetadata(entity);
this.setName(shopkeeper.getName());
// configure some entity attributes:
entity.eject(); // some entities might automatically mount on nearby entities (like baby zombies on chicken)
entity.setRemoveWhenFarAway(false);
entity.setCanPickupItems(false);
// disable breeding:
if (entity instanceof Ageable) {
Ageable ageable = ((Ageable) entity);
ageable.setBreed(false);
ageable.setAgeLock(true);
}
// remove potion effects:
for (PotionEffect potionEffect : entity.getActivePotionEffects()) {
entity.removePotionEffect(potionEffect.getType());
}
// overwrite AI:
this.overwriteAI();
// apply sub type:
this.applySubType();
// success:
return true;
} else {
// failure:
entity = null;
return false;
}
}