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 DataHolder
s en la documentación de <../ data/index>.
DataManipulator
s que se aplican a Entity
s son cosas como FoodData o HealthData. Una lista de DataManipulator
s 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 DataManipulator
s 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 DataManipulator
s específicos de creeper. Por ejemplo, ExplosionRadiusData es un DataManipulator
que los creepers pueden tener, pero no todas las Entity
s. 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 DataManipulator
s. 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 DataManipulator
s or just Keys
.