Модификация сущности
Предупреждение
Эти документы были написаны для 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));
}
This would neaten our code and is easier to perform. See the data documentation on
the specific benefits of using either DataManipulator
s or just Keys
.