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