Tile Entities

Les Tile Entities sont des blocs qui peuvent effectuer des opérations supplémentaires comme le craft autonome (fours et alambics) ou fournir des effets (comme une balise ou un bloc musical). Ils contiennent également des données supplémentaires comme un inventaire ou du texte (comme les coffres, les panneaux ou les blocs de commande).

Identifier les Tile Entities et leur Type

Encore une fois, tout commence avec une Location. La fonction Location#getTileEntity() va retourner la Tile Entity correspondant au bloc ou Optional.empty() si le bloc n’est pas une Tile Entity.

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

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

Le type d’une Tile Entity peut ensuite être obtenu avec la fonction TileEntity#getType() qui retourne un TileEntityType. Qui peut ensuite être comparé de la même façon qu’un BlockType. Après avoir effectué cette vérification, la variable TileEntity peut être cast selon le sous-type sans risque.

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();
    }
}

Après avoir effectué ce cast, les méthodes fournies par l’interface particulière peuvent être accédées (Dans cet exemple la méthode Jukebox#ejectRecord()). Pour des informations détaillées à propos des sous-types de TileEntity et leurs méthodes respectives, référez-vous au package org.spongepowered.api.block.tileentity et ses sous-packages dans l’API.

Accès et Modification des données d’une Tile Entity

Similairement aux états de blocs, les données stockées dans une Tile Entity sont accessibles en utilisant un DataManipulator. Puisque le type de données est décrit par le DataManipulator utilisé, toutes les manipulations de données peuvent être faites avec l’interface TileEntity elle-même et ne requiert aucun cast.

L’exemple suivant contient deux méthodes pour modifier les données d’un panneau. La première méthode lit (si possible) la première ligne, le second tente de la définir et retourne la valeur booléenne indiquant son succès.

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 principale différence de travailler avec un BlockState est qu’une Tile Entity est un DataHolder mutable contrairement à l’immuable BlockState.

Accéder aux Inventaires

Une grand parties des Tile Entities viennent avec leur propre inventaire, plus particulièrement les coffres et les fours. Cet inventaire ne peut pas être accédé directement depuis l’interface TileEntity. Donc un cast sera nécessaire. Puisque toutes les Tile Entities qui ont un inventaire héritent l’interface TileEntityCarrier, il suffit de faire un cast vers cette interface comme montré ci-dessous.

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();
        [...]
    }
}

Reportez-vous à la documentation de l’inventaire au sujet de la manipulation de l’inventaire.