Modification d’une entité
Bien sûr, faire apparaître une bonne vieille entité, c’est sympa, mais il doit bien y avoir quelque chose de plus intéressant que ça, non ? C’est là que le DataManipulator entre en jeu. Une Entity est un DataHolder, ce qui signifie que notre Entity
peut contenir des données. Retrouvez plus d’infos sur le DataHolder
sur la documentation des données.
Les DataManipulator
s qui s’appliquent aux Entity
s sont des objets comme le FoodData ou le HealthData. Une liste des DataManipulator
s applicables peut être trouvé dans les packages org.spongepowered.api.data.manipulator.mutable et org.spongepowered.api.data.manipulator.mutable.entity. Notez que certains des DataManipulator
s qui s’y trouvent peuvent ne s’appliquer qu’à certaines entités.
Type d’Entité
Avant que nous puissions prendre la route avec notre Entity
, nous devrions vérifier quel type d”Entity
c’est, comme nous pouvons recevoir une Entity
que nous n’avons pas créé et donc, ne pas connaître son type. Faire ceci est une simple vérification d’égalité. Voici un exemple pour vérifier si notre Entity
est 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;
}
Manipulateurs de Données d’Entités
Maintenant que nous sommes sûrs que notre Entity
est un creeper, nous pouvons lui appliquer des DataManipulators spécifiques au creeper. Par exemple, javadoc:ExplosionRadiusData est un DataManipulator
que les creepers peuvent avoir, mais pas toutes les Entity
s. Un exemple de modification du rayon d’explosion d’une Entity
à la valeur 50 :
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));
}
Ceci récupérera l”ExplosiveRadiusData
de notre Entity
pour notre usage. Nous pouvons ensuite utiliser ces données pour définir le rayon d’explosion de notre creeper à 50. Nous devons ensuite offrir les données de nouveau au creeper, puisque les données que nous avons reçu de notre Entity
sont seulement une copie des données réelles.
Peut-être que nous souhaitons donner à notre Entity
un nom afin de la personnaliser un peu ! Cela se ferait à l’aide du DisplayNameData. Un exemple de cela en action peut être vu ci-dessous :
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")));
}
Une autre façon plus courte de faire ceci est de simplement utiliser les Keys sur notre Entity
au lieu d’utiliser les DataManipulator
s. Ce serait fait comme ceci :
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"));
}
Ceci raccourcirait notre code et serait plus facile à réaliser. Voir la documentation des données sur les avantages spécifiques d’utiliser les DataManipulator
s ou seulement les Keys
.