use of org.bukkit.inventory.InventoryHolder in project HawkEye by oliverwoodings.
the class ContainerAccessManager method checkInventoryOpen.
/**
* 'Sets' the player inventory to be open and stores the current contents of the container
* @param player player to check
* @param block container to store
*/
public void checkInventoryOpen(Player player, Block block) {
if (!(block.getState() instanceof InventoryHolder))
return;
InventoryHolder container = (InventoryHolder) block.getState();
accessList.add(new ContainerAccess(container, player, InventoryUtil.compressInventory(InventoryUtil.getContainerContents(container)), block.getLocation()));
}
use of org.bukkit.inventory.InventoryHolder in project HawkEye by oliverwoodings.
the class ContainerEntry method rollback.
@Override
public boolean rollback(Block block) {
if (!(block instanceof InventoryHolder))
return false;
Inventory inv = ((InventoryHolder) block.getState()).getInventory();
List<HashMap<String, Integer>> ops = InventoryUtil.interpretDifferenceString(data);
//Handle the additions
if (ops.size() > 0) {
for (ItemStack stack : InventoryUtil.uncompressInventory(ops.get(0))) inv.removeItem(stack);
}
//Handle subtractions
if (ops.size() > 1) {
for (ItemStack stack : InventoryUtil.uncompressInventory(ops.get(1))) inv.addItem(stack);
}
return true;
}
use of org.bukkit.inventory.InventoryHolder in project Prism-Bukkit by prism.
the class ItemStackAction method placeItems.
/**
*
* @return
*/
protected ChangeResult placeItems(Player player, QueryParameters parameters, boolean is_preview) {
ChangeResultType result = null;
if (is_preview) {
return new ChangeResult(ChangeResultType.PLANNED, null);
}
if (plugin.getConfig().getBoolean("prism.appliers.allow-rollback-items-removed-from-container")) {
final Block block = getWorld().getBlockAt(getLoc());
Inventory inventory = null;
// Item drop/pickup from player inventories
if (getType().getName().equals("item-drop") || getType().getName().equals("item-pickup")) {
// Is player online?
final String playerName = getPlayerName();
final Player onlinePlayer = Bukkit.getServer().getPlayer(playerName);
if (onlinePlayer != null) {
inventory = onlinePlayer.getInventory();
} else {
// Skip if the player isn't online
Prism.debug("Skipping inventory process because player is offline");
return new ChangeResult(ChangeResultType.SKIPPED, null);
}
} else {
if (block.getType().equals(Material.JUKEBOX)) {
final Jukebox jukebox = (Jukebox) block.getState();
jukebox.setPlaying(item.getType());
jukebox.update();
} else if (block.getState() instanceof InventoryHolder) {
final InventoryHolder ih = (InventoryHolder) block.getState();
inventory = ih.getInventory();
} else {
Entity[] foundEntities = block.getChunk().getEntities();
if (foundEntities.length > 0) {
for (Entity e : foundEntities) {
if (!e.getType().equals(EntityType.ITEM_FRAME))
continue;
// https://snowy-evening.com/botsko/prism/318/
if (!block.getWorld().equals(e.getWorld()))
continue;
// Let's limit this to only entities within 1 block of the current.
Prism.debug(block.getLocation());
Prism.debug(e.getLocation());
if (block.getLocation().distance(e.getLocation()) < 2) {
final ItemFrame frame = (ItemFrame) e;
if ((getType().getName().equals("item-remove") && parameters.getProcessType().equals(PrismProcessType.ROLLBACK)) || (getType().getName().equals("item-insert") && parameters.getProcessType().equals(PrismProcessType.RESTORE))) {
frame.setItem(item);
} else {
frame.setItem(null);
}
result = ChangeResultType.APPLIED;
}
}
}
}
}
if (inventory != null) {
final PrismProcessType pt = parameters.getProcessType();
final String n = getType().getName();
// inventory
if ((pt.equals(PrismProcessType.ROLLBACK) && (n.equals("item-remove") || n.equals("item-drop"))) || (pt.equals(PrismProcessType.RESTORE) && (n.equals("item-insert") || n.equals("item-pickup")))) {
boolean added = false;
// We'll attempt to put it back in the same slot
if (getActionData().slot >= 0) {
// https://snowy-evening.com/botsko/prism/450/
if (getActionData().slot < inventory.getSize()) {
final ItemStack currentSlotItem = inventory.getItem(getActionData().slot);
// Make sure nothing's there.
if (currentSlotItem == null) {
result = ChangeResultType.APPLIED;
added = true;
inventory.setItem(getActionData().slot, getItem());
}
}
}
// If that failed we'll attempt to put it anywhere
if (!added) {
final HashMap<Integer, ItemStack> leftovers = InventoryUtils.addItemToInventory(inventory, getItem());
if (leftovers.size() > 0) {
Prism.debug("Skipping adding items because there are leftovers");
result = ChangeResultType.SKIPPED;
} else {
result = ChangeResultType.APPLIED;
added = true;
}
}
// Item was added to the inv, we need to remove the entity
if (added && (n.equals("item-drop") || n.equals("item-pickup"))) {
final Entity[] entities = getLoc().getChunk().getEntities();
for (final Entity entity : entities) {
if (entity instanceof Item) {
final ItemStack stack = ((Item) entity).getItemStack();
if (stack.isSimilar(getItem())) {
// Remove the event's number of items from
// the stack
stack.setAmount(stack.getAmount() - getItem().getAmount());
if (stack.getAmount() == 0) {
entity.remove();
}
break;
}
}
}
}
}
// inventory
if ((pt.equals(PrismProcessType.ROLLBACK) && (n.equals("item-insert") || n.equals("item-pickup"))) || (pt.equals(PrismProcessType.RESTORE) && (n.equals("item-remove") || n.equals("item-drop")))) {
// does inventory have item?
boolean removed = false;
// We'll attempt to take it from the same slot
if (getActionData().slot >= 0) {
if (getActionData().slot > inventory.getContents().length) {
inventory.addItem(getItem());
} else {
final ItemStack currentSlotItem = inventory.getItem(getActionData().slot);
// Make sure something's there.
if (currentSlotItem != null) {
currentSlotItem.setAmount(currentSlotItem.getAmount() - getItem().getAmount());
result = ChangeResultType.APPLIED;
removed = true;
inventory.setItem(getActionData().slot, currentSlotItem);
}
}
}
// If that failed we'll attempt to take it from anywhere
if (!removed) {
final int slot = InventoryUtils.inventoryHasItem(inventory, getItem().getTypeId(), getItem().getDurability());
if (slot > -1) {
inventory.removeItem(getItem());
result = ChangeResultType.APPLIED;
removed = true;
} else {
Prism.debug("Item removal from container skipped because it's not currently inside.");
result = ChangeResultType.SKIPPED;
}
}
// If the item was removed and it's a drop type, re-drop it
if (removed && (n.equals("item-drop") || n.equals("item-pickup"))) {
me.botsko.elixr.ItemUtils.dropItem(getLoc(), getItem());
}
}
}
}
return new ChangeResult(result, null);
}
use of org.bukkit.inventory.InventoryHolder in project Prism-Bukkit by prism.
the class PrismBlockEvents method logItemRemoveFromDestroyedContainer.
/**
* If this is a container we need to trigger item removal for everything in
* it. It's important we record this *after* the block break so the log
* shows what really happened.
*
* @param player_name
* @param block
*/
public void logItemRemoveFromDestroyedContainer(String player_name, Block block) {
if (block.getType().equals(Material.JUKEBOX)) {
final Jukebox jukebox = (Jukebox) block.getState();
final Material playing = jukebox.getPlaying();
if (playing == null || playing.equals(Material.AIR))
return;
final ItemStack i = new ItemStack(jukebox.getPlaying(), 1);
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-remove", i, i.getAmount(), 0, null, block.getLocation(), player_name));
return;
}
if (block.getState() instanceof InventoryHolder) {
final InventoryHolder container = (InventoryHolder) block.getState();
int slot = 0;
for (final ItemStack i : container.getInventory().getContents()) {
// even though only half of the chest breaks.
if ((block.getType().equals(Material.CHEST) || block.getType().equals(Material.TRAPPED_CHEST)) && slot > 26)
break;
// record item
if (i != null) {
RecordingQueue.addToQueue(ActionFactory.createItemStack("item-remove", i, i.getAmount(), slot, null, block.getLocation(), player_name));
}
slot++;
}
}
}
use of org.bukkit.inventory.InventoryHolder in project Prism-Bukkit by prism.
the class PrismInventoryEvents method onInventoryDrag.
/**
* Handle inventory transfers
*
* @param event
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onInventoryDrag(final InventoryDragEvent event) {
if (!plugin.getConfig().getBoolean("prism.tracking.item-insert") && !plugin.getConfig().getBoolean("prism.tracking.item-remove"))
return;
// Get container
final InventoryHolder ih = event.getInventory().getHolder();
Location containerLoc = null;
if (ih instanceof BlockState) {
final BlockState eventChest = (BlockState) ih;
containerLoc = eventChest.getLocation();
}
// Store some info
final Player player = (Player) event.getWhoClicked();
final Map<Integer, ItemStack> newItems = event.getNewItems();
for (final Entry<Integer, ItemStack> entry : newItems.entrySet()) {
recordInvAction(player, containerLoc, entry.getValue(), entry.getKey(), "item-insert");
}
}
Aggregations