Blokları modifiye etme

Changing a Block’s Type

Changing the Type of a Block is as simple as calling the Location#setBlockType(BlockType) method with the new BlockType. The following code turns the block at the given Location into a sponge:

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;

public void setToSponge(Location<World> blockLoc) {
    blockLoc.setBlockType(BlockTypes.SPONGE);
}

Bu kadar basit. Eğer bir bloğu ‘silmek’ isterseniz, ``Location``tarafından sunulan Location#removeBlock() metodunu kullanabilirsiniz.

Blok Durumlarını Değiştirme

Yukarıdaki örnekte olduğu gibi, Location sınıfı yeni BlockState alan bir Location#setBlock(BlockState)`yöntemi sunar. Bunu kullanmak için önce değiştirebileceğiniz bir ``BlockState` edinmeniz gerekir. Bloğun geçerli durumunu Location#getBlock() yöntemiyle alabilir veya bir BlockType’ın varsayılan durumunu kullanarak yapabilirsiniz. İkincisi aşağıda gösterilmiştir. Bir Sponge bloğu için varsayılan durum, doğrudan ıslak bir Sponge bloğu oluşturmak üzere alınır ve değiştirilir:

import org.spongepowered.api.Sponge;
import org.spongepowered.api.block.BlockState;
import org.spongepowered.api.data.manipulator.mutable.WetData;

public void setToWetSponge(Location<World> blockLoc) {
    BlockState state = BlockTypes.SPONGE.getDefaultState();
    WetData wetness = Sponge.getDataManager().
        getManipulatorBuilder(WetData.class).get().create();
    wetness.set(wetness.wet().set(true));
    BlockState newState = state.with(wetness.asImmutable()).get();
    blockLoc.setBlock(newState);
}

`` BlockState`` bir :javadoc: ImmutableDataHolder olduğu için sağlanan yöntemlerle` with () ve without () `` yi kullanabilirsiniz, ikisi de yeni bir değiştirilmiş `` BlockState`` döndürecektir ya da Optional.empty () ifadesiyle belirtilen: javadoc: ImmutableDataManipulator`, `` BlockState`` tarafından temsil edilen blok türü için geçerli değildir.

`` With () `` yöntemi bir `` ImmutableDataManipulator`` kabul eder ve verilen veri kümesiyle yeni bir `` BlockState`` oluşturup mevcut değerleri üzerine yazmaya çalışacaktır. Aşağıdaki örnek, herhangi bir kir bloğunu podzol olarak değiştirecektir.

import org.spongepowered.api.data.key.Keys;
import
    org.spongepowered.api.data.manipulator.immutable.block.ImmutableDirtData;
import org.spongepowered.api.data.manipulator.mutable.block.DirtData;
import org.spongepowered.api.data.type.DirtTypes;

public void dirtToPodzol(Location<World> blockLoc) {
    BlockState state = blockLoc.getBlock();
    Optional<ImmutableDirtData> dirtDataOpt =
        state.get(ImmutableDirtData.class);

    if (dirtDataOpt.isPresent()) {
        DirtData dirtData = dirtDataOpt.get().asMutable();
        dirtData.set(Keys.DIRT_TYPE, DirtTypes.PODZOL);
        BlockState dirtState = state.with(dirtData.asImmutable()).get();
        blockLoc.setBlock(dirtState);
    }
}

Unutmayın ki :javadoc: DirtData,` BlockState``de tutulan verilerin değiştirilebilir bir kopyasıdır. Değiştirildikten sonra değişmez bir hale dönüştürülür ve orijinal bloğun yerine geçen yeni bir ` BlockState`` yaratır.

`` Without () `` yöntemi sınıf referansını kabul eder ve verilen sınıf tarafından temsil edilen veriler olmadan yeni bir “BlockState” oluşturur. Blok durumu bu veriler olmadan geçerli olmazsa, varsayılan bir değer kullanılacaktır. Dolayısıyla, bir kir bloğu durumundaki “DirtData” öğesi kaldırılırsa, geri dönecek: javadoc: DirtTypes # DIRT`, varsayılan değer. Aşağıdaki örnek, mümkünse bloğa verilen bir “Konum” da kurutacaktır.

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

public void dry(Location<World> blockLoc) {
    BlockState wetState = blockLoc.getBlock();
    Optional<BlockState> dryState = wetState.without(ImmutableWetData.class);
    if (dryState.isPresent()) {
        blockLoc.setBlock(dryState.get());
    }
}

Since the WetData data manipulator represents boolean data, by removing it we set the wetness of the block (if it has any) to false. The dryState.isPresent() check will fail on block states that cannot be wet since dryState will be Optional.empty() in that case.

Blokları kopyalamak

Bir bloğun tüm verilerini kopyalamak isterseniz:: javadoc: BlockSnapshot` sınıfı en iyi arkadaşınız. Tüm verileri göstermezken, bir `` BlockType``, `` BlockState`` ve gerekirse tüm ilave Çini Varlık Verileri (örneğin sandık envanterleri) depolar. Elverişli bir şekilde, `` Konum`` sınıfı o noktada bloğun anlık görüntüsünü oluşturmak için bir: javadoc: Konum # createSnapshot () metodu sağlar. Bu, blokları bir konumdan diğerine kopyalamanın çok basit olmasını sağlar:

import org.spongepowered.api.block.BlockSnapshot;

public void copyBlock(Location<World> from, Location<World> to) {
    BlockSnapshot snapshot = from.createSnapshot();
    to.setBlock(snapshot.getState());
}