Skip to content

Commit 6fd15fa

Browse files
committed
Initial Support For MC 1.21
1 parent 6721134 commit 6fd15fa

9 files changed

Lines changed: 117 additions & 33 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Sentinel NPCs: Combat NPCs for Spigot!
2222

2323
![AnimatedSentinel](https://i.imgur.com/VDwTzrs.gif)
2424

25-
**Version 2.9.0**: Compatible with Spigot 1.8.8 through 1.20.6 (Primarily targeted at 1.20.6) - see 'Common Issues' section below if on older supported versions)
25+
**Version 2.9.1**: Compatible with Spigot 1.8.8 through 1.21 (Primarily targeted at 1.21 - see 'Common Issues' section below if on older supported versions)
2626

2727
### Downloads
2828

@@ -345,7 +345,7 @@ If you're building a separate plugin you would like to integrate into Sentinel,
345345
<dependency>
346346
<groupId>org.mcmonkey</groupId>
347347
<artifactId>sentinel</artifactId>
348-
<version>2.9.0-SNAPSHOT</version>
348+
<version>2.9.1-SNAPSHOT</version>
349349
<type>jar</type>
350350
<scope>provided</scope>
351351
<exclusions>

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
<groupId>org.mcmonkey</groupId>
88
<artifactId>sentinel</artifactId>
99
<packaging>jar</packaging>
10-
<version>2.9.0-SNAPSHOT</version>
10+
<version>2.9.1-SNAPSHOT</version>
1111
<name>Sentinel</name>
1212
<description>Combat NPCs for Spigot</description>
1313

1414
<properties>
1515
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16-
<bukkit.version>1.20.4-R0.1-SNAPSHOT</bukkit.version>
17-
<citizens.version>2.0.34-SNAPSHOT</citizens.version>
16+
<bukkit.version>1.21-R0.1-SNAPSHOT</bukkit.version>
17+
<citizens.version>2.0.35-SNAPSHOT</citizens.version>
1818
<BUILD_NUMBER>Unknown</BUILD_NUMBER>
1919
</properties>
2020

src/main/java/org/mcmonkey/sentinel/SentinelTrait.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.mcmonkey.sentinel.targeting.SentinelTargetLabel;
4545
import org.mcmonkey.sentinel.targeting.SentinelTargetList;
4646
import org.mcmonkey.sentinel.targeting.SentinelTargetingHelper;
47+
import org.mcmonkey.sentinel.utilities.SentinelAPIBreakageFix;
4748
import org.mcmonkey.sentinel.utilities.SentinelNMSHelper;
4849
import org.mcmonkey.sentinel.utilities.SentinelVersionCompat;
4950

@@ -1275,15 +1276,15 @@ public double getDamage(boolean forRangedAttacks, ItemStack weapon) {
12751276
}
12761277
// TODO: Less arbitrary values, more game-like calculations.
12771278
double multiplier = 1;
1278-
multiplier += weapon.getItemMeta() == null || !weapon.getItemMeta().hasEnchant(Enchantment.DAMAGE_ALL)
1279-
? 0 : weapon.getItemMeta().getEnchantLevel(Enchantment.DAMAGE_ALL) * 0.2;
1279+
multiplier += weapon.getItemMeta() == null || !weapon.getItemMeta().hasEnchant(SentinelAPIBreakageFix.ENCHANTMENT_DAMAGE_ALL)
1280+
? 0 : weapon.getItemMeta().getEnchantLevel(SentinelAPIBreakageFix.ENCHANTMENT_DAMAGE_ALL) * 0.2;
12801281
Material weaponType = weapon.getType();
12811282
if (SentinelVersionCompat.BOW_MATERIALS.contains(weaponType)) {
12821283
if (!forRangedAttacks) {
12831284
return 1;
12841285
}
1285-
return 6 * (1 + (weapon.getItemMeta() == null || !weapon.getItemMeta().hasEnchant(Enchantment.ARROW_DAMAGE)
1286-
? 0 : weapon.getItemMeta().getEnchantLevel(Enchantment.ARROW_DAMAGE) * 0.3));
1286+
return 6 * (1 + (weapon.getItemMeta() == null || !weapon.getItemMeta().hasEnchant(SentinelAPIBreakageFix.ENCHANTMENT_ARROW_DAMAGE)
1287+
? 0 : weapon.getItemMeta().getEnchantLevel(SentinelAPIBreakageFix.ENCHANTMENT_ARROW_DAMAGE) * 0.3));
12871288
}
12881289
Double damageMult = SentinelVersionCompat.WEAPON_DAMAGE_MULTIPLIERS.get(weaponType);
12891290
if (damageMult == null) {

src/main/java/org/mcmonkey/sentinel/SentinelUtilities.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.bukkit.potion.PotionEffectType;
1616
import org.bukkit.util.RayTraceResult;
1717
import org.bukkit.util.Vector;
18+
import org.mcmonkey.sentinel.utilities.SentinelAPIBreakageFix;
1819
import org.mcmonkey.sentinel.utilities.SentinelVersionCompat;
1920
import org.mcmonkey.sentinel.utilities.VelocityTracker;
2021

@@ -125,8 +126,8 @@ public static int getFireProtection(LivingEntity entity) {
125126
}
126127
int level = 0;
127128
for (ItemStack item : entity.getEquipment().getArmorContents()) {
128-
if (item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(Enchantment.PROTECTION_FIRE)) {
129-
level = Math.max(level, item.getItemMeta().getEnchantLevel(Enchantment.PROTECTION_FIRE));
129+
if (item != null && item.hasItemMeta() && item.getItemMeta().hasEnchant(SentinelAPIBreakageFix.ENCHANTMENT_PROTECTION_FIRE)) {
130+
level = Math.max(level, item.getItemMeta().getEnchantLevel(SentinelAPIBreakageFix.ENCHANTMENT_PROTECTION_FIRE));
130131
}
131132
}
132133
return level;

src/main/java/org/mcmonkey/sentinel/SentinelWeaponHelper.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import org.bukkit.Bukkit;
44
import org.bukkit.Location;
55
import org.bukkit.Material;
6-
import org.bukkit.Particle;
76
import org.bukkit.attribute.Attribute;
87
import org.bukkit.enchantments.Enchantment;
98
import org.bukkit.entity.*;
@@ -13,10 +12,9 @@
1312
import org.bukkit.inventory.meta.PotionMeta;
1413
import org.bukkit.potion.PotionData;
1514
import org.bukkit.potion.PotionEffect;
16-
import org.bukkit.potion.PotionType;
1715
import org.bukkit.util.Vector;
1816
import org.mcmonkey.sentinel.targeting.SentinelTarget;
19-
import org.mcmonkey.sentinel.utilities.SentinelNMSHelper;
17+
import org.mcmonkey.sentinel.utilities.SentinelAPIBreakageFix;
2018
import org.mcmonkey.sentinel.utilities.SentinelVersionCompat;
2119

2220
import java.util.HashMap;
@@ -26,19 +24,27 @@
2624
*/
2725
public class SentinelWeaponHelper extends SentinelHelperObject {
2826

29-
public static final EntityType LINGERING_POTION, TIPPED_ARROW;
27+
public static final EntityType LINGERING_POTION, TIPPED_ARROW, SPLASH_POTION;
3028

3129
static {
32-
if (SentinelVersionCompat.v1_14) {
33-
LINGERING_POTION = EntityType.SPLASH_POTION;
30+
if (SentinelVersionCompat.v1_21) {
31+
LINGERING_POTION = EntityType.POTION;
32+
SPLASH_POTION = EntityType.POTION;
33+
TIPPED_ARROW = EntityType.ARROW;
34+
}
35+
else if (SentinelVersionCompat.v1_14) {
36+
LINGERING_POTION = EntityType.valueOf("SPLASH_POTION");
37+
SPLASH_POTION = EntityType.valueOf("SPLASH_POTION");
3438
TIPPED_ARROW = EntityType.ARROW;
3539
}
3640
else if (SentinelVersionCompat.v1_9) {
3741
LINGERING_POTION = EntityType.valueOf("LINGERING_POTION");
42+
SPLASH_POTION = EntityType.valueOf("SPLASH_POTION");
3843
TIPPED_ARROW = EntityType.valueOf("TIPPED_ARROW");
3944
}
4045
else {
4146
LINGERING_POTION = null;
47+
SPLASH_POTION = null;
4248
TIPPED_ARROW = null;
4349
}
4450
}
@@ -55,11 +61,11 @@ public void firePotion(ItemStack potion, Location target, Vector lead) {
5561
HashMap.SimpleEntry<Location, Vector> start = sentinel.getLaunchDetail(target, lead);
5662
Entity entpotion;
5763
if (SentinelVersionCompat.v1_14 || !SentinelVersionCompat.v1_9) {
58-
entpotion = start.getKey().getWorld().spawnEntity(start.getKey(), EntityType.SPLASH_POTION);
64+
entpotion = start.getKey().getWorld().spawnEntity(start.getKey(), SPLASH_POTION);
5965
}
6066
else { // 1_9 to 1_13 temporarily had a unique type for lingering
6167
entpotion = start.getKey().getWorld().spawnEntity(start.getKey(),
62-
potion.getType() == Material.SPLASH_POTION ? EntityType.SPLASH_POTION : LINGERING_POTION);
68+
potion.getType() == Material.SPLASH_POTION ? SPLASH_POTION : LINGERING_POTION);
6369
}
6470
((ThrownPotion) entpotion).setShooter(getLivingEntity());
6571
((ThrownPotion) entpotion).setItem(potion);
@@ -99,7 +105,7 @@ public void fireArrow(ItemStack type, Location target, Vector lead) {
99105
if (type.getType() == Material.FIREWORK_ROCKET) {
100106
FireworkMeta meta = (FireworkMeta) type.getItemMeta();
101107
meta.setPower(3);
102-
arrow = launchStart.getWorld().spawn(launchStart, EntityType.FIREWORK.getEntityClass(), (e) -> {
108+
arrow = launchStart.getWorld().spawn(launchStart, SentinelAPIBreakageFix.ENTITY_TYPE_FIREWORK.getEntityClass(), (e) -> {
103109
((Firework) e).setShotAtAngle(true);
104110
((Firework) e).setFireworkMeta(meta);
105111
e.setVelocity(velocity);
@@ -114,9 +120,9 @@ public void fireArrow(ItemStack type, Location target, Vector lead) {
114120
((AbstractArrow) arrow).setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
115121
if (type.getItemMeta() instanceof PotionMeta) {
116122
PotionData data = ((PotionMeta) type.getItemMeta()).getBasePotionData();
117-
if (data.getType() == null || data.getType() == PotionType.UNCRAFTABLE) {
123+
if (data.getType() == null || data.getType() == SentinelAPIBreakageFix.POTION_TYPE_UNCRAFTABLE) {
118124
if (SentinelPlugin.debugMe) {
119-
sentinel.debug("Potion data '" + data + "' for '" + type.toString() + "' is invalid.");
125+
sentinel.debug("Potion data '" + data + "' for '" + type + "' is invalid.");
120126
}
121127
}
122128
else {
@@ -141,7 +147,7 @@ public void fireArrow(ItemStack type, Location target, Vector lead) {
141147
((Projectile) arrow).setShooter(getLivingEntity());
142148
arrow.setVelocity(velocity);
143149
}
144-
if (sentinel.itemHelper.getHeldItem().containsEnchantment(Enchantment.ARROW_FIRE)) {
150+
if (sentinel.itemHelper.getHeldItem().containsEnchantment(SentinelAPIBreakageFix.ENCHANTMENT_ARROW_FIRE)) {
145151
arrow.setFireTicks(10000);
146152
}
147153
if (SentinelPlugin.instance.arrowCleanupTime > 0) {
@@ -286,7 +292,7 @@ public void fireEvokerFangs(Location target) {
286292
sentinel.stats_evokerFangsSpawned++;
287293
sentinel.faceLocation(target);
288294
if (SentinelVersionCompat.v1_13) {
289-
getLivingEntity().getWorld().spawnParticle(Particle.SPELL, getLivingEntity().getEyeLocation().add(0, 1, 0), 10, 1, 1, 1);
295+
getLivingEntity().getWorld().spawnParticle(SentinelAPIBreakageFix.PARTICLE_SPELL, getLivingEntity().getEyeLocation().add(0, 1, 0), 10, 1, 1, 1);
290296
}
291297
Vector forward = getLivingEntity().getEyeLocation().getDirection().setY(0).normalize();
292298
Location start = getLivingEntity().getLocation().clone().add(forward.clone().multiply(Math.max(3, sentinel.firingMinimumRange())));

src/main/java/org/mcmonkey/sentinel/targeting/SentinelTarget.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.mcmonkey.sentinel.SentinelPlugin;
88
import org.mcmonkey.sentinel.SentinelTrait;
99
import org.mcmonkey.sentinel.SentinelUtilities;
10+
import org.mcmonkey.sentinel.utilities.SentinelAPIBreakageFix;
1011

1112
import java.util.*;
1213

@@ -45,12 +46,12 @@ public class SentinelTarget {
4546
SHEEP = new SentinelTarget(new EntityType[]{EntityType.SHEEP}, "SHEEP"),
4647
CHICKENS = new SentinelTarget(new EntityType[]{EntityType.CHICKEN}, "CHICKEN", "DUCK"),
4748
HORSES = new SentinelTarget(new EntityType[]{EntityType.HORSE}, "HORSE"),
48-
MUSHROOM_COW = new SentinelTarget(new EntityType[]{EntityType.MUSHROOM_COW}, "MUSHROOM_COW", "MUSHROOMCOW", "MOOSHROOM"),
49+
MUSHROOM_COW = new SentinelTarget(new EntityType[]{SentinelAPIBreakageFix.ENTITY_TYPE_MUSHROOM_COW}, "MUSHROOM_COW", "MUSHROOMCOW", "MOOSHROOM"),
4950
IRON_GOLEMS = new SentinelTarget(new EntityType[]{EntityType.IRON_GOLEM}, "IRON_GOLEM", "IRONGOLEM"),
5051
SQUIDS = new SentinelTarget(new EntityType[]{EntityType.SQUID}, "SQUID"),
5152
VILLAGER = new SentinelTarget(new EntityType[]{EntityType.VILLAGER}, "VILLAGER"),
5253
WOLVES = new SentinelTarget(new EntityType[]{EntityType.WOLF}, "WOLF", "WOLVE"),
53-
SNOWMEN = new SentinelTarget(new EntityType[]{EntityType.SNOWMAN}, "SNOWMAN", "SNOWMEN"),
54+
SNOWMEN = new SentinelTarget(new EntityType[]{SentinelAPIBreakageFix.ENTITY_TYPE_SNOWMAN}, "SNOWMAN", "SNOWMEN"),
5455
WITCHES = new SentinelTarget(new EntityType[]{EntityType.WITCH}, "WITCH"),
5556
GUARDIANS = new SentinelTarget(new EntityType[]{EntityType.GUARDIAN}, "GUARDIAN"),
5657
CREERERS = new SentinelTarget(new EntityType[]{EntityType.CREEPER}, "CREEPER"),
@@ -122,6 +123,11 @@ public class SentinelTarget {
122123
*/
123124
public static SentinelTarget TADPOLES, FROGS, ALLAYS, WARDENS, CAMELS, SNIFFERS;
124125

126+
/**
127+
* Valid target types for 1.21 or higher.
128+
*/
129+
public static SentinelTarget ARMADILLOS, BOGGEDS, BREEZES;
130+
125131
/**
126132
* Multiple-entity-type targets.
127133
*/
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.mcmonkey.sentinel.utilities;
2+
3+
import org.bukkit.Particle;
4+
import org.bukkit.enchantments.Enchantment;
5+
import org.bukkit.entity.EntityType;
6+
import org.bukkit.potion.PotionType;
7+
8+
import java.lang.reflect.Field;
9+
10+
/**
11+
* Fixes for Spigot breaking API between updates.
12+
*/
13+
public class SentinelAPIBreakageFix {
14+
15+
public static EntityType ENTITY_TYPE_MUSHROOM_COW = _getEnumValue(EntityType.class, "MUSHROOM_COW", "MOOSHROOM");
16+
17+
public static EntityType ENTITY_TYPE_SNOWMAN = _getEnumValue(EntityType.class, "SNOWMAN", "SNOW_GOLEM");
18+
19+
public static EntityType ENTITY_TYPE_FIREWORK = _getEnumValue(EntityType.class, "FIREWORK", "FIREWORK_ROCKET");
20+
21+
public static Enchantment ENCHANTMENT_DAMAGE_ALL = _getEnumValue(Enchantment.class, "DAMAGE_ALL", "SHARPNESS");
22+
23+
public static Enchantment ENCHANTMENT_ARROW_DAMAGE = _getEnumValue(Enchantment.class, "ARROW_DAMAGE", "POWER");
24+
25+
public static Enchantment ENCHANTMENT_ARROW_FIRE = _getEnumValue(Enchantment.class, "ARROW_FIRE", "FLAME");
26+
27+
public static Enchantment ENCHANTMENT_PROTECTION_FIRE = _getEnumValue(Enchantment.class, "PROTECTION_FIRE", "FIRE_PROTECTION");
28+
29+
public static PotionType POTION_TYPE_UNCRAFTABLE = _getEnumValue(PotionType.class, "UNCRAFTABLE"); // NOTE: Null after 1.21
30+
31+
public static Particle PARTICLE_SPELL = _getEnumValue(Particle.class, "SPELL", "EFFECT");
32+
33+
/**
34+
* Note: not necessarily actually an enum.
35+
*/
36+
public static <T> T _getEnumValue(Class<T> clazz, String... name) {
37+
try {
38+
for (Field f : clazz.getDeclaredFields()) {
39+
f.setAccessible(true);
40+
for (String n : name) {
41+
if (f.getName().equalsIgnoreCase(n)) {
42+
return (T) f.get(null);
43+
}
44+
}
45+
}
46+
}
47+
catch (Throwable ex) {
48+
ex.printStackTrace();
49+
}
50+
return null;
51+
}
52+
}

src/main/java/org/mcmonkey/sentinel/utilities/SentinelNMSHelper.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,13 @@ public static void init() {
3838
nmsDataWatcher = Class.forName("net.minecraft.network.syncher.DataWatcher"); // SynchedEntityData
3939
nmsDataWatcherObject = Class.forName("net.minecraft.network.syncher.DataWatcherObject"); // EntityDataAccessor
4040
nmsEntityEnderman = Class.forName("net.minecraft.world.entity.monster.EntityEnderman");
41-
if (SentinelVersionCompat.v1_20 && !SentinelVersionCompat.vFuture) { // 1.20 names
41+
if (SentinelVersionCompat.v1_21 && !SentinelVersionCompat.vFuture) { // 1.21 names
42+
// https://minidigger.github.io/MiniMappingViewer/#/mojang/server/1.21
43+
endermanAngryField = "ce"; // net.minecraft.world.entity.monster.EnderMan#DATA_CREEPY
44+
broadcastEffectMethod = "a"; // net.minecraft.world.level.Level#broadcastEntityEvent(Entity,byte)
45+
dataWatcherSet = "a"; // net.minecraft.network.syncher.SynchedEntityData#set
46+
}
47+
else if (SentinelVersionCompat.v1_20 && !SentinelVersionCompat.v1_21) { // 1.20 names
4248
try {
4349
// https://minidigger.github.io/MiniMappingViewer/#/mojang/server/1.20.2
4450
if (nmsEntityEnderman.getDeclaredField("bV") != null) {

src/main/java/org/mcmonkey/sentinel/utilities/SentinelVersionCompat.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ public class SentinelVersionCompat {
4949
/**
5050
* Boolean indicating if the server version is >= the named version.
5151
*/
52-
public static final boolean v1_8, v1_9, v1_10, v1_11, v1_12, v1_13, v1_14, v1_15, v1_16, v1_17, v1_18, v1_19, v1_20, vFuture;
52+
public static final boolean v1_8, v1_9, v1_10, v1_11, v1_12, v1_13, v1_14, v1_15, v1_16, v1_17, v1_18, v1_19, v1_20, v1_21, vFuture;
5353

5454
static {
5555
String vers = Bukkit.getBukkitVersion(); // Returns in format like: 1.12.2-R0.1-SNAPSHOT
56-
vFuture = vers.startsWith("1.21") || vers.startsWith("1.22") || vers.startsWith("1.23");
57-
v1_20 = vers.startsWith("1.20") || vFuture;
56+
vFuture = vers.startsWith("1.22") || vers.startsWith("1.23") || vers.startsWith("1.24") || vers.startsWith("1.25") || vers.startsWith("1.26");
57+
v1_21 = vers.startsWith("1.21") || vFuture;
58+
v1_20 = vers.startsWith("1.20") || v1_21;
5859
v1_19 = vers.startsWith("1.19") || v1_20;
5960
v1_18 = vers.startsWith("1.18") || v1_19;
6061
v1_17 = vers.startsWith("1.17") || v1_18;
@@ -200,7 +201,15 @@ public class SentinelVersionCompat {
200201
SentinelTarget.MONSTERS = new SentinelTarget(v1_19_monsters(), "MONSTER");
201202
}
202203
// 1.20 didn't add new mobs
203-
if (v1_20) { // && !v1_21
204+
if (v1_20 && !v1_21) {
205+
SentinelTarget.PASSIVE_MOBS = new SentinelTarget(v1_19_passive(), passiveNames());
206+
SentinelTarget.MOBS = new SentinelTarget(combine(v1_19_passive(), v1_19_monsters()), "MOB");
207+
SentinelTarget.MONSTERS = new SentinelTarget(v1_19_monsters(), "MONSTER");
208+
}
209+
if (v1_21) { // && !v1_22
210+
SentinelTarget.HOGLINS = new SentinelTarget(new EntityType[]{EntityType.BREEZE}, "BREEZE");
211+
SentinelTarget.HOGLINS = new SentinelTarget(new EntityType[]{EntityType.BOGGED}, "BOGGED", "BOGGEDSKELETON", "BOGGED_SKELETON");
212+
SentinelTarget.HOGLINS = new SentinelTarget(new EntityType[]{EntityType.ARMADILLO}, "ARMADILLO");
204213
SentinelTarget.PASSIVE_MOBS = new SentinelTarget(v1_19_passive(), passiveNames());
205214
SentinelTarget.MOBS = new SentinelTarget(combine(v1_19_passive(), v1_19_monsters()), "MOB");
206215
SentinelTarget.MONSTERS = new SentinelTarget(v1_19_monsters(), "MONSTER");
@@ -374,6 +383,9 @@ else if (v1_12 && !vFuture) {
374383
SentinelPlugin.instance.getLogger().info("Sentinel loaded on a fully supported Minecraft version."
375384
+ " If you encounter any issues or need to ask a question, please join our Discord at https://discord.gg/Q6pZGSR and post in the '#sentinel' channel.");
376385
}
386+
else if (!v1_8) {
387+
SentinelPlugin.instance.getLogger().warning("You are running on an unrecognized (ancient?) minecraft version. This probably won't work.");
388+
}
377389
else {
378390
SentinelPlugin.instance.getLogger().warning("You are running on an unrecognized (future?) minecraft version."
379391
+ " Support channel be guaranteed. Check if there is a newer version of Sentinel available that supports your minecraft version.");
@@ -425,8 +437,8 @@ static String[] passiveNames() {
425437

426438
static EntityType[] v1_8_passive() {
427439
return new EntityType[]{
428-
EntityType.PIG, EntityType.OCELOT, EntityType.COW, EntityType.RABBIT, EntityType.SHEEP, EntityType.CHICKEN, EntityType.MUSHROOM_COW,
429-
EntityType.HORSE, EntityType.IRON_GOLEM, EntityType.SQUID, EntityType.VILLAGER, EntityType.WOLF, EntityType.SNOWMAN
440+
EntityType.PIG, EntityType.OCELOT, EntityType.COW, EntityType.RABBIT, EntityType.SHEEP, EntityType.CHICKEN, SentinelAPIBreakageFix.ENTITY_TYPE_MUSHROOM_COW,
441+
EntityType.HORSE, EntityType.IRON_GOLEM, EntityType.SQUID, EntityType.VILLAGER, EntityType.WOLF, SentinelAPIBreakageFix.ENTITY_TYPE_SNOWMAN
430442
};
431443
}
432444

0 commit comments

Comments
 (0)