use of me.botsko.prism.appliers.ChangeResultType 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);
}
Aggregations