Модификация сущности

Конечно, спавнить обычную сущность это конечно хорошо, но должно же быть что-то более интересное, чем это? Здесь-то DataManipulator вступает в игру. Entity является DataHolder, что означает то что наш Entity может содержать данные. Больше о DataHolder может быть найдено в документации данных.

DataManipulator который применяется к Entity является таким же как и FoodData или HealthData. Список применимых DataManipulator может быть найден в org.spongepowered.api.data.manipulator.mutable и org.spongepowered.api.data.manipulator.mutable.entity. Учтите, что не все найденные DataManipulator могут быть применены к сущностям.

Тип сущности

Перед тем как мы сядем за руль нашего Entity, мы должны проверить какой тип Entity мы используем, поскольку мы можем получить Entity который мы не создавали и, следовательно, мы не знаем его тип. Это простая проверка равенства. Вот пример проверки того, является ли наш Entity крипером:

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

Манипуляторы данных сущности

Теперь, когда мы уверены, что наша Entity является крипером, мы можем применить к нему специальные DataManipulator. Например, ExplosionRadiusData — это DataManipulator, который может применяться к криперам, но не ко всем Entity-м. Пример изменения радиуса действия взрывчатого вещества `` Entity`` до 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));
}

Этот код получит ExplosiveRadiusData нашего Entity для нашего использования. Затем мы используем эти данные для изменения радиуса взрыва нашего крипера на 50. После этого мы должны отправить наши данные обратно к криперу, так как данные, которые мы получили от нашего Entity являются только копией данных в реальном времени.

Возможно мы хотим дать нашему Entity имя и немного изменить его! Это можно сделать используя DisplayNameData. Пример использования которого можно увидеть ниже:

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

Другой, более короткий способ сделать это - использовать Keys в нашем Entity вместо использования DataManipulator. Это будет выглядеть вот так:

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

Это упростит наш код и его будет легче понять. Смотрите документация данных для просмотра преимуществ использования DataManipulator или просто Keys.