Blokları modifiye etme

Block türünü değiştirme

Bir Blok Tipini Değiştirmek,: javadoc: Location # setBlockType (BlockType, Cause) yöntemini yeni: javadoc: BlockType ile çağırmak kadar basittir. Pek çok blok değişikliğinde olduğu gibi, blok değişikliği için bir sebep sağlamamız gerekir. Çoğu durumda bu, ana eklenti sınıfınız olabilir. Aşağıdaki kod verilen bloğun bloğunu çevirir: javadoc: Location ve bir sponge haline getirir:

import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;

public void setToSponge(Location<World> blockLoc, Object myPluginInstance) {
    blockLoc.setBlockType(BlockTypes.SPONGE, Cause.source(myPluginInstance).build());
}

Bu kadar basit. Bir bloğu (hava ile değiştirerek) ‘silmek’ isterseniz, Location tarafından sağlanan :javadoc: Location#removeBlock (Cause) yöntemini kullanabilirsiniz.

Blok Durumlarını Değiştirme

Yukarıdaki örnekte olduğu gibi, Location sınıfı :javadoc: Location # setBlock (BlockState, Cause) yöntemi yeni bir: javadoc: BlockState ile kabul eder. Bunu kullanmak için önce değiştirebileceğiniz bir `` BlockState`` edinmeniz gerekir. Ya bloğun geçerli durumunu: javadoc: 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 alınır ve doğrudan ıslak bir sponge bloğu oluşturmak üzere 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, Object myPluginInstance) {
    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, Cause.source(myPluginInstance).build());
}

`` 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, Object myPluginInstance) {
    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, Cause.source(myPluginInstance).build());
    }
}

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, Object myPluginInstance) {
    BlockState wetState = blockLoc.getBlock();
    Optional<BlockState> dryState = wetState.without(ImmutableWetData.class);
    if (dryState.isPresent()) {
        blockLoc.setBlock(dryState.get(), Cause.source(myPluginInstance).build());
    }
}

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 can not 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, Object myPluginInstance) {
    BlockSnapshot snapshot = from.createSnapshot();
    to.setBlock(snapshot.getState(), Cause.source(myPluginInstance).build());
}