Memodifikasi Blok

Mengubah Blok Jenis

Mengubah Jenis Blok adalah sebagai sederhana seperti memanggil :javadoc:`Lokasi#setBlockType(BlockType, Menyebabkan)` dengan metode baru BlockType. Seperti kebanyakan blok modifikasi, kita perlu untuk memasok penyebab blok perubahan. Dalam kebanyakan kasus, ini dapat anda plugin utama kelas. Kode berikut ternyata blok yang diberikan :javadoc:`Lokasi` menjadi sponge:

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

Ini yang sederhana seperti itu. Jika anda hanya ingin 'menghapus' blok (yang dilakukan oleh menggantinya dengan udara), anda dapat hanya menggunakan :javadoc:`Lokasi#removeBlock(Penyebab)` metode yang ditawarkan oleh Lokasi.

Mengubah Blok Serikat

Serupa dengan contoh di atas,``Lokasi``kelas menyediakan a :javadoc:`Lokasi#setBlock(BlockState, Menyebabkan)` menerima metode baru BlockState. Untuk menggunakannya, anda harus terlebih dahulu memperoleh BlockState anda dapat memodifikasi. Anda dapat melakukannya baik dengan mendapatkan blok saat ini negara melalui :javadoc:`Lokasi#getBlock()` metode atau dengan menggunakan BlockType's keadaan acakan. Yang terakhir ini yang ditunjukkan di bawah ini. Keadaan acakan untuk Spons blok ini diambil dan kemudian dimodifikasi untuk langsung membuat spons basah block:

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

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

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

Karena :javadoc: 'WebData' data manipulator mewakili data boolean, dengan memindahkannya kami kita mengatur kesaksian dari blok (jika ia memeiliki beberapa) kesalahan. Pemeriksaan' 'dryState.isPresent()' ' akan jatuh kepada keadaan blok yang tidak bisa disebabkan oleh ' 'dryState' ' yang lemah akan menjadi ' 'Optional.empty()' ' pada situasi itu.

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