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ı

BlockState, BlockType, herhangi bir DataManipulator ve bloğa uygulanan özellikler ve bir blok için herhangi bir BlockTrait içerir. Belirli bir blok için değişmez değerleri depolar. Bunun kullanımı aşağıdaki gibi bir ImmutableDataManipulator elde eder:

import org.spongepowered.api.block.BlockState;
import org.spongepowered.api.data.manipulator.immutable.ImmutableWetData;

public boolean 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;
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 = new DoubleProperty(1, Property.Operator.GEQUAL);
        return one.matches(resistance);
    }
    return false;
}

This will get the blast resistance of our block and compare it to a new DoubleProperty, as BlastResistanceProperty inherits from DoubleProperty. The method will then return if the blast resistance of our block is greater than one, the value in placed matches(). If we wanted to see if it was less than two, we would replace the property operator in the DoubleProperty ctor with Property.Operator.LESS.

Ö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.BooleanProperty;
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 = new BooleanProperty(true, Property.Operator.EQUAL);

        if(booleanProperty.matches(property1)) {
            return property1.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.