Memodifikasi Blok

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

Hanya sesederhana itu. Jika anda hanya ingin 'menghapus' blok (yang dilakukan dengan menggantinya dengan udara), mungkin anda cukup menggunakan Location#removeBlock() metode yang disediakan oleh Lokasi.

Mengubah Blok Serikat

Mirip contoh diatas, Location kelas menyediakan Location#setBlock(BlockState) metode penerimaan yang baru BlockState. Untuk memanfaatkannya, anda harus terlebih dahulu memperoleh BlockState anda dapat memodifikasi. Anda dapat melakukannya dengan mendapatkan keadaan blok saat ini melalui Location#getBlock() metode atau dengan menggunakan BlockType's keadaan bawaan. Yang terakhir ditunjukkan dibawah ini. Keadaan bawaan untuk blok Sponge diambil dan kemudian dimodifikasi untuk membuat secara langsung blok sponge basah:

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

Sejak ' 'BlockState' ' adalah sebuah :javadoc: 'ImmutableDataHolder', anda dapat menggunakan metode yang disediakan ' 'dengan()' ' dan ' 'tanpa()' ', kedua yang akan mengembalikan perubahan baru ' 'BlockState' ' atau ' 'Optional.empty()' ' jika diberikan :javadoc: 'ImmutableDataManipulator' tidak bisa diaplikasikan untuk sejenis blok yang direpresentasikan oleh ' 'BlockState' '.

' ' dengan()' ' metode yang menerima sebuah ' 'ImmutableDataManipulator' ' dan akan mencoba untuk membuat baru ' 'BlockState' ' dengan pemberian data yang telah ditetapkan, menimpa nilai-nilai yang ada. Mengikuti contoh akan mengubah apapun blok kotor untuk podzol.

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

Mencatat :javadoc: 'DirtData' adalah sebuah penyalinan yang mungkin bisa merubah data yang ditahan ' 'BlockState' '. Diubah dan kemudian dikonversikan kembali untuk yang tetap dan digunakan untuk membuat baru ' 'BlockState' ' yang mana untuk mengganti blok yang asli.

Metode ' 'without()' ' menerima suatu kelas referensi dan akan membuat sebuah ' 'BlockState' ' yang baru tanpa data yang direpresentasikan oleh kelas yang diberikan. Jika keadaan blok tidak akan valid tanpa data itu, nilai default akan digunakan. jadi jika ' 'DirtData' ' dari sebuah keadan blok yang kotor dipindahkan. itu akan jatuh kembali ke :javadoc: 'DirtTypes#DIRT', nilai dasar. Mengikuti contoh akan di ringkai blok pada ' 'Location' ' yang diberikan, jika memungkinkan.

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.

Menyalin Blok

Jika kamu ingin menyalin semua dari sebuah data blok, :javadoc: kelas 'BlockSnapshot' adalah teman terbaikmu. Saat tidak bisa mengekspos semua data, itu membekali ' 'BlockType' ', ' 'BlockState itu sendiri dan, jika kebutuhan, semua tambahan Data Ubin Entiti (sebagai contoh tempat inventori). Kemudian, kelas ' 'Location' ' menyediakan sebuah metode :javadoc: 'Location#createSnapshot()' untuk membuat snapshot untuk blok pada saat ini. Untuk membuat salinan blok-blok dari satu lokasi ke lokasi lainnya yang lebih simple:

import org.spongepowered.api.block.BlockSnapshot;

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