From 8abf4c480ea0b63de30f5b7c9adfab85365bce1f Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 19 Jan 2025 20:01:05 +1100 Subject: [PATCH] SPIGOT-7996: Cancelling EntityTransformEvent does not keep equipment --- .../world/entity/ConversionType.patch | 42 ++++++++++++++++++- .../world/entity/EntityInsentient.patch | 10 +++-- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/nms-patches/net/minecraft/world/entity/ConversionType.patch b/nms-patches/net/minecraft/world/entity/ConversionType.patch index 4aaf08e2c..0ef5b04f6 100644 --- a/nms-patches/net/minecraft/world/entity/ConversionType.patch +++ b/nms-patches/net/minecraft/world/entity/ConversionType.patch @@ -21,6 +21,15 @@ } entity.startRiding(entityinsentient1); +@@ -52,7 +57,7 @@ + ItemStack itemstack = entityinsentient.getItemBySlot(enumitemslot); + + if (!itemstack.isEmpty()) { +- entityinsentient1.setItemSlot(enumitemslot, itemstack.copyAndClear()); ++ entityinsentient1.setItemSlot(enumitemslot, itemstack.copy()); // CraftBukkit - SPIGOT-7996: don't clear yet + entityinsentient1.setDropChance(enumitemslot, entityinsentient.getEquipmentDropChance(enumitemslot)); + } + } @@ -64,7 +69,7 @@ entityinsentient1.hurtTime = entityinsentient.hurtTime; entityinsentient1.yBodyRot = entityinsentient.yBodyRot; @@ -30,7 +39,38 @@ Objects.requireNonNull(entityinsentient1); optional.ifPresent(entityinsentient1::setSleepingPos); -@@ -156,7 +161,7 @@ +@@ -75,6 +80,21 @@ + + this.convertCommon(entityinsentient, entityinsentient1, conversionparams); + } ++ ++ // CraftBukkit start ++ @Override ++ void postConvert(EntityInsentient entityinsentient, EntityInsentient entityinsentient1, ConversionParams conversionparams) { ++ if (conversionparams.keepEquipment()) { ++ for (EnumItemSlot enumitemslot : EnumItemSlot.VALUES) { ++ ItemStack itemstack = entityinsentient.getItemBySlot(enumitemslot); ++ ++ if (!itemstack.isEmpty()) { ++ itemstack.setCount(0); // SPIGOT-7996: clear after conversion ++ } ++ } ++ } ++ } ++ // CraftBukkit end + }, + SPLIT_ON_DEATH(false) { + @Override +@@ -106,6 +126,8 @@ + } + + abstract void convert(EntityInsentient entityinsentient, EntityInsentient entityinsentient1, ConversionParams conversionparams); ++ ++ void postConvert(EntityInsentient entityinsentient, EntityInsentient entityinsentient1, ConversionParams conversionparams) {} // CraftBukkit + + void convertCommon(EntityInsentient entityinsentient, EntityInsentient entityinsentient1, ConversionParams conversionparams) { + entityinsentient1.setAbsorptionAmount(entityinsentient.getAbsorptionAmount()); +@@ -156,7 +178,7 @@ entityinsentient1.setNoGravity(entityinsentient.isNoGravity()); entityinsentient1.setPortalCooldown(entityinsentient.getPortalCooldown()); entityinsentient1.setSilent(entityinsentient.isSilent()); diff --git a/nms-patches/net/minecraft/world/entity/EntityInsentient.patch b/nms-patches/net/minecraft/world/entity/EntityInsentient.patch index 08c814221..0ad51e354 100644 --- a/nms-patches/net/minecraft/world/entity/EntityInsentient.patch +++ b/nms-patches/net/minecraft/world/entity/EntityInsentient.patch @@ -252,7 +252,7 @@ if (t0 == null) { return null; -@@ -1403,14 +1499,24 @@ +@@ -1403,14 +1499,26 @@ conversionparams_a.finalizeConversion(t0); World world = this.level(); @@ -265,6 +265,8 @@ + if (CraftEventFactory.callEntityTransformEvent(this, t0, transformReason).isCancelled()) { + return null; + } ++ ++ conversionparams.type().postConvert(this, t0, conversionparams); + // CraftBukkit end if (world instanceof WorldServer) { WorldServer worldserver = (WorldServer) world; @@ -279,7 +281,7 @@ } return t0; -@@ -1420,7 +1526,14 @@ +@@ -1420,7 +1528,14 @@ @Nullable public T convertTo(EntityTypes entitytypes, ConversionParams conversionparams, ConversionParams.a conversionparams_a) { @@ -295,7 +297,7 @@ } @Nullable -@@ -1458,6 +1571,7 @@ +@@ -1458,6 +1573,7 @@ boolean flag1 = super.startRiding(entity, flag); if (flag1 && this.isLeashed()) { @@ -303,7 +305,7 @@ this.dropLeash(); } -@@ -1542,7 +1656,7 @@ +@@ -1542,7 +1658,7 @@ if (f1 > 0.0F && entity instanceof EntityLiving) { entityliving = (EntityLiving) entity;