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 DataManipulators qui s’appliquent aux Entitys sont des objets comme le FoodData ou le HealthData. Une liste des DataManipulators 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 DataManipulators 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 Entitys. 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 DataManipulators. 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 DataManipulators ou seulement les Keys.