From a93bf2f047e0fb3e10ea5ba5e6dea4ce2292062a Mon Sep 17 00:00:00 2001 From: Intelli Date: Tue, 23 Jul 2024 20:06:18 -0600 Subject: [PATCH] Fixed NotSerializableException when killing certain entities (fixes #589) --- .../net/coreprotect/bukkit/Bukkit_v1_19.java | 8 +++++++- .../listener/entity/EntityDeathListener.java | 8 ++++---- .../coreprotect/utility/entity/EntityUtil.java | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java index 151f6bf..f84f902 100644 --- a/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java +++ b/src/main/java/net/coreprotect/bukkit/Bukkit_v1_19.java @@ -4,7 +4,9 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.entity.Frog; import org.bukkit.entity.Goat; @@ -31,7 +33,7 @@ public class Bukkit_v1_19 extends Bukkit_v1_18 implements BukkitInterface { public boolean getEntityMeta(LivingEntity entity, List info) { if (entity instanceof Frog) { Frog frog = (Frog) entity; - info.add(frog.getVariant()); + info.add(frog.getVariant().getKey().asString()); } else if (entity instanceof Tadpole) { Tadpole tadpole = (Tadpole) entity; @@ -58,6 +60,10 @@ public class Bukkit_v1_19 extends Bukkit_v1_18 implements BukkitInterface { if (entity instanceof Frog) { Frog frog = (Frog) entity; if (count == 0) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Frog.Variant.class).get(namespacedKey); + } Frog.Variant set = (Frog.Variant) value; frog.setVariant(set); } diff --git a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java index 8a83f06..ed58ab1 100644 --- a/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java +++ b/src/main/java/net/coreprotect/listener/entity/EntityDeathListener.java @@ -322,7 +322,7 @@ public final class EntityDeathListener extends Queue implements Listener { } else if (entity instanceof Cat) { Cat cat = (Cat) entity; - info.add(cat.getCatType()); + info.add(cat.getCatType().getKey().asString()); info.add(cat.getCollarColor()); } else if (entity instanceof Fox) { @@ -404,8 +404,8 @@ public final class EntityDeathListener extends Queue implements Listener { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; - info.add(villager.getProfession()); - info.add(villager.getVillagerType()); + info.add(villager.getProfession().getKey().asString()); + info.add(villager.getVillagerType().getKey().asString()); info.add(recipes); info.add(villager.getVillagerLevel()); info.add(villager.getVillagerExperience()); @@ -433,7 +433,7 @@ public final class EntityDeathListener extends Queue implements Listener { else if (entity instanceof ZombieVillager) { ZombieVillager zombieVillager = (ZombieVillager) entity; info.add(zombieVillager.isBaby()); - info.add(zombieVillager.getVillagerProfession()); + info.add(zombieVillager.getVillagerProfession().getKey().asString()); } else if (entity instanceof Zombie) { Zombie zombie = (Zombie) entity; diff --git a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java index ed61965..44dbfb3 100644 --- a/src/main/java/net/coreprotect/utility/entity/EntityUtil.java +++ b/src/main/java/net/coreprotect/utility/entity/EntityUtil.java @@ -7,6 +7,7 @@ import java.util.Map; import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Location; +import org.bukkit.NamespacedKey; import org.bukkit.OfflinePlayer; import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attribute; @@ -231,6 +232,11 @@ public class EntityUtil { else if (entity instanceof Cat) { Cat cat = (Cat) entity; if (count == 0) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Cat.Type.class).get(namespacedKey); + // value = RegistryAccess.registryAccess().getRegistry(RegistryKey.CAT_VARIANT).get((NamespacedKey)value); + } Cat.Type set = (Cat.Type) value; cat.setCatType(set); } @@ -327,6 +333,10 @@ public class EntityUtil { if (count == 0) { if (abstractVillager instanceof Villager) { Villager villager = (Villager) abstractVillager; + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + } Profession set = (Profession) value; villager.setProfession(set); } @@ -334,6 +344,10 @@ public class EntityUtil { else if (count == 1) { if (abstractVillager instanceof Villager && value instanceof Villager.Type) { Villager villager = (Villager) abstractVillager; + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Villager.Type.class).get(namespacedKey); + } Villager.Type set = (Villager.Type) value; villager.setVillagerType(set); } @@ -427,6 +441,10 @@ public class EntityUtil { zombieVillager.setBaby(set); } else if (count == 1) { + if (value instanceof String) { + NamespacedKey namespacedKey = NamespacedKey.fromString((String) value); + value = Bukkit.getRegistry(Profession.class).get(namespacedKey); + } Profession set = (Profession) value; zombieVillager.setVillagerProfession(set); }