package com.comphenix.xp.mods; import org.bukkit.Material; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType.SlotType; import com.comphenix.xp.ActionTypes; import com.comphenix.xp.extra.PermissionSystem.CustomPermission; import com.comphenix.xp.lookup.ItemQuery; public class StandardBlockService implements BlockService { /** * Name of this service. */ public static String NAME = "STANDARD"; @Override public BlockResponse processClickEvent(InventoryClickEvent event, ItemQuery block) { // Crafting, smelting and potion check boolean isCraftResult = event.getSlotType() == SlotType.RESULT; boolean isPotionResult = event.getRawSlot() < 3; // Empty slots are ignored if (!BlockResponse.hasCurrentItem(event)) return BlockResponse.FAILURE; InventoryType type = event.getInventory().getType(); // Handle different types switch (type) { case BREWING: // Make sure this is a potion result slot if (isPotionResult && match(block, Material.BREWING_STAND)) { return new BlockResponse(type, ActionTypes.BREWING, CustomPermission.REWARDS_BREWING.getBukkitPerm()); } break; case CRAFTING: // Player crafting - meaning that the block query is irrelevant if (isCraftResult) { return new BlockResponse(type, ActionTypes.CRAFTING, CustomPermission.REWARDS_CRAFTING.getBukkitPerm()); } break; case WORKBENCH: if (isCraftResult && match(block, Material.WORKBENCH)) { return new BlockResponse(type, ActionTypes.CRAFTING, CustomPermission.REWARDS_CRAFTING.getBukkitPerm()); } break; case FURNACE: if (isCraftResult && match(block, Material.FURNACE, Material.BURNING_FURNACE)) { return new BlockResponse(type, ActionTypes.SMELTING, CustomPermission.REWARDS_SMELTING.getBukkitPerm()); } break; default: // Invalid break; } // Unable to process block return BlockResponse.FAILURE; } // Check the given block private boolean match(ItemQuery block, Material... materials) { // If we don't have a block, we've failed to record the last interaction - but we'll still // accept standard actions. if (block == null) return true; // Find a match for (Material mat : materials) { if (block.match(mat)) return true; } return false; } @Override public String getServiceName() { return NAME; } }