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
Quite a share of tile entities come with their own inventory, most notably chests and furnaces. That inventory cannot
be accessed directly from the TileEntity
interface. So a cast will be necessary. Since all tile entities containing
an inventory extend the TileEntityCarrier interface it suffices to cast to that interface as shown below.
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.