Bloklara erişim
Temel bilgi
Bloklar çoğunlukla kendine ait Location tarafından tanımlanır ve erişilirler. Bu konum, bir :javadoc: Extent içindeki belirli bir koordinat noktasını işaret eder. Çoğu durumda World,` `Extent``olarak kullanılacaktır.
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;
}
Uyarı
Yukarıdaki örneğin, world’ün var olup olmadığını kontrol etmediğini unutmayın. getWorld(worldName).get ()
bu adla yüklü bir world yoksa başarısız olur.
Bu Location
nesnesi ile blok hakkında daha fazla bilgi edinebilirsiniz. Aşağıdaki kod, başvurulan bir bloğun herhangi bir tür banner olup olmadığını blok türünü kontrol ederek denetler.
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);
}
Tüyo
Her bloğun yalnızca biri olan BlockType örneği olduğu için ==``fonksiyonu` `equals()` `yerine kullanılabilir, ancak genellikle``equals ()
kullanılması tavsiye edilir.
Blok verisi manipülatörleri
Bir bloğun verileri, API’nin diğer bölümlerine benzer şekilde bir DataManipulator olarak tutulur. Bu, bloğun yönü, belirli türleri (taş vs. granit vb.) Gibi bloğumuzun bileşenleri hakkında bilgi barındıran konteynerdir. Bu manipülatörlerin değerlerini kontrol etmek kolaydır, sadece bloğun yönünü kontrol etmeniz yeterlidir :javadoc: 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;
}
Öncelikle, hangi DataManipulator
alt arabirimine ihtiyacımız olduğunu bilmeliyiz. Bloklar için geçerli olanlar org.spongepowered.api.data.manipulator.mutable ve :javadoc:` org.spongepowered.api.data.manipulator.mutable.block` paketlerinde bulunur. Ardından, bu sınıfı bir Optional
döndürecek olan get (DataManipulator)
Location
yöntemine geçirebiliriz. Daha sonra DataManipulator
’ün bloğumuz için gerçekten var olup olmadığını kontrol etmek için “ifPresent ()``i işaretleyelim. Eğer varsa, kullanabiliriz.
DataManipulator
hakkında daha fazlası data documentation’ da bulunabilir.
Tüyo
Bir blok, merdivenlerle “DirectionalData” gibi belirli bir “DataManipulator” desteğini asla durduramazsa, isPresent ()
fonksiyonunu kontrol etmeye gerek yoktur. DataManipulator
etrafındaki isteğe bağlı olanları kaldırın ve deyimin sonuna .get ()
ekleyerek isteğe bağlı olmayan verileri getirin. Bir blok DataManipulator
özelliğini desteklemeyi durdurursa, bunun bir NullPointerException
‘e neden olacağını unutmayın.
Blok durumları
A BlockState contains a BlockType, any DataManipulator
s and properties that are applied to
the block, and any BlockTraits for a block. It stores all immutable value’s for a particular block. One
use of this is getting an ImmutableDataManipulator, as shown below:
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();
}
Değiştirilebilir ve değiştirilemeyen DataManipulator
’ler ile ilgili daha fazla bilgiyi şu belgede bulabilirsiniz :doc: data documentation <../data/datamanipulators>.
Blok özellikleri
Bloklar bazı özellikleri içerebilir. Bir mülk, o bloğun oyun mantığını tanımlayan önceden ayarlanmış bir değerdir. Örneğin; bloklar, birlikte çalıştıklarınızı belirlemek için kullanılabilecek önceden belirlenmiş patlama direnç değerlerini içerebilir, tek tek olabilecek blok türünü kontrol etmezsiniz. Örneğin; bir bloğun patlama direncini elde etmek ve bir bloğun büyüklüğüne eşit olup olmadığını kontrol etmek istiyorsak, şu şekilde yapılır:
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;
}
Bu, bloğumuzun patlama direncini alacak ve bunu yeni bir DoubleProperty ile karşılaştıracaktır :javadoc:` BlastResistanceProperty`’yi DoubleProperty
den devralır. Yöntem, daha sonra bloğumuzun patlama direnci bir büyükse, yerleştirilen matches()
ise geri dönecektir. Eğer ikiden az olup olmadığını görmek istersek, bunu lessThan()
ile değiştiririz.
Önceden mevcut iki özellik karşılaştırılırsa, ilk değeri Operator``ı alır, bu, bizim için bir çift özellik oluşturur. Eğer ``Operator
, none operatörü olan DELEGATE
ise, ikinci değerin Operator``ünü, ``matches()
deki `` Operator``ü alacaktır. Her ikisi de DELEGATE
ise karşılaştırma yanlış döndürür. İki karşılaştırma örneği :javadoc: PoweredProperty, BooleanProperty, aşağıda görülebilir:
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;
}
İkinci if
kontrolü, özelliklerden birinin doğru olup olmadığını kontrol eder. Eğer doğruysa ve her ikisi de eşitse, her iki değer de doğru olmalıdır. Bu nedenle, ikinci değeri kontrol etme ihtiyacını ortadan kaldırır. Şimdi her iki bloğa da güç verildiğini biliyoruz.
Olası blok özelliklerinin bir listesi org.spongepowered.api.data.property.block paketinde bulunabilir.
Blok özellikleri
Bir blok özelliği, bir bloğun geçerli durumu üzerinde belirli bir değerdir. Blok, bloğun türüne bağlı olarak blok özelliklerini içerebilir veya içermeyebilir. Örneğin, bir yatakta :BED_OCCUPIED
adlı bir BooleanTrait vardır. Bir boolean yalnızca iki değer olabilir, true ve false, BED_OCCUPIED
özelliği yalnızca doğru veya yanlış olabilir. Bu değeri kontrol etmek çok basit, sadece BlockState#getTraitValue(BlockTrait) yöntemini çağırın. Yataklı bir örnek aşağıda gösterilmiştir:
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;
}
Uyarı
Mümkünse mümkün olan yerlerde BlockTrait
yerine DataManipulator
kullanmanız tavsiye edilir, çünkü bunlar sadece sürüm uyumluluğu için bir dönüş olarak düşünülmelidir.