Modificando una Entidad

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

Antes de que podamos tomar las riendas de nuestra “Entidad”, deberíamos revisar que tipo de “Entidad” es, ya que podríamos recibir una “Entidad” que no hemos creado y por ende, no sabríamos a qué tipo pertenece. Lo podremos hacer con un simple chequeo comparativo. El siguiente es un ejemplo de cómo hacer para saber si nuestra “Entidad” es un creeper:

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

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

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) {
    ExplosiveRadiusData radiusData = creeper.get(ExplosiveRadiusData.class).get();
    creeper.offer(radiusData.explosiveRadius().set(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 org.spongepowered.api.data.manipulator.mutable.DisplayNameData;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.text.format.TextColors;

public void setDisplayName(Entity creeper) {
    DisplayNameData displayData = creeper.get(DisplayNameData.class).get();
    creeper.offer(displayData.displayName().set(Text.of(TextColors.DARK_AQUA,
                                                          "Inscrutable")));
}

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.EXPLOSIVE_RADIUS, 50);
    creeper.offer(Keys.DISPLAY_NAME, Text.of(TextColors.DARK_AQUA, "Inscrutable"));
}

Esto mejorará nuestro código y es fácil de realizar. Vea el data documentation sobre los beneficios específicos de usar DataManipulators o sólo Keys.