Bearbeiten einer Entität
Warnung
These docs were written for SpongeAPI 7 and are likely out of date. If you feel like you can help update them, please submit a PR!
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
Before we can jump behind the wheel with our Entity
, we should check what type of Entity
it is, as we may
receive an Entity
we didn’t create and thus, do not know its type. Doing this is a simple equality check. Here is
an example of checking if our Entity
is a creeper:
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.EntityTypes;
public boolean isCreeper(Entity entity) {
return entity.getType().equals(EntityTypes.CREEPER);
}
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) {
ExplosionRadiusData radiusData = creeper.get(ExplosionRadiusData.class).get();
creeper.offer(radiusData.explosionRadius().setTo(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 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)));
}
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.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
.