Genteng Badan
Genteng entitas blok yang mampu operasi tambahan seperti autonomically kerajinan (tungku dan brewing stand) atau memberikan efek (seperti mercusuar atau block note). Mereka juga berisi data tambahan seperti persediaan atau teks (seperti dada, tanda-tanda atau perintah blok).
Mengidentifikasi Genteng Badan dan Jenis mereka
Lagi, itu semua dimulai dengan sebuah :javadoc: 'Location'. Fungsi :javadoc: 'Location#getTileEntity()' akan kembali ke kesatuan ubin yang sesuai dengan blok atau ' 'Optional.empty()' 'jika blok bukanlah sebuah kesatuan ubin.
import org.spongepowered.api.world.Location; import org.spongepowered.api.world.World; public boolean isTileEntity(Location<World> blockLoc) { return blockLoc.getTileEntity().isPresent(); }
Jenis dari kesatuan ubin kemudian bisa diperoleh dari fungsi :javadoc: 'TileEntity#getType()' yang mengembalikan sebuah :javadoc: 'TileEntityType'. Yang bisa dibandingkan ke sebuah persamaan :javadoc: 'BlockType'. Setelah menampilkan pemeriksaan variabel :javadoc: 'TileEntity' ini bisa dengan aman bisa dilemparkan sesuai subtype.
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(); } }
Setelah menampilkan lemparan, metode-metode disediakan oleh antarmuka tertentu bisa diakseskan (dalam contoh metode :javadoc: 'Jukebox#ejectRecord()' ini). Untuk merincikan informasi tentang subtype-subtype ' 'TileEntity' ' dan masing-masing metode mereka mengacu pada paket :javadoc: 'org.spongepowered.api.block.tileentity' dan subpaket itu sendiri dalam API.
Mengakses dan Memodifikasi Genteng Entitas Data
Persamaan untuk keadaan blok, menyimpan data dalam kesatuan ubin yang diakseskan menggunakan sebuah :javadoc: 'DataManipulator'. Karena jenis dari data yang sepenuhnya dijelaskan oleh penggunaan ' 'DataManipulator' '. semua data manipulasi bisa dilakukan dengan antarmuka ' 'TileEntity' ' itu sendiri dan tidak mengharuskan sebuah hitungan.
Contoh berikut ini mengandung dua metode untuk mengubah data dari suatu tanda. Metode pertama membaca (jika mungkin) baris pertama, kedua, upaya untuk mengatur hal itu dan mengembalikan nilai boolean yang menunjukkan keberhasilannya.
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; }
Perbedaan utama untuk bekerja dengan suatu BlockState
adalah sebuah susunan entitas yang bisa berubah DataHolder sebagai lawan dari hal yang tidak dapat diubah BlockState
.
Mengakses Persediaan
Cukup banyak suatu pembagian susunan entitas datang dengan inventaris mereka sendiri, terutama peti dan tungku, yang mana inventaris itu tidak dapat di akses secara langsung dari TileEntity
antarmuka, jadi pemeran akan dibutuhkan. karena semua susunan entitas mengandung suatu inventaris yang luas TileEntityCarrier antar muka cukup untuk diperankan pada antar muka seperti yang ditunjukan dibawah.
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(); ... } }
Lihat persediaan dokumentasi mengenai manipulasi persediaan.