Search in sources :

Example 21 with Slot

use of org.spongepowered.api.item.inventory.Slot in project LanternServer by LanternPowered.

the class ContainerTileEntityStore method serialize.

@Override
public void serialize(T object, DataView dataView) {
    super.serialize(object, dataView);
    final ObjectSerializer<LanternItemStack> itemStackSerializer = ObjectSerializerRegistry.get().get(LanternItemStack.class).get();
    final List<DataView> itemViews = new ArrayList<>();
    final Inventory inventory = object.getInventory();
    final Iterable<Slot> slots = inventory.slots();
    for (Slot slot : slots) {
        final Optional<ItemStack> optItemStack = slot.peek();
        if (!optItemStack.isPresent()) {
            continue;
        }
        final DataView itemView = itemStackSerializer.serialize((LanternItemStack) optItemStack.get());
        // noinspection ConstantConditions
        itemView.set(SLOT, (byte) inventory.getProperty(slot, SlotIndex.class, null).get().getValue().intValue());
        itemViews.add(itemView);
    }
    dataView.set(ITEMS, itemViews);
}
Also used : DataView(org.spongepowered.api.data.DataView) ArrayList(java.util.ArrayList) SlotIndex(org.spongepowered.api.item.inventory.property.SlotIndex) Slot(org.spongepowered.api.item.inventory.Slot) ItemStack(org.spongepowered.api.item.inventory.ItemStack) LanternItemStack(org.lanternpowered.server.inventory.LanternItemStack) LanternItemStack(org.lanternpowered.server.inventory.LanternItemStack) Inventory(org.spongepowered.api.item.inventory.Inventory) OrderedInventory(org.spongepowered.api.item.inventory.type.OrderedInventory)

Example 22 with Slot

use of org.spongepowered.api.item.inventory.Slot in project LanternServer by LanternPowered.

the class InventorySnapshot method ofInventory.

/**
 * Creates a {@link InventorySnapshot} for the specified {@link Inventory}.
 *
 * @param inventory The inventory
 * @return The snapshot
 */
public static InventorySnapshot ofInventory(Inventory inventory) {
    final Iterator<Slot> it = inventory.<Slot>slots().iterator();
    final Int2ObjectMap<ItemStackSnapshot> itemStackSnapshots = new Int2ObjectOpenHashMap<>();
    while (it.hasNext()) {
        final Slot slot = it.next();
        slot.peek().map(ItemStack::createSnapshot).ifPresent(itemStackSnapshot -> {
            // noinspection ConstantConditions
            final SlotIndex index = inventory.getProperty(slot, SlotIndex.class, null).get();
            itemStackSnapshots.put(index.getValue(), itemStackSnapshot);
        });
    }
    return new InventorySnapshot(itemStackSnapshots);
}
Also used : Int2ObjectOpenHashMap(it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap) SlotIndex(org.spongepowered.api.item.inventory.property.SlotIndex) Slot(org.spongepowered.api.item.inventory.Slot) ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot)

Example 23 with Slot

use of org.spongepowered.api.item.inventory.Slot in project LanternServer by LanternPowered.

the class AbstractChildrenInventory method peek.

@Override
public Optional<ItemStack> peek(int limit, Predicate<ItemStack> matcher) {
    checkNotNull(matcher, "matcher");
    checkArgument(limit >= 0, "Limit may not be negative");
    if (limit == 0) {
        return Optional.empty();
    }
    ItemStack stack = null;
    for (AbstractMutableInventory inventory : getChildren()) {
        // Check whether the slot a item contains
        if (stack == null) {
            stack = inventory.peek(limit, matcher).orElse(null);
            if (stack != null) {
                if (stack.getQuantity() >= limit) {
                    return Optional.of(stack);
                } else {
                    limit -= stack.getQuantity();
                    if (!(matcher instanceof SimilarItemMatcher)) {
                        matcher = new SimilarItemMatcher(stack);
                    }
                }
            }
        } else {
            int peekedStackSize = 0;
            // boxing/unboxing and cloning the item stack
            if (inventory instanceof Slot) {
                final ItemStack stack1 = ((AbstractSlot) inventory).getRawItemStack();
                if (stack1 != null && matcher.test(stack1)) {
                    peekedStackSize = Math.min(((Slot) inventory).getStackSize(), limit);
                }
            } else {
                final Optional<ItemStack> optItemStack = inventory.peek(limit, matcher);
                if (optItemStack.isPresent()) {
                    peekedStackSize = optItemStack.get().getQuantity();
                }
            }
            if (peekedStackSize > 0) {
                limit -= peekedStackSize;
                stack.setQuantity(stack.getQuantity() + peekedStackSize);
                if (limit <= 0) {
                    return Optional.of(stack);
                }
            }
        }
    }
    return Optional.ofNullable(stack);
}
Also used : Slot(org.spongepowered.api.item.inventory.Slot) ItemStack(org.spongepowered.api.item.inventory.ItemStack)

Example 24 with Slot

use of org.spongepowered.api.item.inventory.Slot in project Nucleus by NucleusPowered.

the class SellAllCommand method executeCommand.

@Override
public CommandResult executeCommand(final Player src, CommandContext args) throws Exception {
    boolean accepted = args.hasAny("a");
    CatalogType ct = getCatalogTypeFromHandOrArgs(src, itemKey, args);
    String id = ct.getId();
    ItemStack query;
    if (ct instanceof BlockState) {
        query = ItemStack.builder().fromBlockState((BlockState) ct).quantity(1).build();
        // Yeah...
        query.setQuantity(-1);
    } else {
        // Having a quantity of -1 causes an IllegalArgumentException here...
        query = ItemStack.of((ItemType) ct, 1);
        // and doesn't care here...
        query.setQuantity(-1);
    }
    ItemDataNode node = itemDataService.getDataForItem(id);
    final double sellPrice = node.getServerSellPrice();
    if (sellPrice < 0) {
        throw new ReturnMessageException(plugin.getMessageProvider().getTextMessageWithFormat("command.itemsell.notforselling"));
    }
    Iterable<Slot> slots = Util.getStandardInventory(src).query(query).slots();
    List<ItemStack> itemsToSell = StreamSupport.stream(Util.getStandardInventory(src).query(query).slots().spliterator(), false).map(Inventory::peek).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toList());
    // Get the cost.
    final int amt = itemsToSell.stream().mapToInt(ItemStack::getQuantity).sum();
    if (amt <= 0) {
        throw new ReturnMessageException(plugin.getMessageProvider().getTextMessageWithTextFormat("command.itemsellall.none", Text.of(query)));
    }
    final double overallCost = sellPrice * amt;
    if (accepted) {
        if (econHelper.depositInPlayer(src, overallCost, false)) {
            slots.forEach(Inventory::clear);
            src.sendMessage(plugin.getMessageProvider().getTextMessageWithTextFormat("command.itemsell.summary", Text.of(amt), Text.of(query), Text.of(econHelper.getCurrencySymbol(overallCost))));
            return CommandResult.success();
        }
        throw new ReturnMessageException(plugin.getMessageProvider().getTextMessageWithTextFormat("command.itemsell.error", Text.of(query)));
    }
    src.sendMessage(plugin.getMessageProvider().getTextMessageWithTextFormat("command.itemsellall.summary", Text.of(amt), Text.of(query), Text.of(econHelper.getCurrencySymbol(overallCost)), Text.of(id)).toBuilder().onClick(TextActions.runCommand("/nucleus:itemsellall -a " + id)).build());
    return CommandResult.success();
}
Also used : Optional(java.util.Optional) ItemType(org.spongepowered.api.item.ItemType) ReturnMessageException(io.github.nucleuspowered.nucleus.internal.command.ReturnMessageException) CatalogType(org.spongepowered.api.CatalogType) BlockState(org.spongepowered.api.block.BlockState) Slot(org.spongepowered.api.item.inventory.Slot) ItemStack(org.spongepowered.api.item.inventory.ItemStack) Inventory(org.spongepowered.api.item.inventory.Inventory) ItemDataNode(io.github.nucleuspowered.nucleus.configurate.datatypes.ItemDataNode)

Aggregations

Slot (org.spongepowered.api.item.inventory.Slot)24 ItemStack (org.spongepowered.api.item.inventory.ItemStack)15 SlotTransaction (org.spongepowered.api.item.inventory.transaction.SlotTransaction)13 ArrayList (java.util.ArrayList)12 ItemStackSnapshot (org.spongepowered.api.item.inventory.ItemStackSnapshot)12 AbstractSlot (org.lanternpowered.server.inventory.AbstractSlot)10 LanternItemStack (org.lanternpowered.server.inventory.LanternItemStack)10 Player (org.spongepowered.api.entity.living.player.Player)9 Optional (java.util.Optional)8 CauseStack (org.lanternpowered.server.event.CauseStack)8 AbstractInventorySlot (org.lanternpowered.server.inventory.AbstractInventorySlot)8 LanternItemStackSnapshot (org.lanternpowered.server.inventory.LanternItemStackSnapshot)8 ClientSlot (org.lanternpowered.server.inventory.client.ClientSlot)8 List (java.util.List)7 LanternPlayer (org.lanternpowered.server.entity.living.player.LanternPlayer)7 CraftingMatrix (org.lanternpowered.server.item.recipe.crafting.CraftingMatrix)7 LanternWorld (org.lanternpowered.server.world.LanternWorld)7 Preconditions.checkState (com.google.common.base.Preconditions.checkState)6 Streams (com.google.common.collect.Streams)6 Collectors (java.util.stream.Collectors)6