@EventHandler
 public void onTaming(EntityTameEvent event) {
   if (event.getOwner() instanceof Player) {
     String playerID = PlayerConverter.getID((Player) event.getOwner());
     if (!dataMap.containsKey(playerID)) {
       return;
     }
     LivingEntity entity = event.getEntity();
     TameData playerData = (TameData) dataMap.get(playerID);
     switch (type) {
       case WOLF:
         if (entity.getType().equals(EntityType.WOLF) && checkConditions(playerID)) {
           playerData.subtract();
         }
         break;
       case OCELOT:
         if (entity.getType().equals(EntityType.OCELOT) && checkConditions(playerID)) {
           playerData.subtract();
         }
         break;
       case HORSE:
         if (entity.getType().equals(EntityType.HORSE) && checkConditions(playerID)) {
           playerData.subtract();
         }
         break;
       default:
         break;
     }
     if (playerData.isZero()) {
       completeObjective(playerID);
     }
   }
 }
 @EventHandler
 public void onBlockPlace(BlockPlaceEvent event) {
   String playerID = PlayerConverter.getID(event.getPlayer());
   // if the player has this objective, the event isn't canceled,
   // the block is correct and conditions are met
   if (containsPlayer(playerID)
       && !event.isCancelled()
       && event.getBlock().getType().equals(material)
       && (data < 0 || event.getBlock().getData() == data)
       && checkConditions(playerID)) {
     // add the block to the total amount
     BlockData playerData = (BlockData) dataMap.get(playerID);
     playerData.add();
     // complete the objective
     if (playerData.getAmount() == neededAmount) {
       completeObjective(playerID);
     } else if (notify) {
       // or maybe display a notification
       if (playerData.getAmount() > neededAmount) {
         Config.sendMessage(
             playerID,
             "blocks_to_break",
             new String[] {String.valueOf(playerData.getAmount() - neededAmount)});
       } else {
         Config.sendMessage(
             playerID,
             "blocks_to_place",
             new String[] {String.valueOf(neededAmount - playerData.getAmount())});
       }
     }
   }
 }
 @EventHandler
 public void onLevelUp(PlayerLevelChangeEvent event) {
   String playerID = PlayerConverter.getID(event.getPlayer());
   if (!containsPlayer(playerID)) {
     return;
   }
   if (event.getNewLevel() >= level && checkConditions(playerID)) {
     completeObjective(playerID);
   }
 }