Mengakses Blokir
Informasi dasar
Blok paling sering diidentifikasi dan diakses oleh mereka :javadoc: Location. Lokasi ini menunjuk ke koordinat tertentu dalam sebuah :javadoc: Extent. Dalam kebanyakan kasus a :javadoc: World akan digunakan sebagai` Extent`.
import org.spongepowered.api.Sponge;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
public Location<World> getBlockAt(String worldName, int posX, int posY, int posZ) {
World world = Sponge.getServer().getWorld(worldName).get();
Location<World> blockLoc = new Location<World>(world, posX, posY, posZ);
return blockLoc;
}
Peringatan
Perhatikan bahwa contoh di atas tidak memeriksa apakah dunia ada. ``getWorld (worldName).get ()``akan gagal jika tidak ada dunia dengan nama itu yang dimuat.
Dengan objek `` Lokasi` ini Anda kemudian dapat memperoleh informasi lebih lanjut tentang blok tersebut. Kode berikut memeriksa apakah blok yang direferensikan adalah jenis spanduk dengan memeriksa jenis blok.
import org.spongepowered.api.block.BlockType;
import org.spongepowered.api.block.BlockTypes;
public boolean isBanner(Location<World> blockLoc) {
BlockType type = blockLoc.getBlock().getType();
return type.equals(BlockTypes.STANDING_BANNER)
|| type.equals(BlockTypes.WALL_BANNER);
}
Tip
Fungsi `` == `` dapat digunakan di tempat `` sama dengan () `` karena hanya ada satu :javadoc: instance BlockType untuk setiap blok, namun umumnya disarankan untuk menggunakan` sama dengan () `.
Blokir Manipulator Data
Data dari sebuah blok dipegang sebagai DataManipulator, mirip dengan bagian API lainnya. Ini adalah wadah yang menyimpan informasi tentang komponen blok kita seperti orientasi blok, tipe tertentu (batu vs. granit), dan sebagainya. Memeriksa nilai manipulator ini mudah dilakukan, Anda hanya perlu memeriksa arah blok DirectionalData.
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.data.manipulator.mutable.block.DirectionalData;
public boolean isFacingNorth(Location<World> blockLoc) {
Optional<DirectionalData> optionalData = blockLoc.get(DirectionalData.class);
if (!optionalData.isPresent()) {
return false;
}
DirectionalData data = optionalData.get();
if (data.get(Keys.DIRECTION).get().equals(Direction.NORTH)) {
return true;
}
return false;
}
Pertama, kita perlu tahu mana sub-interface DataManipulator yang kita butuhkan. Mereka yang berlaku untuk blok ditemukan di :javadoc: org.spongepowered.api.data.manipulator.mutable dan :javadoc:` org.spongepowered.api.data.manipulator.mutable.block` packages. Kemudian, kita bisa melewati kelas itu ke metode `` get (DataManipulator) `` `` Location`` yang akan mengembalikan `` Opsional``. Kita kemudian harus memeriksa apakah 'DataManipulator` kita benar-benar ada untuk blok kita dengan memeriksa `` ifPresent () ``. Jika ada, maka kita bisa menggunakannya.
Lebih lanjut tentang DataManipulator` s dapat ditemukan di :doc:` dokumentasi data <../ data / datamanipulators> `.
Tip
Jika blok tidak akan pernah berhenti mendukung DataManipulator tertentu, seperti` DirectionalData` dengan tangga, maka tidak perlu memeriksa` isPresent () . Hapus saja pilihan di sekitar `DataManipulator dan ambil data non-opsional dengan menambahkan` .get () ke akhir pernyataan. Perhatikan, bahwa ini akan menyebabkan ` NullPointerException`` jika satu blok berhenti mendukung DataManipulator tertentu.
Blok negara
A :javadoc: BlockState berisi :javadoc:` BlockType`, DataManipulator` dan properti yang diaplikasikan pada blok, dan ada pula :javadoc:` BlockTrait` s untuk satu blok. Ini menyimpan semua nilai abadi untuk blok tertentu. Salah satu penggunaan ini adalah mendapatkan :javadoc: ImmutableDataManipulator, seperti yang ditunjukkan di bawah ini:
import org.spongepowered.api.block.BlockState;
import org.spongepowered.api.data.manipulator.immutable.ImmutableWetData;
public void isWet(Location blockLoc) {
BlockState sponge = blockLoc.getBlock();
if (!sponge.getType().equals(BlockTypes.SPONGE)) {
return false;
}
Optional<ImmutableWetData> wetness = sponge.get(ImmutableWetData.class);
return wetness.isPresent();
}
Informasi lebih lanjut tentang DataManipulator yang bisa berubah dan tidak berubah dapat ditemukan di :doc: dokumentasi data <../ data / datamanipulators>.
Blok properti
Blok bisa berisi properti tertentu. Properti adalah nilai yang telah ditetapkan yang mendefinisikan logika permainan dari blok tersebut. Misalnya, blok dapat berisi nilai tahan-ledakan yang telah ditentukan sebelumnya yang dapat digunakan untuk menentukan apa yang Anda kerjakan, tanpa benar-benar memeriksa jenis blok itu bisa satu per satu. Misalnya, jika kita ingin mendapatkan perlawanan ledakan dari sebuah blok dan memeriksa apakah itu lebih besar dari atau sama dengan satu, maka akan dilakukan seperti ini:
import org.spongepowered.api.data.property.DoubleProperty;
import org.spongepowered.api.data.property.block.BlastResistanceProperty;
public boolean blastResistanceGreaterThanOne(Location<World> blockLoc) {
Optional<BlastResistanceProperty> optional =
blockLoc.getProperty(BlastResistanceProperty.class);
if(optional.isPresent()) {
BlastResistanceProperty resistance = optional.get();
DoubleProperty one = DoubleProperty.greaterThanOrEqual(1);
return one.matches(resistance);
}
return false;
}
Ini akan mendapatkan perlawanan ledakan dari blok kami dan membandingkannya dengan yang baru :javadoc: DoubleProperty, seperti :javadoc:` BlastResistanceProperty` mewarisi dari `` DoubleProperty``. Metode ini kemudian akan kembali jika resistance ledakan blok kita lebih besar dari satu, nilai pada nilai `` match () ``. Jika kita ingin melihat apakah itu kurang dari dua, kita akan menggantinya dengan `` lessThan () ``.
Jika kita membandingkan dua properti yang sudah ada sebelumnya, maka akan mengambil `` Operator`` dari nilai pertama kita, yang kita buat sebagai properti ganda. Jika `` Operator` `` DELEGATE`, yang merupakan operator none, maka akan mengambil` Operator` dari nilai kedua, yang di` cocok () . Perbandingan akan kembali salah jika keduanya ` DELEGATE``. Contoh membandingkan dua :javadoc: PoweredProperty s, a :javadoc:` BooleanProperty`, dapat dilihat di bawah ini:
import org.spongepowered.api.data.property.block.PoweredProperty;
public boolean areBlocksPowered(Location<World> blockLoc, Location<World> blockLoc2) {
Optional<PoweredProperty> optional = blockLoc.getProperty(PoweredProperty.class);
Optional<PoweredProperty> optional2 = blockLoc2.getProperty(PoweredProperty.class);
if(optional.isPresent() && optional2.isPresent()) {
PoweredProperty property1 = optional2.get();
PoweredProperty property2 = optional2.get();
BooleanProperty booleanProperty = BooleanProperty.of(property1);
BooleanProperty booleanProperty2 = BooleanProperty.of(true);
if(booleanProperty2.matches(property1)) {
return booleanProperty.matches(property2);
}
}
return false;
}
Cek kedua `` if`` memeriksa apakah salah satu propertinya benar. Jika benar dan keduanya sama, maka kedua nilai itu pasti benar. Karena itu, hilangkan kebutuhan untuk mengecek nilai kedua. Sekarang kita tahu bahwa kedua blok itu didukung.
A list of possible block properties can be found in the org.spongepowered.api.data.property.block package.
Sifat blok
Sifat blok adalah nilai tertentu pada keadaan blok saat ini. Blok mungkin atau mungkin tidak mengandung sifat-sifat blok, tergantung pada jenis bloknya. Misalnya, tempat tidur memiliki BooleanTrait bernama` BED_OCCUPIED`.Sebagai boolean hanya dapat memiliki dua nilai, benar dan salah, karakter `` BED_OCCUPIED`` hanya bisa benar atau salah. Memeriksa nilai ini sederhana, cukup hubungi metode BlockState#getTraitValue(BlockTrait). Contohnya dengan tempat tidur ditunjukkan di bawah ini:
import org.spongepowered.api.block.trait.BooleanTraits;
public boolean isBedOccupied(Location<World> blockLoc) {
if(blockLoc.getBlock().getType().equals(BlockTypes.BED)) {
return blockLoc.getBlock().getTraitValue(BooleanTraits.BED_OCCUPIED).get();
}
return false;
}
Peringatan
Jika memungkinkan, disarankan untuk menggunakan DataManipulator` di tempat` BlockTrait`` jika memungkinkan karena hanya dimaksudkan sebagai pengganti untuk kompatibilitas modded.