@Override public Hostage getHostage(Entity entity) { Hostage h; try { h = (Hostage) ((CraftEntity) entity).getHandle(); } catch (ClassCastException ex) { // Caused by baby villager or a non-Hostage Villager. plugin .debug() .log( "onHostageInteract() ClassCastException: most likely " + "caused by a baby villager or a Villager that is not a Hostage."); Villager v = (Villager) entity; World world = ((CraftWorld) v.getWorld()).getHandle(); CraftHostage hostage = new CraftHostage(world, v.getProfession().getId()); hostage.setLocation(v.getLocation()); world.removeEntity(((CraftEntity) entity).getHandle()); world.addEntity(hostage); hostage.setHealth((float) v.getHealth()); hostage.setProfessionType(v.getProfession()); hostage.setCustomName(v.getCustomName()); return hostage; } return h; }
// returns false, if the player wasn't able to hire this villager @SuppressWarnings("deprecation") // because of player.updateInventory() private boolean handleHireOtherVillager(Player player, Villager villager) { // hire him if holding his hiring item ItemStack inHand = player.getItemInHand(); if (Settings.isHireItem(inHand)) { Inventory inventory = player.getInventory(); // check if the player has enough of those hiring items int costs = Settings.hireOtherVillagersCosts; if (costs > 0) { if (Utils.hasInventoryItemsAtLeast( inventory, Settings.hireItem, (short) Settings.hireItemData, costs)) { Log.debug(" Villager hiring: the player has the needed amount of hiring items"); int inHandAmount = inHand.getAmount(); int remaining = inHandAmount - costs; Log.debug( " Villager hiring: in hand=" + inHandAmount + " costs=" + costs + " remaining=" + remaining); if (remaining > 0) { inHand.setAmount(remaining); } else { // remaining <= 0 player.setItemInHand(null); // remove item in hand if (remaining < 0) { // remove remaining costs from inventory Utils.removeItemsFromInventory( inventory, Settings.hireItem, (short) Settings.hireItemData, -remaining); } } } else { Utils.sendMessage(player, Settings.msgCantHire); return false; } } // give player the creation item ItemStack creationItem = Settings.createCreationItem(); Map<Integer, ItemStack> remaining = inventory.addItem(creationItem); if (!remaining.isEmpty()) { villager.getWorld().dropItem(villager.getLocation(), creationItem); } // remove the entity: villager.remove(); // update client's inventory player.updateInventory(); Utils.sendMessage(player, Settings.msgHired); return true; } else { Utils.sendMessage( player, Settings.msgVillagerForHire, "{costs}", String.valueOf(Settings.hireOtherVillagersCosts), "{hire-item}", Settings.hireItem.toString()); } return false; }