aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0621-Missing-Entity-API.patch
blob: 504bdae7401d26d344167d088ebc86e0ef98b197 (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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com>
Date: Mon, 21 Jun 2021 23:56:07 -0400
Subject: [PATCH] Missing Entity API

== AT ==
public net.minecraft.world.entity.animal.Fox isDefending()Z
public net.minecraft.world.entity.animal.Fox setDefending(Z)V
public net.minecraft.world.entity.animal.Fox setFaceplanted(Z)V
public net.minecraft.world.entity.animal.Panda getEatCounter()I
public net.minecraft.world.entity.animal.Panda setEatCounter(I)V
public net.minecraft.world.entity.animal.Bee isRolling()Z
public net.minecraft.world.entity.animal.Bee setRolling(Z)V
public net.minecraft.world.entity.animal.Bee numCropsGrownSincePollination
public net.minecraft.world.entity.animal.Bee ticksWithoutNectarSinceExitingHive
public net.minecraft.world.entity.monster.piglin.Piglin isChargingCrossbow()Z
public net.minecraft.world.entity.ambient.Bat targetPosition
public net.minecraft.world.entity.monster.Ravager attackTick
public net.minecraft.world.entity.monster.Ravager stunnedTick
public net.minecraft.world.entity.monster.Ravager roarTick
public net.minecraft.world.entity.vehicle.MinecartTNT explode(D)V
public net.minecraft.world.entity.vehicle.MinecartTNT fuse
public net.minecraft.world.entity.monster.Endermite life
public net.minecraft.world.entity.projectile.AbstractArrow soundEvent
public net.minecraft.world.entity.monster.Phantom anchorPoint
public net.minecraft.world.entity.npc.WanderingTrader getWanderTarget()Lnet/minecraft/core/BlockPos;
public net.minecraft.world.entity.animal.AbstractSchoolingFish leader
public net.minecraft.world.entity.animal.AbstractSchoolingFish schoolSize
public net.minecraft.world.entity.animal.Rabbit moreCarrotTicks
public net.minecraft.world.entity.AreaEffectCloud ownerUUID
public net.minecraft.world.entity.animal.MushroomCow stewEffects

Co-authored-by: Nassim Jahnke <nassim@njahnke.dev>
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
Co-authored-by: William Blake Galbreath <blake.galbreath@gmail.com>
Co-authored-by: SoSeDiK <mrsosedik@gmail.com>
Co-authored-by: booky10 <boooky10@gmail.com>
Co-authored-by: Amin <amin.haddou@frg.wwschool.de>

diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
index 5fb56067221434aa80e626437ed10f65bf416e4f..cfe6a6f6bcfd7a3b29ab25f5a6745d31c18f338d 100644
--- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
+++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
@@ -165,7 +165,7 @@ public class MobGoalHelper {
         bukkitMap.put(net.minecraft.world.entity.monster.Endermite.class, Endermite.class);
         bukkitMap.put(net.minecraft.world.entity.monster.Evoker.class, Evoker.class);
         bukkitMap.put(AbstractFish.class, Fish.class);
-        bukkitMap.put(AbstractSchoolingFish.class, Fish.class); // close enough
+        bukkitMap.put(AbstractSchoolingFish.class, io.papermc.paper.entity.SchoolableFish.class);
         bukkitMap.put(FlyingMob.class, Flying.class);
         bukkitMap.put(net.minecraft.world.entity.animal.Fox.class, Fox.class);
         bukkitMap.put(net.minecraft.world.entity.monster.Ghast.class, Ghast.class);
diff --git a/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java b/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java
new file mode 100644
index 0000000000000000000000000000000000000000..41bf71d116ffc5431586ce54abba7f8def6c1dcf
--- /dev/null
+++ b/src/main/java/io/papermc/paper/entity/PaperSchoolableFish.java
@@ -0,0 +1,52 @@
+package io.papermc.paper.entity;
+
+import net.minecraft.world.entity.animal.AbstractSchoolingFish;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.entity.CraftFish;
+import org.jetbrains.annotations.NotNull;
+
+public class PaperSchoolableFish extends CraftFish implements SchoolableFish {
+
+    public PaperSchoolableFish(CraftServer server, AbstractSchoolingFish entity) {
+        super(server, entity);
+    }
+
+    @Override
+    public AbstractSchoolingFish getHandle() {
+        return (AbstractSchoolingFish) super.getHandle();
+    }
+
+    @Override
+    public void startFollowing(@NotNull SchoolableFish fish) {
+        if (this.getHandle().isFollower()) { // If following a fish already, properly remove the old one
+            this.stopFollowing();
+        }
+
+        this.getHandle().startFollowing(((PaperSchoolableFish) fish).getHandle());
+    }
+
+    @Override
+    public void stopFollowing() {
+        this.getHandle().stopFollowing();
+    }
+
+    @Override
+    public int getSchoolSize() {
+        return this.getHandle().schoolSize;
+    }
+
+    @Override
+    public int getMaxSchoolSize() {
+        return this.getHandle().getMaxSchoolSize();
+    }
+
+    @Override
+    public SchoolableFish getSchoolLeader() {
+        AbstractSchoolingFish leader = this.getHandle().leader;
+        if (leader == null) {
+            return null;
+        }
+
+        return (SchoolableFish) leader.getBukkitEntity();
+    }
+}
diff --git a/src/main/java/net/minecraft/world/entity/animal/AbstractSchoolingFish.java b/src/main/java/net/minecraft/world/entity/animal/AbstractSchoolingFish.java
index 39ed3ca76d6b64ef3917280ec822721cc02afada..86b437836cb4b1f6e8ca9acd5f1f93b925cf9e51 100644
--- a/src/main/java/net/minecraft/world/entity/animal/AbstractSchoolingFish.java
+++ b/src/main/java/net/minecraft/world/entity/animal/AbstractSchoolingFish.java
@@ -52,6 +52,7 @@ public abstract class AbstractSchoolingFish extends AbstractFish {
     }
 
     public void stopFollowing() {
+        if (this.leader == null) return; // Avoid NPE, plugins can now set the leader and certain fish goals might cause this method to be called
         this.leader.removeFollower();
         this.leader = null;
     }
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
index c6235be64d6fb234734dd816052695ac44aea3ae..c534589762b1361bae7c446dfec8dbbf542485fb 100644
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
@@ -553,11 +553,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
         this.setFlag(4, hasStung);
     }
 
+    public net.kyori.adventure.util.TriState rollingOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Rolling override
     public boolean isRolling() {
         return this.getFlag(2);
     }
 
     public void setRolling(boolean nearTarget) {
+        nearTarget = rollingOverride.toBooleanOrElse(nearTarget); // Paper - Rolling override
         this.setFlag(2, nearTarget);
     }
 
diff --git a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
index 52cc265f1663d648b6bfd03f2ac3e191b1c16d44..e42b0b19019ef74733fd19b08f882cccff920142 100644
--- a/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
+++ b/src/main/java/net/minecraft/world/entity/animal/MushroomCow.java
@@ -55,7 +55,7 @@ public class MushroomCow extends Cow implements Shearable, VariantHolder<Mushroo
     private static final int MUTATE_CHANCE = 1024;
     private static final String TAG_STEW_EFFECTS = "stew_effects";
     @Nullable
-    private List<SuspiciousEffectHolder.EffectEntry> stewEffects;
+    public List<SuspiciousEffectHolder.EffectEntry> stewEffects; // Paper - private -> public (AT does not seem to work for this field)
     @Nullable
     private UUID lastLightningBoltUUID;
 
diff --git a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
index 71a08510a928d4570822282bb31f14013ec3834a..4aeab90e778629c355189dfe79c39c4b21f5f5ac 100644
--- a/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
+++ b/src/main/java/net/minecraft/world/entity/animal/frog/Tadpole.java
@@ -44,6 +44,7 @@ public class Tadpole extends AbstractFish {
     public int age;
     protected static final ImmutableList<SensorType<? extends Sensor<? super Tadpole>>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.HURT_BY, SensorType.FROG_TEMPTATIONS);
     protected static final ImmutableList<MemoryModuleType<?>> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.PATH, MemoryModuleType.NEAREST_VISIBLE_ADULT, MemoryModuleType.TEMPTATION_COOLDOWN_TICKS, MemoryModuleType.IS_TEMPTED, MemoryModuleType.TEMPTING_PLAYER, MemoryModuleType.BREED_TARGET, MemoryModuleType.IS_PANICKING);
+    public boolean ageLocked; // Paper
 
     public Tadpole(EntityType<? extends AbstractFish> type, Level world) {
         super(type, world);
@@ -94,7 +95,7 @@ public class Tadpole extends AbstractFish {
     @Override
     public void aiStep() {
         super.aiStep();
-        if (!this.level().isClientSide) {
+        if (!this.level().isClientSide && !this.ageLocked) { // Paper
             this.setAge(this.age + 1);
         }
 
@@ -104,12 +105,14 @@ public class Tadpole extends AbstractFish {
     public void addAdditionalSaveData(CompoundTag nbt) {
         super.addAdditionalSaveData(nbt);
         nbt.putInt("Age", this.age);
+        nbt.putBoolean("AgeLocked", this.ageLocked); // Paper
     }
 
     @Override
     public void readAdditionalSaveData(CompoundTag nbt) {
         super.readAdditionalSaveData(nbt);
         this.setAge(nbt.getInt("Age"));
+        this.ageLocked = nbt.getBoolean("AgeLocked"); // Paper
     }
 
     @Nullable
@@ -162,6 +165,7 @@ public class Tadpole extends AbstractFish {
         CompoundTag nbttagcompound = stack.getOrCreateTag();
 
         nbttagcompound.putInt("Age", this.getAge());
+        nbttagcompound.putBoolean("AgeLocked", this.ageLocked); // Paper
     }
 
     @Override
@@ -171,6 +175,7 @@ public class Tadpole extends AbstractFish {
             this.setAge(nbt.getInt("Age"));
         }
 
+        this.ageLocked = nbt.getBoolean("AgeLocked"); // Paper
     }
 
     @Override
@@ -205,6 +210,7 @@ public class Tadpole extends AbstractFish {
     }
 
     private void ageUp(int seconds) {
+        if (this.ageLocked) return; // Paper
         this.setAge(this.age + seconds * 20);
     }
 
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
index a13a1725356ca4430f1f0a6d121fc08679de62db..bd0165d9ca52665a52fbd9678ed895bf4bed2fe7 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
@@ -695,6 +695,15 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
 
     }
 
+    // Paper Start - Horse API
+    public void setMouthOpen(boolean open) {
+        this.setFlag(FLAG_OPEN_MOUTH, open);
+    }
+    public boolean isMouthOpen() {
+        return this.getFlag(FLAG_OPEN_MOUTH);
+    }
+    // Paper End - Horse API
+
     @Override
     public InteractionResult mobInteract(Player player, InteractionHand hand) {
         if (!this.isVehicle() && !this.isBaby()) {
@@ -737,6 +746,11 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
         this.setFlag(16, eatingGrass);
     }
 
+    // Paper Start - Horse API
+    public void setForceStanding(boolean standing) {
+        this.setFlag(FLAG_STANDING, standing);
+    }
+    // Paper End - Horse API
     public void setStanding(boolean angry) {
         if (angry) {
             this.setEating(false);
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
index edbb933d1f6f7fc6432f7a8b074c5dc20f47adfb..91fb62807b3c5600c83d4dc8d3fadf36e94e2133 100644
--- a/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/Llama.java
@@ -74,7 +74,7 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V
     @Nullable
     private Llama caravanHead;
     @Nullable
-    private Llama caravanTail;
+    public Llama caravanTail; // Paper
 
     public Llama(EntityType<? extends Llama> type, Level world) {
         super(type, world);
diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
index c23f05f0d951e0036fe2cf524989747fe236730b..cd59500565a305757872aaf41b03b49ffc005af5 100644
--- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
+++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java
@@ -84,6 +84,11 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
         return entityliving.getMobType() != MobType.UNDEAD && entityliving.attackable();
     };
     private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0D).selector(WitherBoss.LIVING_ENTITY_SELECTOR);
+    // Paper start
+    private boolean canPortal = false;
+
+    public void setCanTravelThroughPortals(boolean canPortal) { this.canPortal = canPortal; }
+    // Paper end
 
     public WitherBoss(EntityType<? extends WitherBoss> type, Level world) {
         super(type, world);
@@ -595,7 +600,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob
 
     @Override
     public boolean canChangeDimensions() {
-        return false;
+        return super.canChangeDimensions() && canPortal; // Paper
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
index 8e72958dec9d4eb35330b72e057733a268e83745..decd59f7104ba26145e2150c3b8e5e0404d31885 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java
@@ -457,6 +457,16 @@ public class EnderMan extends Monster implements NeutralMob {
         this.entityData.set(EnderMan.DATA_STARED_AT, true);
     }
 
+    // Paper start
+    public void setCreepy(boolean creepy) {
+        this.entityData.set(EnderMan.DATA_CREEPY, creepy);
+    }
+
+    public void setHasBeenStaredAt(boolean hasBeenStaredAt) {
+        this.entityData.set(EnderMan.DATA_STARED_AT, hasBeenStaredAt);
+    }
+    // Paper end
+
     @Override
     public boolean requiresCustomPersistence() {
         return super.requiresCustomPersistence() || this.getCarriedBlock() != null;
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ghast.java b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
index e398a7d5c560b1d94b21fe3241365ef8592d9fc8..c135bc245f59a1af706f98b9d140dee77016b12f 100644
--- a/src/main/java/net/minecraft/world/entity/monster/Ghast.java
+++ b/src/main/java/net/minecraft/world/entity/monster/Ghast.java
@@ -67,6 +67,12 @@ public class Ghast extends FlyingMob implements Enemy {
         return this.explosionPower;
     }
 
+    // Paper start
+    public void setExplosionPower(int explosionPower) {
+        this.explosionPower = explosionPower;
+    }
+    // Paper end
+
     @Override
     protected boolean shouldDespawnInPeaceful() {
         return true;
diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
index c043f63ff861ccb0194fc8cf102c27af5bcfe491..d4ac3e566b47cfc8688bcc2ab08385b6de4693f8 100644
--- a/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
+++ b/src/main/java/net/minecraft/world/entity/monster/ZombieVillager.java
@@ -201,6 +201,12 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
     }
 
     public void startConverting(@Nullable UUID uuid, int delay) {
+    // Paper start - missing entity behaviour api - converting without entity event
+        this.startConverting(uuid, delay, true);
+    }
+
+    public void startConverting(@Nullable UUID uuid, int delay, boolean broadcastEntityEvent) {
+    // Paper end - missing entity behaviour api - converting without entity event
         this.conversionStarter = uuid;
         this.villagerConversionTime = delay;
         this.getEntityData().set(ZombieVillager.DATA_CONVERTING_ID, true);
@@ -208,7 +214,7 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder {
         this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
         this.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, delay, Math.min(this.level().getDifficulty().getId() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
         // CraftBukkit end
-        this.level().broadcastEntityEvent(this, (byte) 16);
+        if (broadcastEntityEvent) this.level().broadcastEntityEvent(this, (byte) 16); // Paper - missing entity behaviour api - converting without entity event
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
index 2645f52f5071bf57daf584e21a1f5cb6098110a8..cbe8593cecd84f1598649801bebcb46364044eef 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownTrident.java
@@ -98,6 +98,20 @@ public class ThrownTrident extends AbstractArrow {
         return (Boolean) this.entityData.get(ThrownTrident.ID_FOIL);
     }
 
+    // Paper start
+    public void setFoil(boolean foil) {
+        this.entityData.set(ThrownTrident.ID_FOIL, foil);
+    }
+
+    public int getLoyalty() {
+        return this.entityData.get(ThrownTrident.ID_LOYALTY);
+    }
+
+    public void setLoyalty(byte loyalty) {
+        this.entityData.set(ThrownTrident.ID_LOYALTY, loyalty);
+    }
+    // Paper end
+
     @Nullable
     @Override
     protected EntityHitResult findHitEntity(Vec3 currentPosition, Vec3 nextPosition) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
index 50c1d8ee5804d6e44e2dbbd84328dcd46708ea2e..44c08acdbc8316e501d9f25159f712a55d444b17 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java
@@ -861,14 +861,19 @@ public abstract class CraftRegionAccessor implements RegionAccessor {
             } else if (Phantom.class.isAssignableFrom(clazz)) {
                 entity = net.minecraft.world.entity.EntityType.PHANTOM.create(world);
             } else if (Fish.class.isAssignableFrom(clazz)) {
-                if (Cod.class.isAssignableFrom(clazz)) {
-                    entity = net.minecraft.world.entity.EntityType.COD.create(world);
+                // Paper start - Schooling Fish API
+                if (io.papermc.paper.entity.SchoolableFish.class.isAssignableFrom(clazz)) {
+                    if (Cod.class.isAssignableFrom(clazz)) {
+                        entity = net.minecraft.world.entity.EntityType.COD.create(world);
+                    } else if (Salmon.class.isAssignableFrom(clazz)) {
+                        entity = net.minecraft.world.entity.EntityType.SALMON.create(world);
+                    } else if (TropicalFish.class.isAssignableFrom(clazz)) {
+                        entity = net.minecraft.world.entity.EntityType.TROPICAL_FISH.create(world);
+                    }
+                // Paper stop
                 } else if (PufferFish.class.isAssignableFrom(clazz)) {
                     entity = net.minecraft.world.entity.EntityType.PUFFERFISH.create(world);
-                } else if (Salmon.class.isAssignableFrom(clazz)) {
-                    entity = net.minecraft.world.entity.EntityType.SALMON.create(world);
-                } else if (TropicalFish.class.isAssignableFrom(clazz)) {
-                    entity = net.minecraft.world.entity.EntityType.TROPICAL_FISH.create(world);
+                // Paper - remove old fish impl
                 } else if (Tadpole.class.isAssignableFrom(clazz)) {
                     entity = net.minecraft.world.entity.EntityType.TADPOLE.create(world);
                 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
index 264b3fb45c47fbb6be78262838a5c0438860915f..f9cd595ec28f0284d11bae6bfc5bf92d56526ef9 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAbstractHorse.java
@@ -114,4 +114,36 @@ public abstract class CraftAbstractHorse extends CraftAnimals implements Abstrac
     public AbstractHorseInventory getInventory() {
         return new CraftSaddledInventory(getHandle().inventory);
     }
+
+    // Paper start - Horse API
+    @Override
+    public boolean isEatingGrass() {
+        return this.getHandle().isEating();
+    }
+
+    @Override
+    public void setEatingGrass(boolean eating) {
+        this.getHandle().setEating(eating);
+    }
+
+    @Override
+    public boolean isRearing() {
+        return this.getHandle().isStanding();
+    }
+
+    @Override
+    public void setRearing(boolean rearing) {
+        this.getHandle().setForceStanding(rearing);
+    }
+
+    @Override
+    public boolean isEating() {
+        return this.getHandle().isMouthOpen();
+    }
+
+    @Override
+    public void setEating(boolean eating) {
+       this.getHandle().setMouthOpen(eating);
+    }
+    // Paper end - Horse API
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
index 35580198ee9ea566dd2643a707653512c6cd938f..a46b2dfb2f1c0c7c3b55d81fc881e481348f98b8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftAreaEffectCloud.java
@@ -244,4 +244,17 @@ public class CraftAreaEffectCloud extends CraftEntity implements AreaEffectCloud
             this.getHandle().setOwner(null);
         }
     }
+
+    // Paper start - owner API
+    @Override
+    public java.util.UUID getOwnerUniqueId() {
+        return this.getHandle().ownerUUID;
+    }
+
+    @Override
+    public void setOwnerUniqueId(final java.util.UUID ownerUuid) {
+        this.getHandle().setOwner(null);
+        this.getHandle().ownerUUID = ownerUuid;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java
index b0a3531476f5a05ae846b68d825eddc35ebddea9..1bb72f28085f3885bec068b586ec222111044884 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBat.java
@@ -27,4 +27,25 @@ public class CraftBat extends CraftAmbient implements Bat {
     public void setAwake(boolean state) {
         this.getHandle().setResting(!state);
     }
+    // Paper start
+    @Override
+    public org.bukkit.Location getTargetLocation() {
+        net.minecraft.core.BlockPos pos = this.getHandle().targetPosition;
+        if (pos == null) {
+            return null;
+        }
+
+        return io.papermc.paper.util.MCUtil.toLocation(this.getHandle().level(), pos);
+    }
+
+    @Override
+    public void setTargetLocation(org.bukkit.Location location) {
+        net.minecraft.core.BlockPos pos = null;
+        if (location != null) {
+            pos = io.papermc.paper.util.MCUtil.toBlockPosition(location);
+        }
+
+        this.getHandle().targetPosition = pos;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
index cfff1be6a4a4936a2dadb2590abc3d33c123d048..3dac93b0ab5d5acf5b33dc4b0efed60319eb657b 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftBee.java
@@ -86,4 +86,42 @@ public class CraftBee extends CraftAnimals implements Bee {
     public void setCannotEnterHiveTicks(int ticks) {
         this.getHandle().setStayOutOfHiveCountdown(ticks);
     }
+    // Paper start
+    @Override
+    public void setRollingOverride(net.kyori.adventure.util.TriState rolling) {
+        this.getHandle().rollingOverride = rolling;
+
+        this.getHandle().setRolling(this.getHandle().isRolling()); // Refresh rolling state
+    }
+
+    @Override
+    public boolean isRolling() {
+        return this.getRollingOverride().toBooleanOrElse(this.getHandle().isRolling());
+    }
+
+    @Override
+    public net.kyori.adventure.util.TriState getRollingOverride() {
+        return this.getHandle().rollingOverride;
+    }
+
+    @Override
+    public void setCropsGrownSincePollination(int crops) {
+        this.getHandle().numCropsGrownSincePollination = crops;
+    }
+
+    @Override
+    public int getCropsGrownSincePollination() {
+        return this.getHandle().numCropsGrownSincePollination;
+    }
+
+    @Override
+    public void setTicksSincePollination(int ticks) {
+        this.getHandle().ticksWithoutNectarSinceExitingHive = ticks;
+    }
+
+    @Override
+    public int getTicksSincePollination() {
+        return this.getHandle().ticksWithoutNectarSinceExitingHive;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
index b49d1e5c7389e1c2ccfe3a196b5325e5f5b190e7..0ccc20157fb9fdb9c99b942dcb4675db5f928b23 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCat.java
@@ -66,4 +66,26 @@ public class CraftCat extends CraftTameableAnimal implements Cat {
             return registry.get(CraftNamespacedKey.toMinecraft(bukkit.getKey()));
         }
     }
+
+    // Paper Start - More cat api
+    @Override
+    public void setLyingDown(boolean lyingDown) {
+        this.getHandle().setLying(lyingDown);
+    }
+
+    @Override
+    public boolean isLyingDown() {
+        return this.getHandle().isLying();
+    }
+
+    @Override
+    public void setHeadUp(boolean headUp) {
+        this.getHandle().setRelaxStateOne(headUp);
+    }
+
+    @Override
+    public boolean isHeadUp() {
+        return this.getHandle().isRelaxStateOne();
+    }
+    // Paper End - More cat api
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java
index 64b75682a936e071353707f7615d6ff512fd617d..96f6e2fd9c6b20d34122abfe5c7fba732502d5a0 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftChicken.java
@@ -18,4 +18,26 @@ public class CraftChicken extends CraftAnimals implements Chicken {
     public String toString() {
         return "CraftChicken";
     }
+
+    // Paper start
+    @Override
+    public boolean isChickenJockey() {
+        return this.getHandle().isChickenJockey();
+    }
+
+    @Override
+    public void setIsChickenJockey(boolean isChickenJockey) {
+        this.getHandle().setChickenJockey(isChickenJockey);
+    }
+
+    @Override
+    public int getEggLayTime() {
+        return this.getHandle().eggTime;
+    }
+
+    @Override
+    public void setEggLayTime(int eggLayTime) {
+        this.getHandle().eggTime = eggLayTime;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java
index fa0bf7db880063427ba12df1df1c72240fff93e9..63e6b07e3b159c74d9ef17be20b5ab43d07f0f5f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java
@@ -3,7 +3,7 @@ package org.bukkit.craftbukkit.entity;
 import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.Cod;
 
-public class CraftCod extends CraftFish implements Cod {
+public class CraftCod extends io.papermc.paper.entity.PaperSchoolableFish implements Cod { // Paper - School Fish API
 
     public CraftCod(CraftServer server, net.minecraft.world.entity.animal.Cod entity) {
         super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
index 21dc209e6f98b6306833b41e2763e746047d5a94..983b9d6ddb58eff297e96e5c8b28ec427efa267d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
@@ -40,6 +40,28 @@ public class CraftEnderman extends CraftMonster implements Enderman {
         this.getHandle().setCarriedBlock(blockData == null ? null : ((CraftBlockData) blockData).getState());
     }
 
+    // Paper start
+    @Override
+    public boolean isScreaming() {
+        return this.getHandle().isCreepy();
+    }
+
+    @Override
+    public void setScreaming(boolean screaming) {
+        this.getHandle().setCreepy(screaming);
+    }
+
+    @Override
+    public boolean hasBeenStaredAt() {
+        return this.getHandle().hasBeenStaredAt();
+    }
+
+    @Override
+    public void setHasBeenStaredAt(boolean hasBeenStaredAt) {
+        this.getHandle().setHasBeenStaredAt(hasBeenStaredAt);
+    }
+    // Paper end
+
     @Override
     public EnderMan getHandle() {
         return (EnderMan) this.entity;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java
index fc0f0e841dc974d080e1abb9bbafb5165801131f..d657fd2c507a5b215aeab0a5f3e9c2ee892a27c8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java
@@ -28,4 +28,15 @@ public class CraftEndermite extends CraftMonster implements Endermite {
     public void setPlayerSpawned(boolean playerSpawned) {
         // Nop
     }
+    // Paper start
+    @Override
+    public void setLifetimeTicks(int ticks) {
+        this.getHandle().life = ticks;
+    }
+
+    @Override
+    public int getLifetimeTicks() {
+        return this.getHandle().life;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index 92893d2c9bb921ab40fd8a53300d71fac417eb83..6065336cd30e6400bd8875768f06c44a4be0a1e1 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -237,10 +237,16 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
                     else { return new CraftSquid(server, (Squid) entity); }
                 }
                 else if (entity instanceof AbstractFish) {
-                    if (entity instanceof Cod) { return new CraftCod(server, (Cod) entity); }
+                    // Paper start - Schooling Fish API
+                    if (entity instanceof net.minecraft.world.entity.animal.AbstractSchoolingFish abstractSchoolingFish) {
+                       if (entity instanceof Cod) { return new CraftCod(server, (Cod) entity); }
+                       else if (entity instanceof Salmon) { return new CraftSalmon(server, (Salmon) entity); }
+                       else if (entity instanceof TropicalFish) { return new CraftTropicalFish(server, (TropicalFish) entity); }
+                       else { return new io.papermc.paper.entity.PaperSchoolableFish(server, abstractSchoolingFish); }
+                    }
+                    // Paper end
                     else if (entity instanceof Pufferfish) { return new CraftPufferFish(server, (Pufferfish) entity); }
-                    else if (entity instanceof Salmon) { return new CraftSalmon(server, (Salmon) entity); }
-                    else if (entity instanceof TropicalFish) { return new CraftTropicalFish(server, (TropicalFish) entity); }
+                    // Paper - move fish
                     else if (entity instanceof Tadpole) { return new CraftTadpole(server, (Tadpole) entity); }
                     else { return new CraftFish(server, (AbstractFish) entity); }
                 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
index 17164811bbcf983bef62c47bc99330074762267b..c455deb4fd2a7684bcc01a8212c362a2375c190b 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFox.java
@@ -113,4 +113,41 @@ public class CraftFox extends CraftAnimals implements Fox {
     public boolean isFaceplanted() {
         return this.getHandle().isFaceplanted();
     }
+
+    // Paper start - Add more fox behavior API
+    @Override
+    public void setInterested(boolean interested) {
+        this.getHandle().setIsInterested(interested);
+    }
+
+    @Override
+    public boolean isInterested() {
+        return this.getHandle().isInterested();
+    }
+
+    @Override
+    public void setLeaping(boolean leaping) {
+        this.getHandle().setIsPouncing(leaping);
+    }
+
+    @Override
+    public boolean isLeaping() {
+        return this.getHandle().isPouncing();
+    }
+
+    @Override
+    public void setDefending(boolean defending) {
+        this.getHandle().setDefending(defending);
+    }
+
+    @Override
+    public boolean isDefending() {
+        return this.getHandle().isDefending();
+    }
+
+    @Override
+    public void setFaceplanted(boolean faceplanted) {
+        this.getHandle().setFaceplanted(faceplanted);
+    }
+    // Paper end - Add more fox behavior API
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
index 2cec61a1bb050c1ef81c5fc3d0afafe9ff29d459..97fa4e1e70203194bd939618b2fad92665af6d59 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGhast.java
@@ -28,4 +28,17 @@ public class CraftGhast extends CraftFlying implements Ghast, CraftEnemy {
     public void setCharging(boolean flag) {
         this.getHandle().setCharging(flag);
     }
+
+    // Paper start
+    @Override
+    public int getExplosionPower() {
+        return this.getHandle().getExplosionPower();
+    }
+
+    @Override
+    public void setExplosionPower(int explosionPower) {
+        com.google.common.base.Preconditions.checkArgument(explosionPower >= 0 && explosionPower <= 127, "The explosion power has to be between 0 and 127");
+        this.getHandle().setExplosionPower(explosionPower);
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index 72fd16ad8bc08dd3189e56d504000453a8d5cd92..353d8b35052cb1b2ed10c89f3b062846e0c271f8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -889,6 +889,22 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
         this.getHandle().persistentInvisibility = invisible;
         this.getHandle().setSharedFlag(5, invisible);
     }
+    // Paper start
+    @Override
+    public float getSidewaysMovement() {
+        return this.getHandle().xxa;
+    }
+
+    @Override
+    public float getForwardsMovement() {
+        return this.getHandle().zza;
+    }
+
+    @Override
+    public float getUpwardsMovement() {
+        return this.getHandle().yya;
+    }
+    // Paper end
 
     // Paper start
     @Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
index 9986ac517e11b076a29a8c8e3f480ec286fa5825..0ad16ee7b33582d214dab41eeee378d52c8e38ed 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLlama.java
@@ -58,4 +58,36 @@ public class CraftLlama extends CraftChestedHorse implements Llama, com.destroys
     public String toString() {
         return "CraftLlama";
     }
+
+    // Paper start
+    @Override
+    public boolean inCaravan() {
+        return this.getHandle().inCaravan();
+    }
+
+    @Override
+    public void joinCaravan(@org.jetbrains.annotations.NotNull Llama llama) {
+        this.getHandle().joinCaravan(((CraftLlama) llama).getHandle());
+    }
+
+    @Override
+    public void leaveCaravan() {
+        this.getHandle().leaveCaravan();
+    }
+
+    @Override
+    public boolean hasCaravanTail() {
+        return this.getHandle().hasCaravanTail();
+    }
+
+    @Override
+    public Llama getCaravanHead() {
+        return this.getHandle().getCaravanHead() == null ? null : (Llama) this.getHandle().getCaravanHead().getBukkitEntity();
+    }
+
+    @Override
+    public Llama getCaravanTail() {
+        return this.getHandle().caravanTail == null ? null : (Llama) this.getHandle().caravanTail.getBukkitEntity();
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java
index 17f5684cba9d3ed22d9925d1951520cc4751dfe2..3a3563a1bdbc0d84d973b3a04b50b78b4bc3d379 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartHopper.java
@@ -33,4 +33,20 @@ public final class CraftMinecartHopper extends CraftMinecartContainer implements
     public void setEnabled(boolean enabled) {
         ((MinecartHopper) this.getHandle()).setEnabled(enabled);
     }
+    // Paper start
+    @Override
+    public net.minecraft.world.entity.vehicle.MinecartHopper getHandle() {
+        return (net.minecraft.world.entity.vehicle.MinecartHopper) super.getHandle();
+    }
+
+    @Override
+    public int getPickupCooldown() {
+        throw new UnsupportedOperationException("Hopper minecarts don't have cooldowns");
+    }
+
+    @Override
+    public void setPickupCooldown(int cooldown) {
+        throw new UnsupportedOperationException("Hopper minecarts don't have cooldowns");
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
index 6152f4d3d58f4b598d5bd92dbd7c5428c5ff8bc5..a5d3845acc607f640dace05a85f0089611c7d23a 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMob.java
@@ -148,4 +148,16 @@ public abstract class CraftMob extends CraftLivingEntity implements Mob {
         return getHandle().getMaxHeadXRot();
     }
     // Paper end
+
+    // Paper start
+    @Override
+    public boolean isAggressive() {
+        return this.getHandle().isAggressive();
+    }
+
+    @Override
+    public void setAggressive(boolean aggressive) {
+        this.getHandle().setAggressive(aggressive);
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
index 77cede9c565a3bc404878c9a4028cadc90f6c010..c20f470bec5292dde7fbdbf3a6562ae12117521d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
@@ -27,6 +27,43 @@ public class CraftMushroomCow extends CraftCow implements MushroomCow {
         this.getHandle().setVariant(net.minecraft.world.entity.animal.MushroomCow.MushroomType.values()[variant.ordinal()]);
     }
 
+    // Paper start
+    @Override
+    public java.util.List<io.papermc.paper.potion.SuspiciousEffectEntry> getStewEffects() {
+        if (this.getHandle().stewEffects == null) {
+            return java.util.List.of();
+        }
+
+        java.util.List<io.papermc.paper.potion.SuspiciousEffectEntry> nmsPairs = new java.util.ArrayList<>(this.getHandle().stewEffects.size());
+        for (final net.minecraft.world.level.block.SuspiciousEffectHolder.EffectEntry effect : this.getHandle().stewEffects) {
+            nmsPairs.add(io.papermc.paper.potion.SuspiciousEffectEntry.create(
+                org.bukkit.craftbukkit.potion.CraftPotionEffectType.minecraftToBukkit(effect.effect()),
+                effect.duration()
+            ));
+        }
+
+        return java.util.Collections.unmodifiableList(nmsPairs);
+    }
+
+    @Override
+    public void setStewEffects(final java.util.List<io.papermc.paper.potion.SuspiciousEffectEntry> effects) {
+        if (effects.isEmpty()) {
+            this.getHandle().stewEffects = null;
+            return;
+        }
+
+        java.util.List<net.minecraft.world.level.block.SuspiciousEffectHolder.EffectEntry> nmsPairs = new java.util.ArrayList<>(effects.size());
+        for (final io.papermc.paper.potion.SuspiciousEffectEntry effect : effects) {
+            nmsPairs.add(new net.minecraft.world.level.block.SuspiciousEffectHolder.EffectEntry(
+                org.bukkit.craftbukkit.potion.CraftPotionEffectType.bukkitToMinecraft(effect.effect()),
+                effect.duration()
+            ));
+        }
+
+        this.getHandle().stewEffects = nmsPairs;
+    }
+    // Paper end
+
     @Override
     public String toString() {
         return "CraftMushroomCow";
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
index 5467e4a74b70ff57b49d9e6bc686c493178f8511..01d104d91de9e1319d27e39d3f474318c7809486 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPanda.java
@@ -41,6 +41,38 @@ public class CraftPanda extends CraftAnimals implements Panda {
         this.getHandle().setHiddenGene(CraftPanda.toNms(gene));
     }
 
+    // Paper start - Panda API
+    @Override
+    public void setSneezeTicks(int ticks) {
+        this.getHandle().setSneezeCounter(ticks);
+    }
+
+    @Override
+    public int getSneezeTicks() {
+        return this.getHandle().getSneezeCounter();
+    }
+
+    @Override
+    public void setEatingTicks(int ticks) {
+        this.getHandle().setEatCounter(ticks);
+    }
+
+    @Override
+    public int getEatingTicks() {
+        return this.getHandle().getEatCounter();
+    }
+
+    @Override
+    public void setUnhappyTicks(int ticks) {
+        this.getHandle().setUnhappyCounter(ticks);
+    }
+
+    @Override
+    public Gene getCombinedGene() {
+        return CraftPanda.fromNms(this.getHandle().getVariant());
+    }
+    // Paper end - Panda API
+
     @Override
     public boolean isRolling() {
         return this.getHandle().isRolling();
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java
index 9304e201db1ec96d0916aa8ea781f3e4bc7991e6..8338effd39b1709dbe578e247710a8e58d83e3aa 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java
@@ -44,5 +44,25 @@ public class CraftPhantom extends CraftFlying implements Phantom, CraftEnemy {
     public void setShouldBurnInDay(boolean shouldBurnInDay) {
         getHandle().setShouldBurnInDay(shouldBurnInDay);
     }
+
+    @Override
+    public org.bukkit.Location getAnchorLocation() {
+        net.minecraft.core.BlockPos pos = this.getHandle().anchorPoint;
+        if (pos == null) {
+            return null;
+        }
+
+        return io.papermc.paper.util.MCUtil.toLocation(this.getHandle().level(), pos);
+    }
+
+    @Override
+    public void setAnchorLocation(org.bukkit.Location location) {
+        net.minecraft.core.BlockPos pos = null;
+        if (location != null) {
+            pos = io.papermc.paper.util.MCUtil.toBlockPosition(location);
+        }
+
+        this.getHandle().anchorPoint = pos;
+    }
     // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
index 8b9695de6e3411cbcc2f97e4a4e243ec1d1dd076..03e74b29ebf0f9b9a0dbc6ffc872e22a22be20f0 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPiglin.java
@@ -84,4 +84,37 @@ public class CraftPiglin extends CraftPiglinAbstract implements Piglin, com.dest
     public String toString() {
         return "CraftPiglin";
     }
+    // Paper start
+    @Override
+    public void setChargingCrossbow(boolean chargingCrossbow) {
+        this.getHandle().setChargingCrossbow(chargingCrossbow);
+    }
+
+    @Override
+    public boolean isChargingCrossbow() {
+        return this.getHandle().isChargingCrossbow();
+    }
+
+    @Override
+    public void setDancing(boolean dancing) {
+        if (dancing) {
+            this.getHandle().getBrain().setMemory(net.minecraft.world.entity.ai.memory.MemoryModuleType.DANCING, true);
+            this.getHandle().getBrain().setMemory(net.minecraft.world.entity.ai.memory.MemoryModuleType.CELEBRATE_LOCATION, this.getHandle().getOnPos());
+        } else {
+            this.getHandle().getBrain().eraseMemory(net.minecraft.world.entity.ai.memory.MemoryModuleType.DANCING);
+            this.getHandle().getBrain().eraseMemory(net.minecraft.world.entity.ai.memory.MemoryModuleType.CELEBRATE_LOCATION);
+        }
+    }
+
+    @Override
+    public void setDancing(long duration) {
+        this.getHandle().getBrain().setMemoryWithExpiry(net.minecraft.world.entity.ai.memory.MemoryModuleType.DANCING, true, duration);
+        this.getHandle().getBrain().setMemoryWithExpiry(net.minecraft.world.entity.ai.memory.MemoryModuleType.CELEBRATE_LOCATION, this.getHandle().getOnPos(), duration);
+    }
+
+    @Override
+    public boolean isDancing() {
+        return this.getHandle().isDancing();
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
index c7aec6f28e5d3546235b30f6b1112440a76163c5..fe075cfdf3097d6cb768e71b8cc360abb8eaf367 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPolarBear.java
@@ -17,4 +17,16 @@ public class CraftPolarBear extends CraftAnimals implements PolarBear {
     public String toString() {
         return "CraftPolarBear";
     }
+
+    // Paper start
+    @Override
+    public boolean isStanding() {
+        return this.getHandle().isStanding();
+    }
+
+    @Override
+    public void setStanding(boolean standing) {
+        this.getHandle().setStanding(standing);
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java
index be20d5a3d5914683f40dc4a585b08a2f55616580..eb7e2902dc134847711284dd2af8abda7627c7ab 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java
@@ -30,4 +30,15 @@ public class CraftRabbit extends CraftAnimals implements Rabbit {
     public void setRabbitType(Type type) {
         this.getHandle().setVariant(net.minecraft.world.entity.animal.Rabbit.Variant.values()[type.ordinal()]);
     }
+    // Paper start
+    @Override
+    public void setMoreCarrotTicks(int ticks) {
+        this.getHandle().moreCarrotTicks = ticks;
+    }
+
+    @Override
+    public int getMoreCarrotTicks() {
+        return this.getHandle().moreCarrotTicks;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java
index cae59f77c704a5b9515dc4917ed5fdc89631ecfb..09796ce15658e3f7c223a265a547a51ee729ed40 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRavager.java
@@ -18,4 +18,35 @@ public class CraftRavager extends CraftRaider implements Ravager {
     public String toString() {
         return "CraftRavager";
     }
+    // Paper start - Missing Entity Behavior
+    @Override
+    public int getAttackTicks() {
+        return this.getHandle().getAttackTick();
+    }
+
+    @Override
+    public void setAttackTicks(int ticks) {
+        this.getHandle().attackTick = ticks;
+    }
+
+    @Override
+    public int getStunnedTicks() {
+        return this.getHandle().getStunnedTick();
+    }
+
+    @Override
+    public void setStunnedTicks(int ticks) {
+        this.getHandle().stunnedTick = ticks;
+    }
+
+    @Override
+    public int getRoarTicks() {
+        return this.getHandle().getRoarTick();
+    }
+
+    @Override
+    public void setRoarTicks(int ticks) {
+        this.getHandle().roarTick = ticks;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java
index b8140aa25a25870259b5644091c6643da1e14b54..d4d8ce60098c74508e2de9541bf6534988779764 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java
@@ -3,7 +3,7 @@ package org.bukkit.craftbukkit.entity;
 import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.Salmon;
 
-public class CraftSalmon extends CraftFish implements Salmon {
+public class CraftSalmon extends io.papermc.paper.entity.PaperSchoolableFish implements Salmon { // Paper - Schooling Fish API
 
     public CraftSalmon(CraftServer server, net.minecraft.world.entity.animal.Salmon entity) {
         super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java
index 451a9bfd9b9b6945e224f1bb05c7951ed934b4e3..d7c6a0bbc5671ea8f2488230c94df5146a1e98b9 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTadpole.java
@@ -28,4 +28,15 @@ public class CraftTadpole extends CraftFish implements org.bukkit.entity.Tadpole
     public void setAge(int age) {
         this.getHandle().age = age;
     }
+    // Paper start
+    @Override
+    public void setAgeLock(boolean lock) {
+        this.getHandle().ageLocked = lock;
+    }
+
+    @Override
+    public boolean getAgeLock() {
+        return this.getHandle().ageLocked;
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
index 0fa00ae2b8a84e1ba5a902c1e46e561a761c54b6..20f9735c7cb76024e15dbdca7684f5c560876175 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
@@ -31,4 +31,27 @@ public class CraftTrident extends CraftArrow implements Trident {
     public String toString() {
         return "CraftTrident";
     }
+
+    // Paper start
+    @Override
+    public boolean hasGlint() {
+        return this.getHandle().isFoil();
+    }
+
+    @Override
+    public void setGlint(boolean glint) {
+        this.getHandle().setFoil(glint);
+    }
+
+    @Override
+    public int getLoyaltyLevel() {
+        return this.getHandle().getLoyalty();
+    }
+
+    @Override
+    public void setLoyaltyLevel(int loyaltyLevel) {
+        com.google.common.base.Preconditions.checkArgument(loyaltyLevel >= 0 && loyaltyLevel <= 127, "The loyalty level has to be between 0 and 127");
+        this.getHandle().setLoyalty((byte) loyaltyLevel);
+    }
+    // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java
index e3bde6d1c0e03407af1382a61748470063bb2e18..9e53c30801c700719c78c0fd521fd615c94e02c8 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java
@@ -7,7 +7,7 @@ import org.bukkit.craftbukkit.CraftServer;
 import org.bukkit.entity.TropicalFish;
 import org.bukkit.entity.TropicalFish.Pattern;
 
-public class CraftTropicalFish extends CraftFish implements TropicalFish {
+public class CraftTropicalFish extends io.papermc.paper.entity.PaperSchoolableFish implements TropicalFish { // Paper - Schooling Fish API
 
     public CraftTropicalFish(CraftServer server, net.minecraft.world.entity.animal.TropicalFish entity) {
         super(server, entity);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
index 1cfbe9c476f4a254edf3edf4b70696bbaba78558..e9ec3455eabc473e104b5342a615a38c1ac25a4f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVex.java
@@ -29,6 +29,26 @@ public class CraftVex extends CraftMonster implements Vex {
     public void setSummoner(org.bukkit.entity.Mob summoner) {
         getHandle().setOwner(summoner == null ? null : ((CraftMob) summoner).getHandle());
     }
+
+    @Override
+    public boolean hasLimitedLifetime() {
+        return this.getHandle().hasLimitedLife;
+    }
+
+    @Override
+    public void setLimitedLifetime(boolean hasLimitedLifetime) {
+        this.getHandle().hasLimitedLife = hasLimitedLifetime;
+    }
+
+    @Override
+    public int getLimitedLifetimeTicks() {
+        return this.getHandle().limitedLifeTicks;
+    }
+
+    @Override
+    public void setLimitedLifetimeTicks(int ticks) {
+        this.getHandle().limitedLifeTicks = ticks;
+    }
     // Paper end
 
     @Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
index e2a0c11867abee6add8775259c54f2052de7b1ad..fd968881eeec6dc5bdf90decc23a2bfc619c410d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillagerZombie.java
@@ -60,13 +60,20 @@ public class CraftVillagerZombie extends CraftZombie implements ZombieVillager {
 
     @Override
     public void setConversionTime(int time) {
+    // Paper start - missing entity behaviour api - converting without entity event
+        this.setConversionTime(time, true);
+    }
+
+    @Override
+    public void setConversionTime(int time, boolean broadcastEntityEvent) {
+    // Paper stop - missing entity behaviour api - converting without entity event
         if (time < 0) {
             this.getHandle().villagerConversionTime = -1;
             this.getHandle().getEntityData().set(net.minecraft.world.entity.monster.ZombieVillager.DATA_CONVERTING_ID, false);
             this.getHandle().conversionStarter = null;
             this.getHandle().removeEffect(MobEffects.DAMAGE_BOOST, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION);
         } else {
-            this.getHandle().startConverting(null, time);
+            this.getHandle().startConverting(null, time, broadcastEntityEvent); // Paper - missing entity behaviour api - converting without entity event
         }
     }
 
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
index 0e597394a3dd08f022614fc9777302fea581eb55..3cceefa0d6278924a19641a49bdf16bcdacb2233 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWanderingTrader.java
@@ -49,5 +49,25 @@ public class CraftWanderingTrader extends CraftAbstractVillager implements Wande
     public boolean canDrinkMilk() {
         return getHandle().canDrinkMilk;
     }
+
+    @Override
+    public org.bukkit.Location getWanderingTowards() {
+        net.minecraft.core.BlockPos pos = this.getHandle().getWanderTarget();
+        if (pos == null) {
+            return null;
+        }
+
+        return io.papermc.paper.util.MCUtil.toLocation(this.getHandle().level(), pos);
+    }
+
+    @Override
+    public void setWanderingTowards(org.bukkit.Location location) {
+        net.minecraft.core.BlockPos pos = null;
+        if (location != null) {
+            pos = io.papermc.paper.util.MCUtil.toBlockPosition(location);
+        }
+
+        this.getHandle().setWanderTarget(pos);
+    }
     // Paper end
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
index 794e4fe0a3fbd967f665b2707865c15491370c76..c284eb96a1e330078076cbe61f0f6e2ff4ed89bd 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWarden.java
@@ -37,6 +37,13 @@ public class CraftWarden extends CraftMonster implements org.bukkit.entity.Warde
         return this.getHandle().getAngerManagement().getActiveAnger(((CraftEntity) entity).getHandle());
     }
 
+    // Paper start
+    @Override
+    public int getHighestAnger() {
+        return this.getHandle().getAngerManagement().getActiveAnger(null);
+    }
+    // Paper end
+
     @Override
     public void increaseAnger(Entity entity, int increase) {
         Preconditions.checkArgument(entity != null, "Entity cannot be null");
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
index 1113533d281ed159bb735040fb1f913482debf3a..7a8ce6956db56061af93ba9761f5d1057a90bc49 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java
@@ -67,4 +67,36 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok
 
         this.getHandle().setInvulnerableTicks(ticks);
     }
+
+    // Paper start
+    @Override
+    public boolean isCharged() {
+        return getHandle().isPowered();
+    }
+
+    @Override
+    public int getInvulnerableTicks() {
+        return getHandle().getInvulnerableTicks();
+    }
+
+    @Override
+    public void setInvulnerableTicks(int ticks) {
+        getHandle().setInvulnerableTicks(ticks);
+    }
+
+    @Override
+    public boolean canTravelThroughPortals() {
+        return getHandle().canChangeDimensions();
+    }
+
+    @Override
+    public void setCanTravelThroughPortals(boolean value) {
+        getHandle().setCanTravelThroughPortals(value);
+    }
+
+    @Override
+    public void enterInvulnerabilityPhase() {
+        this.getHandle().makeInvulnerable();
+    }
+    // Paper end
 }