use of org.bukkit.event.inventory.InventoryType.SlotType in project MagicPlugin by elBukkit.
the class CraftingController method onInventoryClick.
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player))
return;
if (event.isCancelled())
return;
InventoryType inventoryType = event.getInventory().getType();
SlotType slotType = event.getSlotType();
// Check for wand clicks to prevent grinding them to dust, or whatever.
if (slotType == SlotType.CRAFTING && (inventoryType == InventoryType.CRAFTING || inventoryType == InventoryType.WORKBENCH)) {
ItemStack cursor = event.getCursor();
if (Wand.isSpecial(cursor)) {
event.setCancelled(true);
return;
}
}
}
use of org.bukkit.event.inventory.InventoryType.SlotType in project MagicPlugin by elBukkit.
the class EnchantingController method onInventoryClick.
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (event.isCancelled())
return;
InventoryType inventoryType = event.getInventory().getType();
SlotType slotType = event.getSlotType();
if (enchantingEnabled && inventoryType == InventoryType.ENCHANTING) {
if (slotType == SlotType.CRAFTING) {
HumanEntity clicker = event.getWhoClicked();
Player player = clicker instanceof Player ? (Player) clicker : null;
if (player == null || !controller.hasPermission(player, "Magic.wand.enchant")) {
return;
}
ItemStack cursor = event.getCursor();
ItemStack current = event.getCurrentItem();
// Make wands into an enchantable item when placing
if (Wand.isWand(cursor)) {
Wand wand = controller.getWand(cursor);
if (wand.isModifiable()) {
wand.makeEnchantable(true);
}
}
// And turn them back when taking out
if (Wand.isWand(current)) {
Wand wand = controller.getWand(current);
if (wand.isModifiable()) {
wand.makeEnchantable(false);
}
}
}
}
}
use of org.bukkit.event.inventory.InventoryType.SlotType in project Glowstone by GlowstoneMC.
the class WindowClickHandler method process.
private boolean process(GlowPlayer player, WindowClickMessage message) {
int viewSlot = message.getSlot();
InventoryView view = player.getOpenInventory();
GlowInventory top = (GlowInventory) view.getTopInventory();
GlowInventory bottom = (GlowInventory) view.getBottomInventory();
ItemStack slotItem = InventoryUtil.itemOrEmpty(view.getItem(viewSlot));
ItemStack cursor = player.getItemOnCursor();
// check that the player has a correct view of the item
if (!Objects.equals(message.getItem(), slotItem) && (message.getMode() == 0 || message.getMode() == 1)) {
// in mode 3 (get) and 4 (drop), client does not send item in slot under cursor
if (message.getMode() == 0 || !InventoryUtil.isEmpty(message.getItem())) {
// recipe slot is not synced by design
if (view.getTopInventory().getType() != InventoryType.CRAFTING || viewSlot >= view.getTopInventory().getSize() || ((GlowInventory) view.getTopInventory()).getSlot(viewSlot).getType() != SlotType.RESULT) {
player.sendItemChange(viewSlot, slotItem);
return false;
}
}
}
// determine inventory and slot clicked, used in some places
// todo: attempt to allow for users to implement their own inventory?
// CraftBukkit does not allow this but it may be worth the trouble for
// the extensibility.
GlowInventory inv;
if (viewSlot < top.getSize()) {
inv = top;
} else {
inv = bottom;
}
int invSlot = view.convertSlot(viewSlot);
if (invSlot == -1 || viewSlot == -1) {
return true;
}
SlotType slotType = inv.getSlotType(invSlot);
// handle dragging
if (message.getMode() == 5) {
// 5 0 * start left drag
// 5 1 add slot left drag
// 5 2 * end left drag
// 5 4 * start right drag
// 5 5 add slot right drag
// 5 6 * end right drag
DragTracker drag = player.getInventory().getDragTracker();
boolean right = message.getButton() >= 4;
switch(message.getButton()) {
// start left drag
case 0:
case // start right drag
4:
return drag.start(right);
// add slot left
case 1:
case // add slot right
5:
return drag.addSlot(right, message.getSlot());
// end left drag
case 2:
case // end right drag
6:
List<Integer> slots = drag.finish(right);
if (slots == null || InventoryUtil.isEmpty(cursor)) {
return false;
}
ItemStack newCursor = cursor.clone();
Map<Integer, ItemStack> newSlots = new HashMap<>();
int perSlot = right ? 1 : cursor.getAmount() / slots.size();
for (int dragSlot : slots) {
ItemStack oldItem = view.getItem(dragSlot);
if (InventoryUtil.isEmpty(oldItem) || cursor.isSimilar(oldItem)) {
Inventory dragInv = dragSlot < top.getSize() ? top : bottom;
int oldItemAmount = InventoryUtil.itemOrEmpty(oldItem).getAmount();
int transfer = Math.min(Math.min(perSlot, cursor.getAmount()), maxStack(dragInv, cursor.getType()) - oldItemAmount);
ItemStack newItem = combine(oldItem, cursor, transfer);
newSlots.put(dragSlot, newItem);
newCursor = amountOrEmpty(newCursor, newCursor.getAmount() - transfer);
if (InventoryUtil.isEmpty(newCursor)) {
break;
}
}
}
InventoryDragEvent event = new InventoryDragEvent(view, newCursor, cursor, right, newSlots);
EventFactory.getInstance().callEvent(event);
if (event.isCancelled()) {
return false;
}
for (Entry<Integer, ItemStack> entry : newSlots.entrySet()) {
view.setItem(entry.getKey(), entry.getValue());
}
player.setItemOnCursor(newCursor);
return true;
default:
return false;
}
}
// determine what action will be taken and fire event
ClickType clickType = WindowClickLogic.getClickType(message.getMode(), message.getButton(), viewSlot);
InventoryAction action = WindowClickLogic.getAction(clickType, slotType, cursor, slotItem);
if (clickType == ClickType.UNKNOWN || action == InventoryAction.UNKNOWN) {
// show a warning for unknown click type
GlowServer.logger.warning(player.getName() + ": mystery window click " + clickType + "/" + action + ": " + message);
}
// deny CLONE_STACK for non-creative mode players
if (action == InventoryAction.CLONE_STACK && player.getGameMode() != GameMode.CREATIVE) {
action = InventoryAction.NOTHING;
}
// determine whether NO_AI, HOTBAR_MOVE_AND_READD or HOTBAR_SWAP should be executed
if (clickType == ClickType.NUMBER_KEY) {
ItemStack destItem = bottom.getItem(message.getButton());
if (InventoryUtil.isEmpty(slotItem)) {
if (InventoryUtil.isEmpty(destItem) || !inv.itemPlaceAllowed(invSlot, destItem)) {
// both items are empty, do nothing
// or, current item is empty and destItem cannot be moved into current slot
action = InventoryAction.NOTHING;
}
} else if (inv != bottom || !inv.itemPlaceAllowed(invSlot, destItem)) {
// target and source inventory are different or destItem cannot be placed in
// current slot
action = InventoryAction.HOTBAR_MOVE_AND_READD;
}
}
if (WindowClickLogic.isPlaceAction(action)) {
// check whether item can be dropped into the clicked slot
if (!inv.itemPlaceAllowed(invSlot, cursor)) {
// placement not allowed
if (!InventoryUtil.isEmpty(slotItem) && slotItem.isSimilar(cursor)) {
// item in slot is the same as item on cursor
if (cursor.getAmount() + 1 == cursor.getMaxStackSize()) {
// There is still space under the cursor for one item
action = InventoryAction.PICKUP_ONE;
} else if (cursor.getAmount() < cursor.getMaxStackSize()) {
// There is still some space under the cursor
action = InventoryAction.PICKUP_SOME;
}
} else {
action = InventoryAction.NOTHING;
}
}
}
InventoryClickEvent event = null;
if (top == inv && top instanceof GlowCraftingInventory && top.getSlotType(invSlot) == SlotType.RESULT) {
// Clicked on output slot of crafting inventory
if (InventoryUtil.isEmpty(slotItem)) {
// No crafting recipe result, don't do anything
action = InventoryAction.NOTHING;
}
int cursorAmount = InventoryUtil.itemOrEmpty(cursor).getAmount();
if (message.getMode() == 0 && slotItem.isSimilar(cursor)) {
if (!InventoryUtil.isEmpty(slotItem) && cursorAmount + slotItem.getAmount() <= slotItem.getMaxStackSize()) {
// if the player can take the whole result
if (WindowClickLogic.isPickupAction(action) || WindowClickLogic.isPlaceAction(action)) {
// always take the whole crafting result out of the crafting inventories
action = InventoryAction.PICKUP_ALL;
} else if (action == InventoryAction.DROP_ONE_SLOT) {
// always drop the whole stack, not just single items
action = InventoryAction.DROP_ALL_SLOT;
}
} else {
// if their cursor is full, do nothing
action = InventoryAction.NOTHING;
}
}
// this ignores whether the crafting process actually happens (full inventory, etc.)
if (action != InventoryAction.NOTHING) {
Recipe recipe = ((CraftingInventory) inv).getRecipe();
if (clickType == ClickType.NUMBER_KEY) {
event = new CraftItemEvent(recipe, view, slotType, viewSlot, clickType, action, message.getButton());
} else {
event = new CraftItemEvent(recipe, view, slotType, viewSlot, clickType, action);
}
}
}
if (event == null) {
if (clickType == ClickType.NUMBER_KEY) {
event = new InventoryClickEvent(view, slotType, viewSlot, clickType, action, message.getButton());
} else {
event = new InventoryClickEvent(view, slotType, viewSlot, clickType, action);
}
}
EventFactory.getInstance().callEvent(event);
if (event.isCancelled()) {
int slot = event.getSlot();
player.getSession().send(new SetWindowSlotMessage(player.getOpenWindowId(), slot, event.getInventory().getItem(slot)));
player.getSession().send(new SetWindowSlotMessage(-1, -1, player.getItemOnCursor()));
return true;
}
boolean handled = true;
switch(action) {
case NOTHING:
break;
case UNKNOWN:
// any action the client tried to take should be denied
return false;
// PICKUP_*
case PICKUP_ALL:
view.setItem(viewSlot, InventoryUtil.createEmptyStack());
int cursorAmount = InventoryUtil.itemOrEmpty(cursor).getAmount();
player.setItemOnCursor(amountOrEmpty(slotItem, cursorAmount + slotItem.getAmount()));
break;
case PICKUP_HALF:
// pick up half (favor picking up)
int keepAmount = slotItem.getAmount() / 2;
ItemStack newCursor = slotItem.clone();
newCursor.setAmount(slotItem.getAmount() - keepAmount);
inv.setItem(invSlot, amountOrEmpty(slotItem, keepAmount));
player.setItemOnCursor(newCursor);
break;
case PICKUP_SOME:
// pick up as many items as possible
int pickUp = Math.min(cursor.getMaxStackSize() - cursor.getAmount(), slotItem.getAmount());
view.setItem(viewSlot, amountOrEmpty(slotItem, slotItem.getAmount() - pickUp));
player.setItemOnCursor(amountOrEmpty(cursor, cursor.getAmount() + pickUp));
break;
case PICKUP_ONE:
view.setItem(invSlot, amountOrEmpty(slotItem, slotItem.getAmount() - 1));
player.setItemOnCursor(amountOrEmpty(cursor, cursor.getAmount() + 1));
break;
// PLACE_*
case PLACE_ALL:
view.setItem(viewSlot, combine(slotItem, cursor, cursor.getAmount()));
player.setItemOnCursor(InventoryUtil.createEmptyStack());
break;
case PLACE_SOME:
{
// slotItem *should* never be empty in this situation?
int transfer = Math.min(cursor.getAmount(), maxStack(inv, slotItem.getType()) - slotItem.getAmount());
view.setItem(viewSlot, combine(slotItem, cursor, transfer));
player.setItemOnCursor(amountOrEmpty(cursor, cursor.getAmount() - transfer));
break;
}
case PLACE_ONE:
view.setItem(viewSlot, combine(slotItem, cursor, 1));
player.setItemOnCursor(amountOrEmpty(cursor, cursor.getAmount() - 1));
break;
case SWAP_WITH_CURSOR:
view.setItem(viewSlot, cursor);
player.setItemOnCursor(slotItem);
break;
// DROP_*
case DROP_ALL_CURSOR:
if (!InventoryUtil.isEmpty(cursor)) {
drop(player, cursor);
player.setItemOnCursor(InventoryUtil.createEmptyStack());
}
break;
case DROP_ONE_CURSOR:
if (!InventoryUtil.isEmpty(cursor)) {
drop(player, amountOrEmpty(cursor.clone(), 1));
player.setItemOnCursor(amountOrEmpty(cursor, cursor.getAmount() - 1));
}
break;
case DROP_ALL_SLOT:
if (!InventoryUtil.isEmpty(slotItem)) {
drop(player, slotItem);
view.setItem(viewSlot, InventoryUtil.createEmptyStack());
}
break;
case DROP_ONE_SLOT:
if (InventoryUtil.isEmpty(slotItem)) {
drop(player, amountOrEmpty(slotItem.clone(), 1));
view.setItem(viewSlot, amountOrEmpty(slotItem, slotItem.getAmount() - 1));
}
break;
// shift-click
case MOVE_TO_OTHER_INVENTORY:
if (!InventoryUtil.isEmpty(slotItem)) {
inv.handleShiftClick(player, view, viewSlot, slotItem);
}
break;
case HOTBAR_MOVE_AND_READD:
case HOTBAR_SWAP:
GlowPlayerInventory playerInv = player.getInventory();
int hotbarSlot = message.getButton();
ItemStack destItem = playerInv.getItem(hotbarSlot);
if (InventoryUtil.isEmpty(slotItem)) {
// nothing in current slot
if (InventoryUtil.isEmpty(destItem)) {
// no action
return false;
} else {
// do nothing if current slots does not accept the item
if (action == InventoryAction.HOTBAR_SWAP) {
inv.setItem(invSlot, destItem);
playerInv.setItem(hotbarSlot, InventoryUtil.createEmptyStack());
}
return true;
}
} else {
if (InventoryUtil.isEmpty(destItem)) {
// move from current slot to hotbar
playerInv.setItem(hotbarSlot, slotItem);
inv.setItem(invSlot, InventoryUtil.createEmptyStack());
return true;
} else {
// both are non-empty, swap them
playerInv.setItem(hotbarSlot, slotItem);
if (action == InventoryAction.HOTBAR_SWAP) {
inv.setItem(invSlot, destItem);
} else {
inv.setItem(invSlot, InventoryUtil.createEmptyStack());
playerInv.addItem(destItem);
}
return true;
}
}
case CLONE_STACK:
// only in creative and with no item on cursor handled earlier
// copy and maximize item
ItemStack stack = slotItem.clone();
stack.setAmount(stack.getType().getMaxStackSize());
player.setItemOnCursor(stack);
break;
case COLLECT_TO_CURSOR:
if (InventoryUtil.isEmpty(cursor)) {
return false;
}
int slotCount = view.countSlots();
for (int i = 0; i < slotCount && cursor.getAmount() < maxStack(inv, cursor.getType()); ++i) {
ItemStack item = view.getItem(i);
SlotType type = (i < top.getSize() ? top : bottom).getSlotType(view.convertSlot(i));
if (InventoryUtil.isEmpty(item) || !cursor.isSimilar(item) || type == SlotType.RESULT) {
continue;
}
int transfer = Math.min(item.getAmount(), maxStack(inv, cursor.getType()) - cursor.getAmount());
cursor.setAmount(cursor.getAmount() + transfer);
view.setItem(i, amountOrEmpty(item, item.getAmount() - transfer));
}
break;
default:
handled = false;
}
if (handled && top == inv && top instanceof GlowCraftingInventory && top.getSlotType(invSlot) == SlotType.RESULT && action != MOVE_TO_OTHER_INVENTORY && action != NOTHING) {
// If we are crafting (but not using shift click because no more items can be crafted
// for the given pattern. If a new item can be crafted with another pattern, a new
// click is required).
final GlowCraftingInventory glowCraftingInventory = (GlowCraftingInventory) top;
glowCraftingInventory.craft();
// Notify the player the result slot changed
player.sendItemChange(viewSlot, glowCraftingInventory.getResult());
}
if (!handled) {
GlowServer.logger.warning(player.getName() + ": unhandled click action " + action + " for " + message);
}
return handled;
}
use of org.bukkit.event.inventory.InventoryType.SlotType in project Denizen-For-Bukkit by DenizenScript.
the class ItemScriptHelper method specialRecipeClick.
// When special Denizen recipes that have itemscripts as ingredients
// are being used, check crafting matrix for recipe matches whenever
// clicks are made in CRAFTING or RESULT slots
@EventHandler
public void specialRecipeClick(InventoryClickEvent event) {
// Proceed only if at least one special recipe has been stored
if (ItemScriptContainer.specialrecipesMap.isEmpty() && ItemScriptContainer.shapelessRecipesMap.isEmpty()) {
return;
}
// Proceed only if this is a CraftingInventory
if (!(event.getInventory() instanceof CraftingInventory)) {
return;
}
// Store the slot type that was clicked
SlotType slotType = event.getSlotType();
// Proceed only if a CRAFTING or RESULT slot was clicked
if (slotType.equals(InventoryType.SlotType.CRAFTING) || slotType.equals(InventoryType.SlotType.RESULT)) {
CraftingInventory inventory = (CraftingInventory) event.getInventory();
Player player = (Player) event.getWhoClicked();
if (slotType == SlotType.RESULT && inventory.getResult() != null && inventory.getResult().getData().getItemType() != Material.AIR) {
PlayerCraftsItemScriptEvent scriptEvent = PlayerCraftsItemScriptEvent.instance;
scriptEvent.inventory = inventory;
scriptEvent.result = new dItem(inventory.getResult());
dList recipeList = new dList();
for (ItemStack item : inventory.getMatrix()) {
if (item != null) {
recipeList.add(new dItem(item.clone()).identify());
} else {
recipeList.add(new dItem(Material.AIR).identify());
}
}
scriptEvent.recipe = recipeList;
scriptEvent.player = dPlayer.mirrorBukkitPlayer(player);
scriptEvent.resultChanged = false;
scriptEvent.fire();
if (scriptEvent.cancelled) {
event.setCancelled(true);
return;
} else if (scriptEvent.resultChanged) {
event.setCurrentItem(scriptEvent.result.getItemStack());
}
}
// If the RESULT slot was shift-clicked, emulate
// shift click behavior for it
boolean clicked;
if (slotType == SlotType.RESULT && event.isShiftClick()) {
clicked = emulateSpecialRecipeResultShiftClick(inventory, player);
} else // Otherwise check for special recipe matches
{
clicked = processSpecialRecipes(inventory, player);
}
if (clicked && slotType.equals(SlotType.RESULT)) {
removeOneFromEachSlot(inventory, player);
}
}
}
use of org.bukkit.event.inventory.InventoryType.SlotType in project MagicPlugin by elBukkit.
the class AnvilController method onInventoryClick.
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (event.isCancelled())
return;
if (!(event.getWhoClicked() instanceof Player))
return;
InventoryType inventoryType = event.getInventory().getType();
SlotType slotType = event.getSlotType();
Player player = (Player) event.getWhoClicked();
Mage mage = controller.getMage(player);
if (inventoryType == InventoryType.ANVIL) {
ItemStack cursor = event.getCursor();
ItemStack current = event.getCurrentItem();
Inventory anvilInventory = event.getInventory();
InventoryAction action = event.getAction();
ItemStack firstItem = anvilInventory.getItem(0);
ItemStack secondItem = anvilInventory.getItem(1);
// Handle direct movement
if (action == InventoryAction.MOVE_TO_OTHER_INVENTORY) {
if (!Wand.isWand(current))
return;
// Moving from anvil back to inventory
if (slotType == SlotType.CRAFTING) {
Wand wand = controller.getWand(current);
wand.updateName(true);
} else if (slotType == SlotType.RESULT) {
// Don't allow combining
if (!combiningEnabled) {
if (firstItem != null && secondItem != null) {
event.setCancelled(true);
return;
}
}
// Taking from result slot
ItemMeta meta = current.getItemMeta();
String newName = meta.getDisplayName();
Wand wand = controller.getWand(current);
if (!wand.canUse(player)) {
event.setCancelled(true);
mage.sendMessage(controller.getMessages().get("wand.bound").replace("$name", wand.getOwner()));
return;
}
wand.setName(newName);
if (organizingEnabled) {
wand.organizeInventory(controller.getMage(player));
}
wand.tryToOwn(player);
} else {
// Moving from inventory to anvil
Wand wand = controller.getWand(current);
wand.updateName(false);
}
return;
}
// Set/unset active names when starting to craft
if (slotType == SlotType.CRAFTING) {
// Putting a wand into the anvil's crafting slot
if (Wand.isWand(cursor)) {
Wand wand = controller.getWand(cursor);
wand.updateName(false);
}
// Taking a wand out of the anvil's crafting slot
if (Wand.isWand(current)) {
Wand wand = controller.getWand(current);
if (clearDescriptionOnRename) {
wand.setDescription("");
}
wand.updateName(true);
if (event.getWhoClicked() instanceof Player) {
wand.tryToOwn((Player) event.getWhoClicked());
}
}
return;
}
// Rename wand when taking from result slot
if (slotType == SlotType.RESULT && Wand.isWand(current)) {
if (!combiningEnabled) {
if (firstItem != null && secondItem != null) {
event.setCancelled(true);
return;
}
}
ItemMeta meta = current.getItemMeta();
String newName = meta.getDisplayName();
Wand wand = controller.getWand(current);
if (!wand.canUse(player)) {
event.setCancelled(true);
mage.sendMessage(controller.getMessages().get("wand.bound").replace("$name", wand.getOwner()));
return;
}
wand.setName(newName);
if (organizingEnabled) {
wand.organizeInventory(controller.getMage(player));
}
wand.tryToOwn(player);
return;
}
if (combiningEnabled && slotType == SlotType.RESULT) {
// I guess I need to wait for the long-awaited anvil API?
if (Wand.isWand(firstItem) && Wand.isWand(secondItem)) {
Wand firstWand = controller.getWand(firstItem);
Wand secondWand = controller.getWand(secondItem);
if (!firstWand.isModifiable() || !secondWand.isModifiable()) {
mage.sendMessage("One of your wands can not be combined");
return;
}
if (!firstWand.canUse(player) || !secondWand.canUse(player)) {
mage.sendMessage("One of those wands is not bound to you");
return;
}
if (!firstWand.add(secondWand)) {
mage.sendMessage("These wands can not be combined with each other");
return;
}
anvilInventory.setItem(0, null);
anvilInventory.setItem(1, null);
cursor.setType(Material.AIR);
if (organizingEnabled) {
firstWand.organizeInventory(mage);
}
firstWand.tryToOwn(player);
player.getInventory().addItem(firstWand.getItem());
mage.sendMessage("Your wands have been combined!");
// This seems to work in the debugger, but.. doesn't do anything.
// InventoryUtils.setInventoryResults(anvilInventory, newWand.getItem());
} else if (organizingEnabled && Wand.isWand(firstItem)) {
Wand firstWand = controller.getWand(firstItem);
// TODO: Can't get the anvil's text from here.
anvilInventory.setItem(0, null);
anvilInventory.setItem(1, null);
cursor.setType(Material.AIR);
firstWand.organizeInventory(mage);
firstWand.tryToOwn(player);
player.getInventory().addItem(firstWand.getItem());
mage.sendMessage("Your wand has been organized!");
}
return;
}
}
}
Aggregations