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

Предупреждение

Эти документы были написаны для SpongeAPI 7 и, вероятно, устаревшие. Если вы чувствуете, что вы можете помочь обновить их, пожалуйста, отправьте PR!

Конечно, спавнить обычную сущность это конечно хорошо, но должно же быть что-то более интересное, чем это? Здесь-то 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 крипером:

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

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

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

Теперь, когда мы уверены, что наша Entity является крипером, мы можем применить к нему специальные DataManipulator. Например, ExplosionRadiusData — это DataManipulator, который может применяться к криперам, но не ко всем Entity-м. Пример изменения радиуса действия взрывчатого вещества `` Entity`` до 50 можно увидеть ниже:

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

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

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

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

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

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

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