Bearbeiten einer Entität
Natürlich ist das Spawnen einer stink-normalen Entität schön und dergleichen, aber da muss es doch noch etwas spannenderes geben als das, oder? An dieser Stelle kommen die DataManipulatoren in Spiel. Eine Entity ist ein DataHolder, das bedeutet, dass unsere Entity
Daten haben kann. Mehr zum Thema DataHolder
kann in der Data Dokumentation nachgelesen werden.
DataManipulator
en die auf eine Entity
s angewendet werden können, sind beispielsweise FoodData oder HealthData. Eine Liste von anwendbaren DataManipulator
en kann in org.spongepowered.api.data.manipulator.mutable und org.spongepowered.api.data.manipulator.mutable.entity gefunden werden. Bitte beachte, dass nicht alle DataManipulator
en auf alle Entitäten angewendet werden können.
Entitäts-Typ
Bevor wir so richtig mit unserer Entity
durchstarten können, müssen wir prüfen, von welchem Typ unsere Entity
ist, da wir die Entity
vielleicht gar nicht erstellt sondern nur übergeben bekommen haben und daher nicht ihren Typ kennen. Dies zu kontrollieren ist genauso einfach wie eine Überprüfung der Gleichheit. Hier ist ein Beispiel in dem wir prüfen, ob unsere Entity
ein Creeper ist:
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;
}
Entitäts Daten Manipulatoren
Nun, da wir sicher sind, dass unsere Entity
ein Creeper ist, können wir die Creeper spezifischen DataManipulator
en darauf anwenden. Zum Beispiel ist ExplosionRadiusData ein DataManipulator
, den Creeper haben können, aber nicht alle Entity
s. Ein Beispiel für das Ändern des Explosionsradiuses der Entity
auf 50 sieht so aus:
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));
}
Dies holt uns die ExplosiveRadiusData
unserer Entity
für die weitere Verarbeitung. Wir verwenden dann diese Daten um den Explosionsradius unseres Creepers auf 50 zu ändern. Dafür müssen wir die geänderten Daten wieder an den Creeper zurückgeben, da die erhaltenen Daten der Entität nur eine Kopie der tatsächlichen Daten sind.
Vielleicht wollen wir unserer Entity
einen Namen geben um es noch ein bisschen mehr anzupassen! Dies kann mit DisplayNameData gemacht werden. Ein Beispiel hiervon in Aktion kann hier gesehen werden:
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")));
}
Ein anderer und kürzerer Weg dies zu tun, ist die Verwendung von Keys auf unserer Entity
anstatt der DataManipulator
en. Dies kann wie folgt getan werden:
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"));
}
Dies würde unseren Code aufräumen und ist leichter durchzuführen. Sieh dir die Data Dokumentation für die Vorteile bei der Verwendung von DataManipulator
en bzw. Keys
an.