Modificando una Entidad

Advertencia

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!

Claro, engendrar una entidad antigua es agradable y todo, ¿pero tiene que haber algo más interesante que eso? Aquí es donde los DataManipulators entran en juego. Un Entity es un DataHolder, lo que significa que nuestra Entity puede contener datos. Se puede encontrar más información sobre DataHolders en la documentación de <../ data/index>.

DataManipulators que se aplican a Entitys son cosas como FoodData o HealthData. Una lista de DataManipulators aplicables puede ser encontrada en org.spongepowered.api.data.manipulator.mutable y org.spongepowered.api.data.manipulator.mutable.entity. Nótese que no todos los DataManipulators que ahí se encuentren podrán ser aplicados a todas las entidades.

Tipo de Entidad

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

Manipuladores de Datos de Entidades

Ahora que estamos seguros de que nuestra Entity es un creeper, podemos aplicarle DataManipulators específicos de creeper. Por ejemplo, ExplosionRadiusData es un DataManipulator que los creepers pueden tener, pero no todas las Entitys. Un ejemplo de cambiar el radio explosivo de una Entity a 50 puede ser visto abajo:

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

Esto obtendrá el ExplosiveRadiusData de nuestra `` Entity`` para nuestro uso. Luego usamos esa información para establecer el radio explosivo de nuestra enredadera en 50. Luego tenemos que ofrecer los datos a la enredadera, ya que los datos que recibimos de nuestra Entity son solo una copia de los datos en vivo.

Quizas queremos darle un nombre a nuestra Entity ¡para personalizarla un poco! Esto sería hecho usando DisplayNameData. Un ejemplo de esta acción se puede ver a continuación:

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

Otra manera mas rápida de hacer esto es usando Keys en nuestra``Entity`` en vez de usar DataManipulators. Esto se haría así:

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

This would neaten our code and is easier to perform. See the data documentation on the specific benefits of using either DataManipulators or just Keys.