Karo birimler

Karo birimleri, otonom işçilik (fırınlar ve demleme tezgahları) gibi ilave işlemler yapabilen ya da efektler (bir işaret feneri veya not bloğu gibi) sağlayabilen bloklardır. Bunlar ayrıca envanter veya metin (göğüs işaretleri, işaretler veya komut blokları gibi) gibi ek veriler içerir.

Karo birimlerini ve Türlerini Belirleme

Yine, hepsi a :javadoc: Location ile başlar. : Javadoc: Location # getTileEntity () işlevi, bloğa karşılık gelen karo öğesini döndürür ya da blok, bir karo öğesi değilse “Optional.empty ()” `yi döndürür.

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

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

Bir karo türünün türü daha sonra :javadoc: TileEntityType i döndüren: javadoc:` TileEntity # getType () işlevi ile elde edilebilir. Bunlar daha sonra karşılaştırılabilir bir: javadoc: `BlockType dır. Bunu yaptıktan sonra: javadoc: TileEntity değişkeni güvenle alt kategorilere atanabilir.

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

Bu dökümü yaptıktan sonra, belirli arabirim tarafından sağlanan yöntemlere erişilebilir (bu örnekte :javadoc: Jukebox#ejectRecord () yöntemi). `` TileEntity`` alt türleri ve bunların ilgili yöntemleri hakkında ayrıntılı bilgi için: javadoc: org.spongepowered.api.block.tileentity paketi ve API’deki alt paketlerine bakın.

Karo birimlerinin Verilerine Erişme ve Değiştirme

Blok durumlarına benzer şekilde, bir karo nesnesinde saklanan verilere bir: javadoc: DataManipulator kullanılarak erişilir. Verilerin türü “DataManipulator” tarafından tam olarak tanımlandığından, tüm veri manipülasyonu kendiliğinden “TileEntity” arayüzü ile yapılabilir ve biçim gerektirmez.

Aşağıdaki örnek, bir işaretin verisini değiştirmek için iki yöntem içermektedir. İlk yöntem, mümkünse ilk satırı okur, ikincisi de onu ayarlamayı dener ve başarısını gösteren boolean değerini döndürür.

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

`` BlockState`` ile çalışmanın başlıca farkı, bir karo öğesinin değişmez: javadoc: DataHolder olması ve değişmez` `BlockState``in yerine olmasıdır.

Stoklara Erişme

Karo birimlerinin önemli bir kısmı kendi stoklarıyla, en önemlisi sandıkları ve fırınlarıyla gelir. Bu envantere doğrudan “Karo Entegrasyonu” arayüzünden erişilemez. Bu durumda bir oyuncu atışı gerekecektir. Bir envanter içeren tüm karo birimleri :javadoc: TileEntityCarrier arabirimini genişlettiğinden, aşağıda gösterildiği gibi bu arabirime aktarmaya yeter.

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

Envanterin manipülasyonu ile ilgili envanter dokümantasyonuna bakın.