aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0808-Add-Shearable-API.patch
blob: ca10e1a4d28c22a9946567145b6272cccdc3830c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Sun, 17 Oct 2021 15:39:48 -0400
Subject: [PATCH] Add Shearable API


diff --git a/src/main/java/io/papermc/paper/entity/PaperShearable.java b/src/main/java/io/papermc/paper/entity/PaperShearable.java
new file mode 100644
index 0000000000000000000000000000000000000000..bcf254e3c81cf1e401bddc850fb24ad29dcc127c
--- /dev/null
+++ b/src/main/java/io/papermc/paper/entity/PaperShearable.java
@@ -0,0 +1,21 @@
+package io.papermc.paper.entity;
+
+import io.papermc.paper.adventure.PaperAdventure;
+import net.kyori.adventure.sound.Sound;
+import net.minecraft.world.entity.Shearable;
+import org.jetbrains.annotations.NotNull;
+
+public interface PaperShearable extends io.papermc.paper.entity.Shearable {
+
+    Shearable getHandle();
+
+    @Override
+    default boolean readyToBeSheared() {
+        return this.getHandle().readyForShearing();
+    }
+
+    @Override
+    default void shear(@NotNull Sound.Source source) {
+        this.getHandle().shear(PaperAdventure.asVanilla(source));
+    }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java
index 0139e85c0751564bb4d2847b7b2e48f75fee9e53..e8e4704304504e69c7964dcd4df8ce5db9e92bf6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBogged.java
@@ -4,7 +4,7 @@ import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.Bogged;
 import org.bukkit.entity.Skeleton;
 
-public class CraftBogged extends CraftAbstractSkeleton implements Bogged {
+public class CraftBogged extends CraftAbstractSkeleton implements Bogged, io.papermc.paper.entity.PaperShearable { // Paper - Shear API
 
     public CraftBogged(CraftServer server, net.minecraft.world.entity.monster.Bogged entity) {
         super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
index 986f7b18112ef183de3bbff269a92bf6ac945477..5ac263889ff9cc4f4f6365ccb57917a23ad6edc1 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
@@ -14,7 +14,7 @@ import org.bukkit.entity.MushroomCow;
 import org.bukkit.potion.PotionEffect;
 import org.bukkit.potion.PotionEffectType;
 
-public class CraftMushroomCow extends CraftCow implements MushroomCow {
+public class CraftMushroomCow extends CraftCow implements MushroomCow, io.papermc.paper.entity.PaperShearable { // Paper
     public CraftMushroomCow(CraftServer server, net.minecraft.world.entity.animal.MushroomCow entity) {
         super(server, entity);
     }
@@ -105,4 +105,16 @@ public class CraftMushroomCow extends CraftCow implements MushroomCow {
     public String toString() {
         return "CraftMushroomCow";
     }
+
+    // Paper start
+    @Override
+    public void setSheared(boolean sheared) {
+        if (sheared) this.shear();
+    }
+
+    @Override
+    public boolean isSheared() {
+        return false;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java
index 030bf7b6312799231d0b614ba5c84fec23c276e3..37291d7ad9fdf0fe78894f82a418f40bb581f58b 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java
@@ -4,7 +4,7 @@ import org.bukkit.DyeColor;
 import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.Sheep;
 
-public class CraftSheep extends CraftAnimals implements Sheep {
+public class CraftSheep extends CraftAnimals implements Sheep, io.papermc.paper.entity.PaperShearable { // Paper
     public CraftSheep(CraftServer server, net.minecraft.world.entity.animal.Sheep entity) {
         super(server, entity);
     }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
index 1e9807b8f468742d208f817e22d7625106fc1b58..05cee4906169425ee6e80cf1302f2fa01f09d58f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSnowman.java
@@ -4,7 +4,7 @@ import net.minecraft.world.entity.animal.SnowGolem;
 import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.Snowman;
 
-public class CraftSnowman extends CraftGolem implements Snowman, com.destroystokyo.paper.entity.CraftRangedEntity<SnowGolem> { // Paper
+public class CraftSnowman extends CraftGolem implements Snowman, com.destroystokyo.paper.entity.CraftRangedEntity<SnowGolem>, io.papermc.paper.entity.PaperShearable { // Paper
     public CraftSnowman(CraftServer server, SnowGolem entity) {
         super(server, entity);
     }
@@ -28,4 +28,16 @@ public class CraftSnowman extends CraftGolem implements Snowman, com.destroystok
     public String toString() {
         return "CraftSnowman";
     }
+
+    // Paper start
+    @Override
+    public void setSheared(boolean sheared) {
+        this.setDerp(sheared);
+    }
+    
+    @Override
+    public boolean isSheared() {
+        return this.isDerp();
+    }
+    // Paper end
 }
diff --git a/src/test/java/io/papermc/paper/entity/ShearableTest.java b/src/test/java/io/papermc/paper/entity/ShearableTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc8010c5fa0027d45d3c10d67e20631951714c40
--- /dev/null
+++ b/src/test/java/io/papermc/paper/entity/ShearableTest.java
@@ -0,0 +1,28 @@
+package io.papermc.paper.entity;
+
+import com.destroystokyo.paper.entity.ai.MobGoalHelper;
+import io.github.classgraph.ClassGraph;
+import io.github.classgraph.ScanResult;
+import java.util.List;
+import net.minecraft.world.entity.Mob;
+import net.minecraft.world.entity.Shearable;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class ShearableTest {
+
+    static List<Class<Shearable>> nmsShearables() {
+        try (final ScanResult result = new ClassGraph().enableClassInfo().whitelistPackages("net.minecraft.world.entity").scan()) {
+            return result.getClassesImplementing(Shearable.class.getName()).loadClasses(Shearable.class);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @ParameterizedTest
+    @MethodSource("nmsShearables")
+    void ensureImplementsShearable(final Class<? extends Shearable> shearableNmsClass) {
+        final Class<? extends org.bukkit.entity.Mob> bukkitClass = MobGoalHelper.toBukkitClass((Class<? extends Mob>) shearableNmsClass);
+        Assertions.assertTrue(io.papermc.paper.entity.Shearable.class.isAssignableFrom(bukkitClass), bukkitClass.getName() + " does not implement Shearable");
+    }
+}