Memodifikasi suatu Entitas

Peringatan

These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!

Tentu, pembuatan entitas lama bagus, tetapi apakah harus ada sesuatu yang lebih menarik dari itu? Inilah dimana DataManipulators ikut bermain. Sebuah Entity merupakan sebuah DataHolder, yang berarti bahwa Entity kita dapat menampung data. Lebih lanjut tentang DataHolders dapat ditemukan di dalam data documentation.

DataManipulator` yang berlaku untuk` Entity` adalah hal-hal seperti : javadoc: ` FoodData` atau : javadoc: HealthData. Daftar "DataManipulator` yang sesuai dapat ditemukan di : javadoc: ` org.spongepowered.api.data.manipulator.mutable` dan : javadoc: org.spongepowered.api.data.manipulator.mutable.entity . Perhatikan bahwa tidak semua DataManipulator` yang ditemukan mungkin berlaku untuk semua entitas.

Tipe Entitas

Before we can jump behind the wheel with our Entity, we should check what type of Entity it is, as we may receive an Entity we didn't create and thus, do not know its type. Doing this is a simple equality check. Here is an example of checking if our Entity is a creeper:

import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;

public boolean isCreeper(Entity entity) {
    return entity.getType().equals(EntityTypes.CREEPER);
}

Badan Data Manipulator

Sekarang bahwa kita yakin bahwa kita Entitas yang menjalar, kita dapat menerapkan menjalar tertentu DataManipulators itu. Misalnya, ExplosionRadiusData adalah DataManipulator yang merambat dapat memiliki, tapi tidak semua Entitass. Contoh mengubah sebuah Entitass ledak radius 50 dapat dilihat di bawah ini:

import org.spongepowered.api.data.manipulator.mutable.entity.ExplosiveRadiusData;

public void explosionRadius50(Entity creeper) {
    ExplosionRadiusData radiusData = creeper.get(ExplosionRadiusData.class).get();
    creeper.offer(radiusData.explosionRadius().setTo(50));
}

Ini akan mendapatkan ExplosiveRadiusData kami Entitas untuk kami gunakan. Kami kemudian menggunakan data tersebut untuk mengatur radius ledakan dari kami menjalar ke 50. Kita kemudian harus memberikan data kembali ke menjalar, karena data yang kami terima dari kami Entitas hanya salinan data hidup.

Mungkin kita ingin memberikan Entitas nama untuk menyesuaikan sedikit! Ini akan dilakukan dengan menggunakan DisplayNameData. Contoh dari hal ini dalam tindakan dapat dilihat di bawah ini:

import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.spongepowered.api.data.manipulator.mutable.DisplayNameData;

public void setDisplayName(Entity creeper) {
    DisplayNameData displayData = creeper.get(DisplayNameData.class).get();
    creeper.offer(displayData.displayName()
        .set(Component.text("Inscrutable", NamedTextColor.DARK_AQUA)));
}

Lain, cara yang lebih singkat untuk melakukan hal ini adalah dengan hanya menggunakan :javadoc:`Kunci` pada kami Entitas alih-alih menggunakan DataManipulators. Ini akan dilakukan seperti:

import org.spongepowered.api.data.key.Keys;

public void explosionRadius50(Entity creeper) {
    creeper.offer(Keys.EXPLOSION_RADIUS, Optional.of(50));
    creeper.offer(Keys.DISPLAY_NAME, Component.text("Inscrutable", NamedTextColor.DARK_AQUA));
}

Ini akan merapikan kode kita dan akan lebih mudah untuk melakukan. Lihat data dokumentasi pada spesifik manfaat baik menggunakan DataManipulators atau hanya Kunci.