diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch new file mode 100644 index 0000000000..028fc739b8 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch @@ -0,0 +1,47 @@ +--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java ++++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java +@@ -237,7 +_,14 @@ + nextSpawnData.getEquipment().ifPresent(mob::equip); + } + +- if (!level.tryAddFreshEntityWithPassengers(entity)) { ++ entity.spawnedViaMobSpawner = true; // Paper ++ entity.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER; // Paper - Entity#getEntitySpawnReason ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callTrialSpawnerSpawnEvent(entity, pos).isCancelled()) { ++ return Optional.empty(); ++ } ++ if (!level.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER)) { ++ // CraftBukkit end + return Optional.empty(); + } else { + TrialSpawner.FlameParticle flameParticle = this.isOminous +@@ -260,6 +_,19 @@ + LootParams lootParams = new LootParams.Builder(level).create(LootContextParamSets.EMPTY); + ObjectArrayList randomItems = lootTable1.getRandomItems(lootParams); + if (!randomItems.isEmpty()) { ++ // CraftBukkit start ++ org.bukkit.event.block.BlockDispenseLootEvent spawnerDispenseLootEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockDispenseLootEvent( ++ level, ++ pos, ++ null, ++ randomItems ++ ); ++ if (spawnerDispenseLootEvent.isCancelled()) { ++ return; ++ } ++ ++ randomItems = new ObjectArrayList<>(spawnerDispenseLootEvent.getDispensedLoot().stream().map(org.bukkit.craftbukkit.inventory.CraftItemStack::asNMSCopy).toList()); ++ // CraftBukkit end + for (ItemStack itemStack : randomItems) { + DefaultDispenseItemBehavior.spawnItem(level, itemStack, 2, Direction.UP, Vec3.atBottomCenterOf(pos).relative(Direction.UP, 1.2)); + } +@@ -362,7 +_,7 @@ + } + + public void overrideEntityToSpawn(EntityType entityType, Level level) { +- this.data.reset(); ++ this.data.reset(this); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 + this.normalConfig = Holder.direct(this.normalConfig.value().withSpawning(entityType)); + this.ominousConfig = Holder.direct(this.ominousConfig.value().withSpawning(entityType)); + this.setState(level, TrialSpawnerState.INACTIVE); diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch new file mode 100644 index 0000000000..351f01f843 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch @@ -0,0 +1,23 @@ +--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java ++++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java +@@ -101,9 +_,9 @@ + this.ejectingLootTable = ejectingLootTable; + } + +- public void reset() { ++ public void reset(TrialSpawner spawner) { // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 + this.currentMobs.clear(); +- this.nextSpawnData = Optional.empty(); ++ if (!spawner.getConfig().spawnPotentialsDefinition().isEmpty()) this.nextSpawnData = Optional.empty(); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 + this.resetStatistics(); + } + +@@ -206,7 +_,7 @@ + mob.dropPreservedEquipment(level); + } + +- entity.remove(Entity.RemovalReason.DISCARDED); ++ entity.remove(Entity.RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - Add bukkit remove cause; + } + }); + if (!spawner.getOminousConfig().spawnPotentialsDefinition().isEmpty()) { diff --git a/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch new file mode 100644 index 0000000000..28b53c34d3 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java ++++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java +@@ -145,7 +_,7 @@ + yield ACTIVE; + } else if (data.isCooldownFinished(level)) { + spawner.removeOminous(level, pos); +- data.reset(); ++ data.reset(spawner); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 + yield WAITING_FOR_PLAYERS; + } else { + yield this; diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch deleted file mode 100644 index e58a4bb1dc..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java -+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawner.java -@@ -46,6 +46,11 @@ - import net.minecraft.world.phys.HitResult; - import net.minecraft.world.phys.Vec3; - import net.minecraft.world.phys.shapes.CollisionContext; -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseLootEvent; -+// CraftBukkit end - - public final class TrialSpawner { - -@@ -219,14 +224,21 @@ - } - - entityinsentient.setPersistenceRequired(); -- Optional optional1 = mobspawnerdata.getEquipment(); -+ Optional optional1 = mobspawnerdata.getEquipment(); // CraftBukkit - decompile error - - Objects.requireNonNull(entityinsentient); - optional1.ifPresent(entityinsentient::equip); - } - -- if (!world.tryAddFreshEntityWithPassengers(entity)) { -+ entity.spawnedViaMobSpawner = true; // Paper -+ entity.spawnReason = org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER; // Paper - Entity#getEntitySpawnReason -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callTrialSpawnerSpawnEvent(entity, pos).isCancelled()) { - return Optional.empty(); -+ } -+ if (!world.tryAddFreshEntityWithPassengers(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.TRIAL_SPAWNER)) { -+ // CraftBukkit end -+ return Optional.empty(); - } else { - TrialSpawner.FlameParticle trialspawner_a = this.isOminous ? TrialSpawner.FlameParticle.OMINOUS : TrialSpawner.FlameParticle.NORMAL; - -@@ -248,6 +260,15 @@ - ObjectArrayList objectarraylist = loottable.getRandomItems(lootparams); - - if (!objectarraylist.isEmpty()) { -+ // CraftBukkit start -+ BlockDispenseLootEvent spawnerDispenseLootEvent = CraftEventFactory.callBlockDispenseLootEvent(world, pos, null, objectarraylist); -+ if (spawnerDispenseLootEvent.isCancelled()) { -+ return; -+ } -+ -+ objectarraylist = new ObjectArrayList<>(spawnerDispenseLootEvent.getDispensedLoot().stream().map(CraftItemStack::asNMSCopy).toList()); -+ // CraftBukkit end -+ - ObjectListIterator objectlistiterator = objectarraylist.iterator(); - - while (objectlistiterator.hasNext()) { -@@ -370,7 +391,7 @@ - } - - public void overrideEntityToSpawn(EntityType entityType, Level world) { -- this.data.reset(); -+ this.data.reset(this); // Paper - this.normalConfig = Holder.direct(((TrialSpawnerConfig) this.normalConfig.value()).withSpawning(entityType)); - this.ominousConfig = Holder.direct(((TrialSpawnerConfig) this.ominousConfig.value()).withSpawning(entityType)); - this.setState(world, TrialSpawnerState.INACTIVE); diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch deleted file mode 100644 index 9f48f83f27..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java -+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerData.java -@@ -100,9 +100,9 @@ - this.ejectingLootTable = rewardLootTable; - } - -- public void reset() { -+ public void reset(TrialSpawner logic) { // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 - this.currentMobs.clear(); -- this.nextSpawnData = Optional.empty(); -+ if (!logic.getConfig().spawnPotentialsDefinition().isEmpty()) this.nextSpawnData = Optional.empty(); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 - this.resetStatistics(); - } - -@@ -210,7 +210,7 @@ - } - - public void resetAfterBecomingOminous(TrialSpawner logic, ServerLevel world) { -- Stream stream = this.currentMobs.stream(); -+ Stream stream = this.currentMobs.stream(); // CraftBukkit - decompile error - - Objects.requireNonNull(world); - stream.map(world::getEntity).forEach((entity) -> { -@@ -222,7 +222,7 @@ - entityinsentient.dropPreservedEquipment(world); - } - -- entity.remove(Entity.RemovalReason.DISCARDED); -+ entity.remove(Entity.RemovalReason.DISCARDED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - Add bukkit remove cause; - } - }); - if (!logic.getOminousConfig().spawnPotentialsDefinition().isEmpty()) { diff --git a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch b/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch deleted file mode 100644 index 293d3ea411..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java -+++ b/net/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState.java -@@ -145,7 +145,7 @@ - yield ACTIVE; - } else if (trialSpawnerData.isCooldownFinished(world)) { - logic.removeOminous(world, pos); -- trialSpawnerData.reset(); -+ trialSpawnerData.reset(logic); // Paper - Fix TrialSpawner forgets assigned mob; MC-273635 - yield WAITING_FOR_PLAYERS; - } else { - yield this;