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
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(); [...] } }
Envanterin manipülasyonu ile ilgili envanter dokümantasyonuna bakın.