Skip to content

Commit 57dd822

Browse files
authored
Leashable API (#10961)
1 parent 2e82fd2 commit 57dd822

File tree

3 files changed

+248
-0
lines changed

3 files changed

+248
-0
lines changed

patches/api/0053-Fix-upstream-javadocs.patch

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,19 @@ index b688b3856cb3068a539fcecfbfa113f8ab4160a9..c275b881cbd11307a6dcc7190d7a7d40
444444
*
445445
* @return whether the item frame is visible or not
446446
*/
447+
diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
448+
index 32e89741ffd895e31af0104a0126c2f72742a1bb..bc17c86da49faf4b6e07d4fb4c53649da0384d69 100644
449+
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
450+
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
451+
@@ -502,7 +502,7 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
452+
/**
453+
* Sets the leash on this entity to be held by the supplied entity.
454+
* <p>
455+
- * This method has no effect on EnderDragons, Withers, Players, or Bats.
456+
+ * This method has no effect on players.
457+
* Non-living entities excluding leashes will not persist as leash
458+
* holders.
459+
*
447460
diff --git a/src/main/java/org/bukkit/entity/Mob.java b/src/main/java/org/bukkit/entity/Mob.java
448461
index f3f62e13cc1b6172808c52f2d5f520f1f584e6db..ad5dbf310fe7b34c997bb339f09697222f862005 100644
449462
--- a/src/main/java/org/bukkit/entity/Mob.java

patches/api/0485-Leashable-API.patch

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
3+
Date: Sat, 22 Jun 2024 21:11:58 +0200
4+
Subject: [PATCH] Leashable API
5+
6+
7+
diff --git a/src/main/java/io/papermc/paper/entity/Leashable.java b/src/main/java/io/papermc/paper/entity/Leashable.java
8+
new file mode 100644
9+
index 0000000000000000000000000000000000000000..7402bab20db0ebcac5b2d492ad002ecf9669caad
10+
--- /dev/null
11+
+++ b/src/main/java/io/papermc/paper/entity/Leashable.java
12+
@@ -0,0 +1,36 @@
13+
+package io.papermc.paper.entity;
14+
+
15+
+import org.bukkit.entity.Entity;
16+
+import org.checkerframework.checker.nullness.qual.NonNull;
17+
+import org.checkerframework.checker.nullness.qual.Nullable;
18+
+
19+
+/**
20+
+ * Represents an entity that can be leashed.
21+
+ */
22+
+public interface Leashable extends Entity {
23+
+
24+
+ /**
25+
+ * Returns whether the entity is currently leashed.
26+
+ *
27+
+ * @return whether the entity is leashed
28+
+ */
29+
+ boolean isLeashed();
30+
+
31+
+ /**
32+
+ * Gets the entity that is currently leading this entity.
33+
+ *
34+
+ * @return the entity holding the leash
35+
+ * @throws IllegalStateException if not currently leashed
36+
+ */
37+
+ @NonNull Entity getLeashHolder() throws IllegalStateException;
38+
+
39+
+ /**
40+
+ * Sets the leash on this entity to be held by the supplied entity.
41+
+ * <p>
42+
+ * This method has no effect on players.
43+
+ *
44+
+ * @param holder the entity to leash this entity to, or {@code null} to unleash
45+
+ * @return whether the operation was successful
46+
+ */
47+
+ boolean setLeashHolder(@Nullable Entity holder);
48+
+}
49+
diff --git a/src/main/java/org/bukkit/entity/Boat.java b/src/main/java/org/bukkit/entity/Boat.java
50+
index 2ac685fb1817f3ce06ebe6391cc863712d68367c..d80524fe32672a8b8940d1028abf22026dace8d2 100644
51+
--- a/src/main/java/org/bukkit/entity/Boat.java
52+
+++ b/src/main/java/org/bukkit/entity/Boat.java
53+
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull;
54+
/**
55+
* Represents a boat entity.
56+
*/
57+
-public interface Boat extends Vehicle {
58+
+public interface Boat extends Vehicle, io.papermc.paper.entity.Leashable { // Paper - Leashable API
59+
60+
/**
61+
* Gets the wood type of the boat.
62+
diff --git a/src/main/java/org/bukkit/entity/Mob.java b/src/main/java/org/bukkit/entity/Mob.java
63+
index 256e5645bcfa76e7ede58ae365e69b4a4bed6204..9a10262a952e330f42187d6e4edab5a225bfba62 100644
64+
--- a/src/main/java/org/bukkit/entity/Mob.java
65+
+++ b/src/main/java/org/bukkit/entity/Mob.java
66+
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.Nullable;
67+
/**
68+
* Represents a Mob. Mobs are living entities with simple AI.
69+
*/
70+
-public interface Mob extends LivingEntity, Lootable {
71+
+public interface Mob extends LivingEntity, Lootable, io.papermc.paper.entity.Leashable { // Paper - Leashable API
72+
73+
// Paper start
74+
@Override
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
3+
Date: Sat, 22 Jun 2024 21:17:54 +0200
4+
Subject: [PATCH] Leashable API
5+
6+
7+
diff --git a/src/main/java/io/papermc/paper/entity/PaperLeashable.java b/src/main/java/io/papermc/paper/entity/PaperLeashable.java
8+
new file mode 100644
9+
index 0000000000000000000000000000000000000000..a9ddf9a4a07cd29833f38d7e5f42b2b14ec98f78
10+
--- /dev/null
11+
+++ b/src/main/java/io/papermc/paper/entity/PaperLeashable.java
12+
@@ -0,0 +1,50 @@
13+
+package io.papermc.paper.entity;
14+
+
15+
+import com.google.common.base.Preconditions;
16+
+import net.minecraft.world.entity.Leashable;
17+
+import org.bukkit.craftbukkit.entity.CraftEntity;
18+
+import org.bukkit.entity.Entity;
19+
+
20+
+public interface PaperLeashable extends io.papermc.paper.entity.Leashable {
21+
+
22+
+ Leashable getHandle();
23+
+
24+
+ @Override
25+
+ default boolean isLeashed() {
26+
+ return this.getHandle().getLeashHolder() != null;
27+
+ }
28+
+
29+
+ @Override
30+
+ default Entity getLeashHolder() throws IllegalStateException {
31+
+ Preconditions.checkState(this.isLeashed(), "Entity not leashed");
32+
+ return this.getHandle().getLeashHolder().getBukkitEntity();
33+
+ }
34+
+
35+
+ private boolean unleash() {
36+
+ if (!this.isLeashed()) {
37+
+ return false;
38+
+ }
39+
+
40+
+ this.getHandle().dropLeash(true, false);
41+
+ return true;
42+
+ }
43+
+
44+
+ @Override
45+
+ default boolean setLeashHolder(Entity holder) {
46+
+ if (this.getHandle() instanceof net.minecraft.world.entity.Entity entity && entity.generation) {
47+
+ return false;
48+
+ }
49+
+
50+
+ if (holder == null) {
51+
+ return this.unleash();
52+
+ }
53+
+
54+
+ if (holder.isDead()) {
55+
+ return false;
56+
+ }
57+
+
58+
+ this.unleash();
59+
+ this.getHandle().setLeashedTo(((CraftEntity) holder).getHandle(), true);
60+
+ return true;
61+
+ }
62+
+}
63+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java
64+
index e33b1b6fd50a4eea57500cc00dba20d6edcab75d..01a9660de65688b7c1a4f9dafcb650774ce1853b 100644
65+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java
66+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBoat.java
67+
@@ -7,7 +7,7 @@ import org.bukkit.craftbukkit.CraftServer;
68+
import org.bukkit.entity.Boat;
69+
import org.bukkit.entity.Entity;
70+
71+
-public class CraftBoat extends CraftVehicle implements Boat {
72+
+public class CraftBoat extends CraftVehicle implements Boat, io.papermc.paper.entity.PaperLeashable { // Paper - Leashable API
73+
74+
public CraftBoat(CraftServer server, net.minecraft.world.entity.vehicle.Boat entity) {
75+
super(server, entity);
76+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
77+
index d2bb0831394c03b620b2cbd8306cb82b621f34f7..beb6ad312028adb14053e3f019a4fcf6c9149373 100644
78+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
79+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
80+
@@ -753,43 +753,17 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
81+
82+
@Override
83+
public boolean isLeashed() {
84+
- if (!(this.getHandle() instanceof Mob)) {
85+
- return false;
86+
- }
87+
- return ((Mob) this.getHandle()).getLeashHolder() != null;
88+
+ return false; // Paper - implement in CraftMob & PaperLeashable
89+
}
90+
91+
@Override
92+
public Entity getLeashHolder() throws IllegalStateException {
93+
- Preconditions.checkState(this.isLeashed(), "Entity not leashed");
94+
- return ((Mob) this.getHandle()).getLeashHolder().getBukkitEntity();
95+
- }
96+
-
97+
- private boolean unleash() {
98+
- if (!this.isLeashed()) {
99+
- return false;
100+
- }
101+
- ((Mob) this.getHandle()).dropLeash(true, false);
102+
- return true;
103+
+ throw new IllegalStateException("Entity not leashed"); // Paper - implement in CraftMob & PaperLeashable
104+
}
105+
106+
@Override
107+
public boolean setLeashHolder(Entity holder) {
108+
- if (this.getHandle().generation || (this.getHandle() instanceof WitherBoss) || !(this.getHandle() instanceof Mob)) {
109+
- return false;
110+
- }
111+
-
112+
- if (holder == null) {
113+
- return this.unleash();
114+
- }
115+
-
116+
- if (holder.isDead()) {
117+
- return false;
118+
- }
119+
-
120+
- this.unleash();
121+
- ((Mob) this.getHandle()).setLeashedTo(((CraftEntity) holder).getHandle(), true);
122+
- return true;
123+
+ return false; // Paper - implement in CraftMob & PaperLeashable
124+
}
125+
126+
@Override
127+
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
128+
index deb66c04abefb4a88521483db1612e494bd27164..5f9f7e325e3e0276f7a475c4a4725cc0e1b54afd 100644
129+
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
130+
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
131+
@@ -11,7 +11,7 @@ import org.bukkit.entity.LivingEntity;
132+
import org.bukkit.entity.Mob;
133+
import org.bukkit.loot.LootTable;
134+
135+
-public abstract class CraftMob extends CraftLivingEntity implements Mob {
136+
+public abstract class CraftMob extends CraftLivingEntity implements Mob, io.papermc.paper.entity.PaperLeashable { // Paper - Leashable API
137+
public CraftMob(CraftServer server, net.minecraft.world.entity.Mob entity) {
138+
super(server, entity);
139+
paperPathfinder = new com.destroystokyo.paper.entity.PaperPathfinder(entity); // Paper - Mob Pathfinding API
140+
@@ -175,4 +175,21 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob {
141+
return getHandle().getExperienceReward((ServerLevel) this.getHandle().level(), null);
142+
}
143+
// Paper end
144+
+
145+
+ // Paper start - Leashable API
146+
+ @Override
147+
+ public boolean isLeashed() {
148+
+ return io.papermc.paper.entity.PaperLeashable.super.isLeashed();
149+
+ }
150+
+
151+
+ @Override
152+
+ public org.bukkit.entity.Entity getLeashHolder() throws IllegalStateException {
153+
+ return io.papermc.paper.entity.PaperLeashable.super.getLeashHolder();
154+
+ }
155+
+
156+
+ @Override
157+
+ public boolean setLeashHolder(final org.bukkit.entity.Entity holder) {
158+
+ return io.papermc.paper.entity.PaperLeashable.super.setLeashHolder(holder);
159+
+ }
160+
+ // Paper end - Leashable API
161+
}

0 commit comments

Comments
 (0)