Модификация сущности
Конечно, спавнить обычную сущность это конечно хорошо, но должно же быть что-то более интересное, чем это? Здесь-то 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 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.EXPLOSION_RADIUS, Optional.of(50));
creeper.offer(Keys.DISPLAY_NAME, Text.of(TextColors.DARK_AQUA, "Inscrutable"));
}
Это упростит наш код и его будет легче понять. Смотрите документация данных для просмотра преимуществ использования DataManipulator
или просто Keys
.