Uso Básico de Ítems

Los ítems son representados mediante un ItemStack. Un ItemStack es un ítem de inventario con información como la cantidad del ítem en pilas, el tipo de ítem y datos extra como la durabilidad. Un :javadoc:`Ítem` en sí mismo es la representación gráfica de un ItemStack como una entidad. Tenga en cuenta que siempre obtendrá una copia y no el ItemStack real y en consecuencia, necesitará establecerlo de nuevo en un inventario si lo desea.

Verificación del Tipo de un Ítem

La verificación del tipo del ítem es muy simple. Solo necesita llamar al método ItemStack#getItem().

import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;

public boolean isStick(ItemStack stack) {
    ItemType type = stack.getItem();
    return type.equals(ItemTypes.STICK);
}

¿Ve qué simple es eso? Porque los palos se pueden apilar, podemos también averiguar cuántos están presentes.

Obtener la cantidad de ítems en una ItemStack es relativamente fácil. El método ItemStack#getQuantity() se encargará de esto por nosotros.

Modificación de Datos de ItemStack

La manipulación de datos como la durabilidad o la historia de un ítem se realiza simplemente utilizando claves. Solo necesita especificar la clave que necesita ser cambiada:

import org.spongepowered.api.data.key.Keys;

public void setUnbreakable(ItemStack stack) {
    stack.offer(Keys.UNBREAKABLE, true);
}

En esto, especificaremos que la clave Keys#UNBREAKABLE es la clave que quisiéramos cambiar. Entonces estableceremos su valor en verdad para implicar que el ítem nunca se romperá. Todo esto está incluido en el método offer() del ItemStack para regresar nuestros cambios a la ItemStack.

Las diferentes claves requerirán diferentes valores basados en su trabajo. Por ejemplo, cambiar la historia de un ítem, uno necesitaría especificar una Lista del :javadoc:`Texto` en lugar de un boolean u otro valor. Es también importante realizar verificaciones para ver si la clave actualmente puede aplicar al ítem. Por ejemplo, algunos ítems podrían no tener durabilidad o puede que ya tengan historia aplicada al ítem.

import org.spongepowered.api.text.Text;

import java.util.List;

public void setLore(ItemStack stack, List<Text> itemLore) {
    if (stack.get(Keys.ITEM_LORE).isPresent()) {
        stack.offer(Keys.ITEM_LORE, itemLore);
    }
}

Propiedades del Ítem

Ciertos ítems pueden tener propiedades específicas. Por ejemplo, ciertos ítems pueden minar bloques específicos, como un pico de diamante para obsidiana. La propiedades son utilizadas para determinar si un ítem puede causar una acción sin realmente verificar el tipo del ítem. Podemos verificar si un ítem puede minar obsidiana utilizando al HarvestingProperty de ese ítem.

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.data.property.item.HarvestingProperty;

import java.util.Optional;

public boolean canMineObsidian(ItemStack stack) {
    Optional<HarvestingProperty> optional =
        stack.getProperty(HarvestingProperty.class);

    if (optional.isPresent()) {
        HarvestingProperty property = optional.get();
        return property.getValue().contains(BlockTypes.OBSIDIAN);
    }
    return false;
}

Este código verificará si el ítem tiene una HarvestingProperty, como un pico. Si está presente, entonces devuelve si este ítem puede recoger obsidiana sin la necesidad de verificar el tipo del ítem. Es muy útil en caso de que un mod o una actualización de Minecraft agregue una nueva herramienta con la capacidad de minar obsidiana.

Comparación de ItemStacks

La clase ItemStack contiene un método ordenado para comparar dos ItemStacks. Utilizando el método ItemStack#equalTo(ItemStack) de una ya existente ItemStack, podemos ver si las dos ItemStacks son “iguales”. En decir, comparten el mismo tamaño de pila, ItemType y datos. Un ejemplo es mostrado a continuación:

public boolean isEqual(ItemStack stack1, ItemStack stack2) {
    return stack1.equalTo(stack2);
}