İşlemler

Sonucun Okunması

Bir veri tutucusuna “offer” ettiğiniz her şey için, ‘’offer’’ yöntemi bir :javadoc:’DataTrans actionResult’ üretecektir. Bu nesne aşağıdakileri içerecektir:

Tür

:javadoc:’DataTransactionResult.Type’ işlemin başarıyla tamamlandığını ya da başarısızsa neden başarısız olduğunu gösterir.

‘’UNDEFINED’’

İşlem için açık bir sonuç yok ise bir şeylerin ters gittiğini gösteriyor

‘’SUCCESS’’

İşlem başarıyla tamamlandı

‘’FAILURE’’

İşlem beklenen nedenlerden dolayı başarısız oldu (örn. Uyumsuz veriler)

‘’ERROR’’

İşlem beklenmedik nedenlerle başarısız oldu

‘’CANCELLED’’

Etkinlik bu işlem için iptal edildi

Etkilenen veri

Sonuç ayrıca, işlemde yer alan verileri temsil eden değer konteynerleri içeren birkaç değiştirilemez liste sunar.

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

Örnekler

Bir Oyuncu İyileştiriliyor

Şüphesiz: :doc:’keys’ sayfasındaki örneği hatırlarsınız. O yoldan iyileşen yarım kalbe (1 sağlığa eşit) sahip olan bir oyuncu düşünün. Bu durumda ‘’DataTransactionResult’’ şöyle görünür:

  • ‘’getType()’’ ‘’SUCCESS’’ dönecektir

  • ‘’RejectedData()’’ almak boş bir liste olur

  • ‘’getReplacedData()’’ 1.0 değerinde ‘’Keys.HEALTH’’ tuşu için bir değer konteyneri içerir

  • ‘’getSuccessfulData()’’ 20.0 değerine sahip “Keys.HEALTH” tuşu için bir değer konteyneri içermelidir

Now what would be different if we used the healing example from the Özel Veri 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.

HealthData’yı bir blok taşına teklif etme

Şimdi yukarıda bahsedilen örnekler, uyumsuz verileri sunmaya çalışmak yerine sessizce başarısız olacak şekilde kodlanmıştır. Fakat (tamamen iyileşmiş) bir oyuncunun ‘’HealthData’’ aldığımızı ve şu anda üzerinde durduğu blok taşın :javadoc:’Location’ alanına sunmaya çalıştığımızı düşünün. Bunu “Location” da bir veri sahibi olduğu için yapabiliriz. Ve eğer bunu yaparsak, bize şöyle bir ‘’DataTransactionResult’’ ile ödül verecektir:

  • ‘’getType()’’ ‘’FAILURE’’ döndürür

  • ‘’Get Rejected Data()’’ her biri 20.0’lık bir değere sahip “HEALTH” ve “MAX_HEALTH” tuşları için iki tane değer konteyneri içermelidir

  • ‘’getReplacedData()’’ ve ‘’getSuccessfulData()’’ almak boş liste oluşturur

İşlemler geri veriliyor

Bir işlem sonucuyla ilgili her şey değişmez olduğundan, veri değişiklikleri belgelemek için kullanılabilir. Ayrıca belgelerdeki değişikliklerin geri alınmasına da izin verir. Bunun için bir işlem sonucunu veri sahibinin ‘’undo()’’ yöntemine basitçe geçer. Bazı veri önerileri kısmen başarılı olabilir, çünkü bir veya daha fazla değer veri sahibine başarıyla yazılır, henüz bir değer daha kabul edilemez. Kısmi başarıları geri almak isteyebilirsiniz.

Code Example: Reverting a transaction

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);
    }
}