Transaksi

Membaca hasilnya

Untuk semua yang Anda tawarkan ke dudukan data, metode penawaran akan menghasilkan :javadoc: DataHasilTransaksi. Objek ini akan berisi hal berikut:

Tipe

Itu :javadoc: DataHasilTransaksi.Tipe menunjukkan apakah transaksi berhasil diselesaikan dan, jika tidak, bagaimana hal itu gagal.

TIDAK TERDEFINISIKAN

Tidak ada hasil yang jelas untuk transaksi tersebut - menunjukkan bahwa ada sesuatu yang salah

SUKSES

Transaksi berhasil diselesaikan

GAGAL

Transaksi gagal karena alasan yang diharapkan (misalnya data yang tidak sesuai)

EROR

Transaksi gagal karena alasan tak terduga

BATALKAN

Sebuah acara untuk transaksi ini dibatalkan

Data yang terpengaruh

Hasilnya juga menyediakan beberapa daftar yang tetap berisi kotak nilai yang tidak berubah yang mewakili data yang terlibat dalam transaksi.

successfulData() | contains all data that was successfully set

replacedData() | contains all data that got replaced by successfully set data

rejectedData() | contains all data that could not be set

Contoh

Menyembuhkan Pemain

Tentunya Anda ingat contoh penyembuhan di halaman kunci. Bayangkan seorang pemain yang setengah hati (yang sama dengan 1 kesehatan) disembuhkan seperti itu. DataHasilTransaksi` dalam hal ini akan terlihat seperti ini:

  • dapatMengetik()``akan mengembalikan``SUKSES

  • dapatditolakData() akan menjadi kosong daftar

  • `` getReplacedData () `` akan berisi satu wadah nilai untuk tombol `` Keys.HEALTH`` dengan nilai 1,0

  • `` getSuccessfulData () `` akan berisi satu wadah nilai untuk tombol `` Keys.HEALTH`` dengan nilai 20,0

Now what would be different if we used the healing example from the Kustom Data page instead? Since the HealthData data manipulator contains values for both the current and the maximum health, in addition to the above result, both the getReplacedData() list and the getSuccessfulData() list would contain one more element: A value container for the Keys.MAX_HEALTH key with a value of 20.0.

Menawarkan DataKesehatan ke blok batu

Sekarang contoh-contoh yang disebutkan di atas dikodekan sedemikian rupa sehingga mereka akan gagal secara diam-diam daripada mencoba menawarkan data yang tidak sesuai. Tapi bayangkan kita mengambil (sembuh total) DataSehat pemain yang benar-benar sembuh dan mencoba menawarkannya ke :javadoc:`Lokasi` dari blok batu yang saat ini dia jalani. Kita bisa melakukan ini, karena Lokasi juga merupakan dudukan data. Dan jika kita melakukannya, itu akan memberi kita penghargaan dengan DataHasilTransaksi seperti ini:

  • getTipe() akan kembali KEGAGALAN

  • `` getRejectedData () `` akan berisi dua wadah nilai untuk tombol `` HEALTH`` dan `` MAX_HEALTH``, masing-masing dengan nilai 20,0

  • `` getReplacedData () `` dan `` getSuccessfulData () `` akan menjadi daftar kosong

Mengembalikan Transaksi

Karena segala sesuatu tentang hasil transaksi tidak berubah, ini dapat berfungsi untuk dokumentasi perubahan data. Dan ini juga memungkinkan perubahan yang di dalamnya dibatalkan. Untuk itu, cukup kirimkan hasil transaksi ke metode ``ulang()``pemegang data. Ini sangat berguna karena beberapa penawaran data mungkin sebagian berhasil, sehingga satu atau lebih nilai berhasil ditulis ke dudukan data, namun satu nilai lagi tidak dapat diterima. Karena Anda mungkin ingin membatalkan keberhasilan sebagian.

Contoh Kode: Mengembalikan transaksi

import org.spongepowered.api.data.DataHolder;
import org.spongepowered.api.data.DataTransactionResult;
import org.spongepowered.api.data.manipulator.DataManipulator;

public void safeOffer(DataHolder target, DataManipulator data) {
    DataTransactionResult result = target.offer(data);
    if (result.getType() != DataTransactionResult.Type.SUCCESS) {
        target.undo(result);
    }
}