Entidades de Baldosa

Las entidades de baldosas son bloques capaces de operaciones adicionales como construcción automática(hornos y estaciones de alquimia) o aplicar efectos (como un faro o un block de notas). Tambien contienen datos adicionales como un inventario o texto (como cofres, señales o bloques de comando).

Identificando Entidades de Baldosa y sus Tipos

De nuevo, todo comienza con un Location. La función Location#getTileEntity() retornará la entidad de baldosa correspondiente a el bloque o ``Optional.empty()``si el bloque no es una entidad de baldosa.

import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;

public boolean isTileEntity(Location<World> blockLoc) {
    return blockLoc.getTileEntity().isPresent();
}

El tipo de una entidad de baldosa puede, luego, conseguirse con la función TileEntity#getType() la cual retorna un TileEntityType. El cual puede ser comparado similarmente con un BlockType. Luego de realizar esta comprobación, la variable TileEntity puede ser llamada con seguridad al subtipo acorde.

import org.spongepowered.api.block.tileentity.Jukebox;
import org.spongepowered.api.block.tileentity.TileEntity;
import org.spongepowered.api.block.tileentity.TileEntityTypes;

public boolean isJukebox(TileEntity entity) {
    return entity.getType().equals(TileEntityTypes.JUKEBOX);
}

public void ejectDiscFromJukebox(TileEntity entity) {
    if (isJukebox(entity)) {
        Jukebox jukebox = (Jukebox) entity;
        jukebox.ejectRecord();
    }
}

Después de realizar este lanzamiento, se puede acceder a los métodos proporcionados por la interfaz particular (en este ejemplo, el método Jukebox#ejectRecord()). Para obtener información detallada sobre los subtipos TileEntity y sus respectivos métodos, consulte el paquete org.spongepowered.api.block.tileentity y sus subpaquetes en la API.

Accediendo y Modificando Datos de la Entidad Mosaico

Similar a los estados de bloque,puede accederse a la información guardada en un bloque accesorio usando un DataManipulator. Ya que el tipo de información es descripta completamente por el “Manipulador de Información” usado, todo el manejo de la información puede hacerse con la interfaz “TileEntity” y no requiere otro desvío.

El siguiente ejemplo contiene dos métodos para alterar los datos de un signo. El primer método Lee (de ser posible) la primera línea; el segundo intenta configurarlo y regresa al valor boolean indicando su éxito.

import org.spongepowered.api.data.manipulator.mutable.tileentity.SignData;
import org.spongepowered.api.text.Text;

import java.util.Optional;

public Optional<Text> getFirstLine(TileEntity entity) {
    Optional<SignData> data = entity.getOrCreate(SignData.class);
    if (data.isPresent()) {
        return Optional.of(data.get().lines().get(0));
    }
    return Optional.empty();
}

public boolean setFirstLine(TileEntity entity, Text line) {
    if (entity.supports(SignData.class)) {
        SignData sign = entity.getOrCreate(SignData.class).get();
        sign.set(sign.lines().set(0, line));
        entity.offer(sign);
        return true;
    }
    return false;
}

La diferencia principal a trabajar con un BlockState es que una entidad mosaico es un :javadoc:`DataHolder`mutable al contrario del ``BlockState`` inmutable.

Accediendo a inventarios

Una gran cantidad de los bloques accesorios o “tile entities” vienen con su propio inventario, sobre todo cofres y calderas. A ese inventario no puede accederse directamente desde la interfaz “TileEntity”. Se deberá usar otro atajo. Ya que todos los bloques accesorios contienen una extensión de inventario, la interfaz TileEntityCarrier permite acceder a esa interface como se muestra más abajo.

import org.spongepowered.api.block.tileentity.carrier.TileEntityCarrier;
import org.spongepowered.api.item.inventory.Inventory;

public void useInventory(TileEntity entity) {
    if (entity instanceof TileEntityCarrier) {
        TileEntityCarrier carrier = (TileEntityCarrier) entity;
        Inventory inventory = carrier.getInventory();
        ...
    }
}

Consulta la documentación del inventario con respecto a la manipulación del inventario.