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.

DataManipulatoren die auf eine Entitys angewendet werden können, sind beispielsweise FoodData oder HealthData. Eine Liste von anwendbaren DataManipulatoren kann in org.spongepowered.api.data.manipulator.mutable und org.spongepowered.api.data.manipulator.mutable.entity gefunden werden. Bitte beachte, dass nicht alle DataManipulatoren 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 DataManipulatoren darauf anwenden. Zum Beispiel ist ExplosionRadiusData ein DataManipulator, den Creeper haben können, aber nicht alle Entitys. 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 DataManipulatoren. 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 DataManipulatoren bzw. Keys an.