Skip to content

Commit 41fe010

Browse files
committed
Add entity removal reason API
1 parent 29c8822 commit 41fe010

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.papermc.paper.entity;
2+
3+
import org.bukkit.entity.Entity;
4+
5+
/**
6+
* Represents the reason an entity was removed.
7+
*
8+
* @see Entity#getRemovalReason()
9+
*/
10+
public enum RemovalReason {
11+
// Start generate - RemovalReason
12+
// @GeneratedFrom 1.21.8
13+
KILLED(true, false),
14+
DISCARDED(true, false),
15+
UNLOADED_TO_CHUNK(false, true),
16+
UNLOADED_WITH_PLAYER(false, false),
17+
CHANGED_DIMENSION(false, false);
18+
// End generate - RemovalReason
19+
20+
private final boolean destroy;
21+
private final boolean save;
22+
23+
RemovalReason(final boolean destroy, final boolean save) {
24+
this.destroy = destroy;
25+
this.save = save;
26+
}
27+
28+
/**
29+
* {@return whether the entity should be destroyed after being removed}
30+
*/
31+
public boolean shouldDestroy() {
32+
return this.destroy;
33+
}
34+
35+
/**
36+
* {@return whether the entity should be saved after being removed}
37+
*/
38+
public boolean shouldSave() {
39+
return this.save;
40+
}
41+
}

paper-api/src/main/java/org/bukkit/entity/Entity.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.UUID;
66
import io.papermc.paper.datacomponent.DataComponentView;
77
import io.papermc.paper.entity.LookAnchor;
8+
import io.papermc.paper.entity.RemovalReason;
89
import net.kyori.adventure.util.TriState;
910
import org.bukkit.Chunk; // Paper
1011
import org.bukkit.EntityEffect;
@@ -424,6 +425,16 @@ final class Holder {
424425
*/
425426
public void remove();
426427

428+
/**
429+
* {@return true if it was removed by a plugin}
430+
*/
431+
boolean isPluginRemoved();
432+
433+
/**
434+
* {@return the reason this entity was removed}
435+
*/
436+
@Nullable RemovalReason getRemovalReason();
437+
427438
/**
428439
* Returns true if this entity has been marked for removal.
429440
*

paper-generator/src/main/java/io/papermc/generator/Rewriters.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.papermc.generator.utils.Formatting;
2525
import io.papermc.paper.datacomponent.item.consumable.ItemUseAnimation;
2626
import io.papermc.paper.dialog.Dialog;
27+
import io.papermc.paper.entity.RemovalReason;
2728
import io.papermc.typewriter.preset.EnumCloneRewriter;
2829
import io.papermc.typewriter.preset.model.EnumValue;
2930
import io.papermc.typewriter.replace.SearchMetadata;
@@ -102,6 +103,12 @@ private static void bootstrapApi(PatternSourceSetRewriter sourceSet) {
102103
sourceSet
103104
.register("PotionType", PotionType.class, new EnumRegistryRewriter<>(Registries.POTION))
104105
.register("EntityType", EntityType.class, new EntityTypeRewriter())
106+
.register("RemovalReason", RemovalReason.class, new EnumCloneRewriter<>(net.minecraft.world.entity.Entity.RemovalReason.class) {
107+
@Override
108+
protected EnumValue.Builder rewriteEnumValue(net.minecraft.world.entity.Entity.RemovalReason reason) {
109+
return super.rewriteEnumValue(reason).arguments(Boolean.toString(reason.shouldDestroy()), Boolean.toString(reason.shouldSave()));
110+
}
111+
})
105112
.register("DisplaySlot", DisplaySlot.class, new EnumCloneRewriter<>(net.minecraft.world.scores.DisplaySlot.class) {
106113
@Override
107114
protected EnumValue.Builder rewriteEnumValue(net.minecraft.world.scores.DisplaySlot slot) {

paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.google.common.collect.Lists;
88
import com.mojang.logging.LogUtils;
99
import io.papermc.paper.datacomponent.DataComponentType;
10+
import io.papermc.paper.entity.RemovalReason;
1011
import io.papermc.paper.entity.TeleportFlag;
1112
import java.util.HashSet;
1213
import java.util.List;
@@ -469,6 +470,17 @@ public void remove() {
469470
this.entity.discard(this.getHandle().generation ? null : EntityRemoveEvent.Cause.PLUGIN);
470471
}
471472

473+
@Override
474+
public boolean isPluginRemoved() {
475+
return this.entity.pluginRemoved;
476+
}
477+
478+
@Override
479+
public @Nullable RemovalReason getRemovalReason() {
480+
if (this.entity.removalReason == null) return null;
481+
return RemovalReason.valueOf(this.entity.removalReason.name());
482+
}
483+
472484
@Override
473485
public boolean isDead() {
474486
return !this.entity.isAlive();

0 commit comments

Comments
 (0)