Gunakan Tombol

Menerima dan memberikan data menggunakan kunci

Pemegang data menyediakan metode untuk mengambil atau mengubah satu titik data yang diidentifikasi oleh :javadoc:`Kunci`. Mari kita mulai dengan sebuah contoh:

Contoh Kode: Menyembuhkan pemegang data, jika mungkin

import org.spongepowered.api.data.DataHolder;
import org.spongepowered.api.data.key.Keys;

public void heal(DataHolder target) {
    if (target.supports(Keys.HEALTH)) {
        double maxHealth = target.get(Keys.MAX_HEALTH).get();
        target.offer(Keys.HEALTH, maxHealth);
    }
}

Sekarang untuk rincian fungsi di atas.

The first line checks if our given data holder supports a current health value. Only if it does, it can be healed after all. Since a data holder cannot have current health without having a maximum health and vice versa, a check for one of the keys using the supports() method suffices.

Baris kedua menggunakan fungsi get() untuk meminta pemegang data atas kesehatan maksimalnya. Selain get(), metode getOrNull() dan metode getOrElse() ada, semuanya yang menerima Key sebagai parameter pertamanya. Secara umum, get() seharusnya digunakan, yang akan mengembalikan Optional data yang diminta atau Optional.empty() jika pemegang data tidak mendukung kunci yang disediakan. Karena kita sudah memverifikasi bahwa Key didukung, kita dapat memanggil get() pada Optional tanpa pemeriksaan lebih lanjut. Kita juga dapat menggunakan getOrNull() yang pada dasarnya jalan pintas untuk memanggil get(key).orNull(), sehingga menyingkirkan Optional. Kemungkinan ketiga adalah getOrElse(), yang menerima nilai bawaan sebagai parameter kedua untuk dikembalikan jika nilainya tidak ada pada pemegang data.

Di baris ketiga, kami menawarkan data kembali ke dudukan data. Kami menyediakan Kunci yang menunjukkan kesehatan saat ini dan sebelum memperoleh kesehatan maksimal, sehingga menyembuhkan data pemegang ke kesehatan penuh. Ada berbagai metode penawar() yang menerima pengaturan parameter yang berbeda, yang semuanya mengembalikan :javadoc: DataHasilTransaksi berisi informasi jika tawaran tersebut diterima. Untuk saat ini, kita akan menggunakan yang menerima Kunci dan nilai yang sesuai, tapi kita akan menemukan lebih banyak di halaman berikutnya. Karena kita sudah tahu bahwa tawaran kesehatan saat ini diterima (karena dudukan data mendukungnya), kita dapat membuang hasilnya secara diam-diam.

Hal ini juga memungkinkan untuk benar-benar menghapus data dari :javadoc: DududkanData menggunakan fungsi hapus(). Cukup berikan Kunci yang mewakili data yang ingin dihapus. Contoh berikut akan mencoba menghapus nama khusus dari pemegang data tertentu:

public void removeName(DataHolder target) {
    target.remove(Keys.DISPLAY_NAME);
}

Mengubah data

Selain mendapatkan, memodifikasi dan menawarkan nilai, ada cara lain untuk berinteraksi dengan data. Dengan menggunakan metode mengubah()``datanya, kita bisa melewati ``Kunci dan Fungsi. Secara internal, nilai untuk kunci akan diambil dan fungsi yang diberikan diterapkan padanya. Hasilnya kemudian disimpan di bawah tombol dan metode mengubah() akan mengembalikan DataHasilTransaksi sesuai dengan itu.

Sekarang, sebagai contoh, bayangkan kita ingin menggosok dudukan data dengan melipat gandakan kesehatan maksimalnya.

import java.util.function.Function;

public void buff(DataHolder target) {
    target.transform(Keys.MAX_HEALTH, new Function<Double,Double>() {
        @Override
        public Double apply(Double input) {
            return (input == null) ? 0 : input * 2;
        }
    });
}

Atau, jika anda menggunakan Java 8, anda dapat memperpendek baris ekspresi lambda:

public void buff(DataHolder target) {
    target.transform(Keys.MAX_HEALTH, d -> (d == null) ? 0 : 2*d);
}

Catatan bahwa dalam kedua kasus tersebut kita perlu memastikan fungsi kita yang lolos dapat menangani null. Anda juga akan memperhatikan bahwa tidak ada pemeriksaan yang dilakukan jika sasaran sebenernya mendukung kunci Keys#MAX_HEALTH. Jika sasaran tidak mendukung, fungsi transform() akan gagal dan mengembalikan DataTransactionResult yang menunjukkan demikian.

Nilai kunci

There are cases where you may care about not only the direct value for a Key, but the keyed value encapsulating it. In that case, use the getValue(key) method instead of get(key). You will receive an object inheriting from Value which contains a copy of the original value. As Keys#SPAWNABLE_ENTITIES is a WeightedCollectionValue, we can get a list of potentional entity that could spawn using the Value of the key.

Contoh Kode: Bawa target ke ambang kematian

public void scare(DataHolder target) {
    if (target.supports(Keys.NEXT_ENTITY_TO_SPAWN)) {
        WeightedCollectionValue value = target.getValue(Keys.NEXT_ENTITY_TO_SPAWN).get();
        List<Entity> entities = value.get(new Random());
    }
}