aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2024-04-25 12:27:57 +0200
committerNassim Jahnke <[email protected]>2024-04-25 12:27:57 +0200
commitec4ada852ef617875e1d58c60063f4c1089aa7fa (patch)
treeeb486b250ab20ee0330be18e3e6e9ee419761e36 /patches/unapplied
parentf6ea3736a7e4466785d2884de71f3763bf4f34cc (diff)
downloadPaper-ec4ada852ef617875e1d58c60063f4c1089aa7fa.tar.gz
Paper-ec4ada852ef617875e1d58c60063f4c1089aa7fa.zip
Apply and move up non-optimization patches
Diffstat (limited to 'patches/unapplied')
-rw-r--r--patches/unapplied/server/1044-Disable-memory-reserve-allocating.patch19
-rw-r--r--patches/unapplied/server/1045-Improve-tag-parser-handling.patch202
-rw-r--r--patches/unapplied/server/1049-Fix-possible-StackOverflowError-for-some-dispenses.patch109
-rw-r--r--patches/unapplied/server/1050-Properly-track-the-changed-item-from-dispense-events.patch114
-rw-r--r--patches/unapplied/server/1054-check-if-itemstack-is-stackable-first.patch19
-rw-r--r--patches/unapplied/server/1055-Fire-EntityDamageByEntityEvent-for-unowned-wither-sk.patch19
-rw-r--r--patches/unapplied/server/1057-Configurable-max-block-fluid-ticks.patch22
-rw-r--r--patches/unapplied/server/1058-disable-forced-empty-world-ticks.patch19
-rw-r--r--patches/unapplied/server/1059-Suspicious-Effect-Entry-API.patch247
-rw-r--r--patches/unapplied/server/1060-Per-world-ticks-per-spawn-settings.patch35
-rw-r--r--patches/unapplied/server/1061-Add-onboarding-message-for-initial-server-start.patch103
-rw-r--r--patches/unapplied/server/1062-Fix-DamageSource-API.patch198
-rw-r--r--patches/unapplied/server/1064-Fix-creation-of-invalid-block-entity-during-world-ge.patch40
-rw-r--r--patches/unapplied/server/1067-Item-Mutation-Fixes.patch49
14 files changed, 0 insertions, 1195 deletions
diff --git a/patches/unapplied/server/1044-Disable-memory-reserve-allocating.patch b/patches/unapplied/server/1044-Disable-memory-reserve-allocating.patch
deleted file mode 100644
index bd18c240f0..0000000000
--- a/patches/unapplied/server/1044-Disable-memory-reserve-allocating.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Warrior <[email protected]>
-Date: Thu, 18 Jan 2024 23:25:09 +0100
-Subject: [PATCH] Disable memory reserve allocating
-
-
-diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java
-index e047dee632022abfe05865d1e71838be8d5d053a..99c5038672b09d0874125e3df280174c1e8151e6 100644
---- a/src/main/java/net/minecraft/CrashReport.java
-+++ b/src/main/java/net/minecraft/CrashReport.java
-@@ -253,7 +253,7 @@ public class CrashReport {
- }
-
- public static void preload() {
-- MemoryReserve.allocate();
-+ // MemoryReserve.allocate(); // Paper - Disable memory reserve allocating
- (new CrashReport("Don't panic!", new Throwable())).getFriendlyReport();
- }
- }
diff --git a/patches/unapplied/server/1045-Improve-tag-parser-handling.patch b/patches/unapplied/server/1045-Improve-tag-parser-handling.patch
deleted file mode 100644
index 78cf8189d3..0000000000
--- a/patches/unapplied/server/1045-Improve-tag-parser-handling.patch
+++ /dev/null
@@ -1,202 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Nassim Jahnke <[email protected]>
-Date: Mon, 5 Feb 2024 11:54:04 +0100
-Subject: [PATCH] Improve tag parser handling
-
-
-diff --git a/src/main/java/com/mojang/brigadier/CommandDispatcher.java b/src/main/java/com/mojang/brigadier/CommandDispatcher.java
-index 92848b64a78fce7a92e1657c2da6fc5ee53eea44..4b4f812eb13d5f03bcf3f8724d8aa8dbbc724e8b 100644
---- a/src/main/java/com/mojang/brigadier/CommandDispatcher.java
-+++ b/src/main/java/com/mojang/brigadier/CommandDispatcher.java
-@@ -304,9 +304,15 @@ public class CommandDispatcher<S> {
- }
- final CommandContextBuilder<S> context = contextSoFar.copy();
- final StringReader reader = new StringReader(originalReader);
-+ boolean stop = false; // Paper - Handle non-recoverable exceptions
- try {
- try {
- child.parse(reader, context);
-+ // Paper start - Handle non-recoverable exceptions
-+ } catch (final io.papermc.paper.brigadier.TagParseCommandSyntaxException e) {
-+ stop = true;
-+ throw e;
-+ // Paper end - Handle non-recoverable exceptions
- } catch (final RuntimeException ex) {
- throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherParseException().createWithContext(reader, ex.getMessage());
- }
-@@ -321,6 +327,7 @@ public class CommandDispatcher<S> {
- }
- errors.put(child, ex);
- reader.setCursor(cursor);
-+ if (stop) return new ParseResults<>(contextSoFar, originalReader, errors); // Paper - Handle non-recoverable exceptions
- continue;
- }
-
-diff --git a/src/main/java/io/papermc/paper/brigadier/TagParseCommandSyntaxException.java b/src/main/java/io/papermc/paper/brigadier/TagParseCommandSyntaxException.java
-new file mode 100644
-index 0000000000000000000000000000000000000000..a375ad4ba9db990b24a2b9ff366fcba66b753815
---- /dev/null
-+++ b/src/main/java/io/papermc/paper/brigadier/TagParseCommandSyntaxException.java
-@@ -0,0 +1,15 @@
-+package io.papermc.paper.brigadier;
-+
-+import com.mojang.brigadier.LiteralMessage;
-+import com.mojang.brigadier.exceptions.CommandSyntaxException;
-+import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
-+import net.minecraft.network.chat.Component;
-+
-+public final class TagParseCommandSyntaxException extends CommandSyntaxException {
-+
-+ private static final SimpleCommandExceptionType EXCEPTION_TYPE = new SimpleCommandExceptionType(new LiteralMessage("Error parsing NBT"));
-+
-+ public TagParseCommandSyntaxException(final String message) {
-+ super(EXCEPTION_TYPE, Component.literal(message));
-+ }
-+}
-diff --git a/src/main/java/net/minecraft/nbt/TagParser.java b/src/main/java/net/minecraft/nbt/TagParser.java
-index ebe0efe488357ae895aaf752e9bc008b96db156f..c77860a141064aea6a0b510bb44d35fea90aee42 100644
---- a/src/main/java/net/minecraft/nbt/TagParser.java
-+++ b/src/main/java/net/minecraft/nbt/TagParser.java
-@@ -48,6 +48,7 @@ public class TagParser {
- }
- }, CompoundTag::toString);
- private final StringReader reader;
-+ private int depth; // Paper
-
- public static CompoundTag parseTag(String string) throws CommandSyntaxException {
- return new TagParser(new StringReader(string)).readSingleStruct();
-@@ -158,6 +159,7 @@ public class TagParser {
-
- public CompoundTag readStruct() throws CommandSyntaxException {
- this.expect('{');
-+ this.increaseDepth(); // Paper
- CompoundTag compoundTag = new CompoundTag();
- this.reader.skipWhitespace();
-
-@@ -181,6 +183,7 @@ public class TagParser {
- }
-
- this.expect('}');
-+ this.depth--; // Paper
- return compoundTag;
- }
-
-@@ -190,6 +193,7 @@ public class TagParser {
- if (!this.reader.canRead()) {
- throw ERROR_EXPECTED_VALUE.createWithContext(this.reader);
- } else {
-+ this.increaseDepth(); // Paper
- ListTag listTag = new ListTag();
- TagType<?> tagType = null;
-
-@@ -215,6 +219,7 @@ public class TagParser {
- }
-
- this.expect(']');
-+ this.depth--; // Paper
- return listTag;
- }
- }
-@@ -287,4 +292,11 @@ public class TagParser {
- this.reader.skipWhitespace();
- this.reader.expect(c);
- }
-+
-+ private void increaseDepth() throws CommandSyntaxException {
-+ this.depth++;
-+ if (this.depth > 512) {
-+ throw new io.papermc.paper.brigadier.TagParseCommandSyntaxException("NBT tag is too complex, depth > 512");
-+ }
-+ }
- }
-diff --git a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java
-index 65debad7aa7ffb1b0b19f89713ff394e8c9d245e..18e53db59082bae94922edc4baa812aa6f089576 100644
---- a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java
-+++ b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java
-@@ -181,6 +181,15 @@ public class TranslatableContents implements ComponentContents {
-
- @Override
- public <T> Optional<T> visit(FormattedText.ContentConsumer<T> visitor) {
-+ // Paper start - Count visited parts
-+ try {
-+ return this.visit(new TranslatableContentConsumer<>(visitor));
-+ } catch (IllegalArgumentException ignored) {
-+ return visitor.accept("...");
-+ }
-+ }
-+ private <T> Optional<T> visit(TranslatableContentConsumer<T> visitor) {
-+ // Paper end - Count visited parts
- this.decompose();
-
- for (FormattedText formattedText : this.decomposedParts) {
-@@ -192,6 +201,25 @@ public class TranslatableContents implements ComponentContents {
-
- return Optional.empty();
- }
-+ // Paper start - Count visited parts
-+ private static final class TranslatableContentConsumer<T> implements FormattedText.ContentConsumer<T> {
-+ private static final IllegalArgumentException EX = new IllegalArgumentException("Too long");
-+ private final FormattedText.ContentConsumer<T> visitor;
-+ private int visited;
-+
-+ private TranslatableContentConsumer(FormattedText.ContentConsumer<T> visitor) {
-+ this.visitor = visitor;
-+ }
-+
-+ @Override
-+ public Optional<T> accept(final String asString) {
-+ if (visited++ > 32) {
-+ throw EX;
-+ }
-+ return this.visitor.accept(asString);
-+ }
-+ }
-+ // Paper end - Count visited parts
-
- @Override
- public MutableComponent resolve(@Nullable CommandSourceStack source, @Nullable Entity sender, int depth) throws CommandSyntaxException {
-diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
-index a5e438a834826161c52ca9db57d234d9ff80a591..4766994cce060564370b0d24836a7da8b5e4a8a1 100644
---- a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
-+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
-@@ -14,7 +14,7 @@ public class ServerboundCommandSuggestionPacket implements Packet<ServerGamePack
-
- public ServerboundCommandSuggestionPacket(FriendlyByteBuf buf) {
- this.id = buf.readVarInt();
-- this.command = buf.readUtf(32500);
-+ this.command = buf.readUtf(2048); // Paper
- }
-
- @Override
-diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index b8db3c3a5870e9d7dbba38caf7c9e1c1f3849bde..2ad17823bf442ce0455227b64e5d3bb10d0ee2c1 100644
---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -777,6 +777,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
- return;
- }
- // Paper end - Don't suggest if tab-complete is disabled
-+ // Paper start
-+ final int index;
-+ if (packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) {
-+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM);
-+ return;
-+ }
-+ // Paper end
- // Paper start - AsyncTabCompleteEvent
- TAB_COMPLETE_EXECUTOR.execute(() -> this.handleCustomCommandSuggestions0(packet));
- }
-@@ -824,6 +831,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
- private void sendServerSuggestions(final ServerboundCommandSuggestionPacket packet, final StringReader stringreader) {
- // Paper end - AsyncTabCompleteEvent
- ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
-+ // Paper start - Handle non-recoverable exceptions
-+ if (!parseresults.getExceptions().isEmpty()
-+ && parseresults.getExceptions().values().stream().anyMatch(e -> e instanceof io.papermc.paper.brigadier.TagParseCommandSyntaxException)) {
-+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM);
-+ return;
-+ }
-+ // Paper end - Handle non-recoverable exceptions
-
- this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
- // Paper start - Don't tab-complete namespaced commands if send-namespaced is false
diff --git a/patches/unapplied/server/1049-Fix-possible-StackOverflowError-for-some-dispenses.patch b/patches/unapplied/server/1049-Fix-possible-StackOverflowError-for-some-dispenses.patch
deleted file mode 100644
index c9638c6967..0000000000
--- a/patches/unapplied/server/1049-Fix-possible-StackOverflowError-for-some-dispenses.patch
+++ /dev/null
@@ -1,109 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Sat, 29 Oct 2022 17:02:42 -0700
-Subject: [PATCH] Fix possible StackOverflowError for some dispenses
-
-For saddles, carpets, horse armor, and chests for horse-likes
-a BlockDispenseEvent handler that always mutated the item without
-changing the type would result in a SO error because when it went
-to find the replacement dispense behavior (since the item "changed")
-it didn't properly handle if the replacement was the same instance
-of dispense behavior.
-
-Additionally equippable mob heads, wither skulls, and carved pumpkins
-are subject to the same possible error.
-
-diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-index 1fb809486ee56efd3d0ef3fa02503ba9be459f68..58eccc76fe4c24c364e6c634fcca60ab771a5792 100644
---- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-@@ -348,7 +348,7 @@ public interface DispenseItemBehavior {
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-- if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != ArmorItem.DISPENSE_ITEM_BEHAVIOR) {
-+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { // Paper - fix possible StackOverflowError
- idispensebehavior.dispense(pointer, eventStack);
- return stack;
- }
-@@ -404,7 +404,7 @@ public interface DispenseItemBehavior {
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-- if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != ArmorItem.DISPENSE_ITEM_BEHAVIOR) {
-+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { // Paper - fix possible StackOverflowError
- idispensebehavior.dispense(pointer, eventStack);
- return stack;
- }
-@@ -478,7 +478,7 @@ public interface DispenseItemBehavior {
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-- if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != ArmorItem.DISPENSE_ITEM_BEHAVIOR) {
-+ if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != this) { // Paper - fix possible StackOverflowError
- idispensebehavior.dispense(pointer, eventStack);
- return stack;
- }
-@@ -924,7 +924,7 @@ public interface DispenseItemBehavior {
- OptionalDispenseItemBehavior dispensebehaviormaybe1 = new OptionalDispenseItemBehavior() {
- @Override
- protected ItemStack execute(BlockSource pointer, ItemStack stack) {
-- this.setSuccess(ArmorItem.dispenseArmor(pointer, stack));
-+ this.setSuccess(ArmorItem.dispenseArmor(pointer, stack, this)); // Paper - fix possible StackOverflowError
- return stack;
- }
- };
-@@ -978,7 +978,7 @@ public interface DispenseItemBehavior {
- stack.shrink(1);
- this.setSuccess(true);
- } else {
-- this.setSuccess(ArmorItem.dispenseArmor(pointer, stack));
-+ this.setSuccess(ArmorItem.dispenseArmor(pointer, stack, this)); // Paper - fix possible StackOverflowError
- }
-
- return stack;
-@@ -1024,7 +1024,7 @@ public interface DispenseItemBehavior {
- stack.shrink(1);
- this.setSuccess(true);
- } else {
-- this.setSuccess(ArmorItem.dispenseArmor(pointer, stack));
-+ this.setSuccess(ArmorItem.dispenseArmor(pointer, stack, this)); // Paper - fix possible StackOverflowError
- }
-
- return stack;
-diff --git a/src/main/java/net/minecraft/world/item/ArmorItem.java b/src/main/java/net/minecraft/world/item/ArmorItem.java
-index 42d87800a328f71c5127ce5599ca4c71cc9bb1cd..6b81be03f87967124b046708557e05d519aa79e4 100644
---- a/src/main/java/net/minecraft/world/item/ArmorItem.java
-+++ b/src/main/java/net/minecraft/world/item/ArmorItem.java
-@@ -43,7 +43,7 @@ public class ArmorItem extends Item implements Equipable {
- public static final DispenseItemBehavior DISPENSE_ITEM_BEHAVIOR = new DefaultDispenseItemBehavior() {
- @Override
- protected ItemStack execute(BlockSource pointer, ItemStack stack) {
-- return ArmorItem.dispenseArmor(pointer, stack) ? stack : super.execute(pointer, stack);
-+ return ArmorItem.dispenseArmor(pointer, stack, this) ? stack : super.execute(pointer, stack); // Paper - fix possible StackOverflowError
- }
- };
- protected final ArmorItem.Type type;
-@@ -53,7 +53,13 @@ public class ArmorItem extends Item implements Equipable {
- protected final ArmorMaterial material;
- private final Multimap<Attribute, AttributeModifier> defaultModifiers;
-
-+ @Deprecated @io.papermc.paper.annotation.DoNotUse // Paper
- public static boolean dispenseArmor(BlockSource pointer, ItemStack armor) {
-+ // Paper start
-+ return dispenseArmor(pointer, armor, null);
-+ }
-+ public static boolean dispenseArmor(BlockSource pointer, ItemStack armor, @javax.annotation.Nullable DispenseItemBehavior currentBehavior) {
-+ // Paper end
- BlockPos blockposition = pointer.pos().relative((Direction) pointer.state().getValue(DispenserBlock.FACING));
- List<LivingEntity> list = pointer.level().getEntitiesOfClass(LivingEntity.class, new AABB(blockposition), EntitySelector.NO_SPECTATORS.and(new EntitySelector.MobCanWearArmorEntitySelector(armor)));
-
-@@ -84,7 +90,7 @@ public class ArmorItem extends Item implements Equipable {
- // Chain to handler for new item
- ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
- DispenseItemBehavior idispensebehavior = (DispenseItemBehavior) DispenserBlock.DISPENSER_REGISTRY.get(eventStack.getItem());
-- if (idispensebehavior != DispenseItemBehavior.NOOP && idispensebehavior != ArmorItem.DISPENSE_ITEM_BEHAVIOR) {
-+ if (idispensebehavior != DispenseItemBehavior.NOOP && (currentBehavior == null || idispensebehavior != currentBehavior)) { // Paper - fix possible StackOverflowError
- idispensebehavior.dispense(pointer, eventStack);
- return true;
- }
diff --git a/patches/unapplied/server/1050-Properly-track-the-changed-item-from-dispense-events.patch b/patches/unapplied/server/1050-Properly-track-the-changed-item-from-dispense-events.patch
deleted file mode 100644
index f01bec2a48..0000000000
--- a/patches/unapplied/server/1050-Properly-track-the-changed-item-from-dispense-events.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Mon, 12 Dec 2022 12:14:03 -0800
-Subject: [PATCH] Properly track the changed item from dispense events
-
-
-diff --git a/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-index 155bd3d6d9c7d3cac7fd04de8210301251d1e17a..bc2e763a848b4bf7e9598ffe1ca2aa35a9af4677 100644
---- a/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/AbstractProjectileDispenseBehavior.java
-@@ -23,7 +23,7 @@ public abstract class AbstractProjectileDispenseBehavior extends DefaultDispense
- ServerLevel worldserver = pointer.level();
- Position iposition = DispenserBlock.getDispensePosition(pointer);
- Direction enumdirection = (Direction) pointer.state().getValue(DispenserBlock.FACING);
-- Projectile iprojectile = this.getProjectile(worldserver, iposition, stack);
-+ // Paper - move down
-
- // CraftBukkit start
- // iprojectile.shoot((double) enumdirection.getStepX(), (double) ((float) enumdirection.getStepY() + 0.1F), (double) enumdirection.getStepZ(), this.getPower(), this.getUncertainty());
-@@ -52,6 +52,7 @@ public abstract class AbstractProjectileDispenseBehavior extends DefaultDispense
- return stack;
- }
- }
-+ Projectile iprojectile = this.getProjectile(worldserver, iposition, CraftItemStack.asNMSCopy(event.getItem())); // Paper - move from above and track changed items in the dispense event
-
- iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.getPower(), this.getUncertainty());
- ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(pointer.blockEntity());
-diff --git a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-index 58eccc76fe4c24c364e6c634fcca60ab771a5792..e2e1273d787536d2fe1bdbbf8af36eb5ac220599 100644
---- a/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/DispenseItemBehavior.java
-@@ -241,10 +241,14 @@ public interface DispenseItemBehavior {
- idispensebehavior.dispense(pointer, eventStack);
- return stack;
- }
-+ // Paper start - track changed items in the dispense event
-+ itemstack1 = CraftItemStack.unwrap(event.getItem()); // unwrap is safe because the stack won't be modified
-+ entitytypes = ((SpawnEggItem) itemstack1.getItem()).getType(itemstack1.getTag());
-+ // Paper end - track changed item from dispense event
- }
-
- try {
-- entitytypes.spawn(pointer.level(), stack, (Player) null, pointer.pos().relative(enumdirection), MobSpawnType.DISPENSER, enumdirection != Direction.UP, false);
-+ entitytypes.spawn(pointer.level(), itemstack1, (Player) null, pointer.pos().relative(enumdirection), MobSpawnType.DISPENSER, enumdirection != Direction.UP, false); // Paper - track changed item in dispense event
- } catch (Exception exception) {
- DispenseItemBehavior.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", pointer.pos(), exception); // CraftBukkit - decompile error
- return ItemStack.EMPTY;
-@@ -299,10 +303,11 @@ public interface DispenseItemBehavior {
- }
- // CraftBukkit end
-
-+ final ItemStack newStack = CraftItemStack.unwrap(event.getItem()); // Paper - use event itemstack (unwrap is fine here because the stack won't be modified)
- Consumer<ArmorStand> consumer = EntityType.appendDefaultStackConfig((entityarmorstand) -> {
- entityarmorstand.setYRot(enumdirection.toYRot());
-- }, worldserver, stack, (Player) null);
-- ArmorStand entityarmorstand = (ArmorStand) EntityType.ARMOR_STAND.spawn(worldserver, stack.getTag(), consumer, blockposition, MobSpawnType.DISPENSER, false, false);
-+ }, worldserver, newStack, (Player) null); // Paper - track changed items in the dispense event
-+ ArmorStand entityarmorstand = (ArmorStand) EntityType.ARMOR_STAND.spawn(worldserver, newStack.getTag(), consumer, blockposition, MobSpawnType.DISPENSER, false, false); // Paper - track changed items in the dispense event
-
- if (entityarmorstand != null) {
- if (shrink) stack.shrink(1); // Paper - actually handle here
-@@ -582,7 +587,7 @@ public interface DispenseItemBehavior {
- }
-
- SmallFireball entitysmallfireball = new SmallFireball(worldserver, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ());
-- entitysmallfireball.setItem(itemstack1);
-+ entitysmallfireball.setItem(CraftItemStack.unwrap(event.getItem())); // Paper - track changed items in the dispense event (unwrap is save cause setItem already copies)
- entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource(pointer.blockEntity());
-
- worldserver.addFreshEntity(entitysmallfireball);
-@@ -628,6 +633,7 @@ public interface DispenseItemBehavior {
- int y = blockposition.getY();
- int z = blockposition.getZ();
- BlockState iblockdata = worldserver.getBlockState(blockposition);
-+ ItemStack dispensedItem = stack; // Paper - track changed item from the dispense event
- // Paper start - correctly check if the bucket place will succeed
- /* Taken from SolidBucketItem#emptyContents */
- boolean willEmptyContentsSolidBucketItem = dispensiblecontaineritem instanceof net.minecraft.world.item.SolidBucketItem && worldserver.isInWorldBounds(blockposition) && iblockdata.isAir();
-@@ -657,12 +663,15 @@ public interface DispenseItemBehavior {
- }
- }
-
-- dispensiblecontaineritem = (DispensibleContainerItem) CraftItemStack.asNMSCopy(event.getItem()).getItem();
-+ // Paper start - track changed item from dispense event
-+ dispensedItem = CraftItemStack.unwrap(event.getItem()); // unwrap is safe here as the stack isn't mutated
-+ dispensiblecontaineritem = (DispensibleContainerItem) dispensedItem.getItem();
-+ // Paper end - track changed item from dispense event
- }
- // CraftBukkit end
-
- if (dispensiblecontaineritem.emptyContents((Player) null, worldserver, blockposition, (BlockHitResult) null)) {
-- dispensiblecontaineritem.checkExtraContent((Player) null, worldserver, stack, blockposition);
-+ dispensiblecontaineritem.checkExtraContent((Player) null, worldserver, dispensedItem, blockposition); // Paper - track changed item from dispense event
- // CraftBukkit start - Handle stacked buckets
- Item item = Items.BUCKET;
- stack.shrink(1);
-diff --git a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-index 6f2adf2334e35e8a617a4ced0c1af2abf32bbd8d..cb308808906a8cdb127df8284e106e00553473ca 100644
---- a/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-+++ b/src/main/java/net/minecraft/core/dispenser/ShulkerBoxDispenseBehavior.java
-@@ -57,7 +57,12 @@ public class ShulkerBoxDispenseBehavior extends OptionalDispenseItemBehavior {
- // CraftBukkit end
-
- try {
-- this.setSuccess(((BlockItem) item).place(new DirectionalPlaceContext(pointer.level(), blockposition, enumdirection, stack, enumdirection1)).consumesAction());
-+ // Paper start - track changed items in the dispense event
-+ this.setSuccess(((BlockItem) item).place(new DirectionalPlaceContext(pointer.level(), blockposition, enumdirection, CraftItemStack.asNMSCopy(event.getItem()), enumdirection1)).consumesAction());
-+ if (this.isSuccess()) {
-+ stack.shrink(1); // vanilla shrink is in the place function above, manually handle it here
-+ }
-+ // Paper end - track changed items in the dispense event
- } catch (Exception exception) {
- ShulkerBoxDispenseBehavior.LOGGER.error("Error trying to place shulker box at {}", blockposition, exception);
- }
diff --git a/patches/unapplied/server/1054-check-if-itemstack-is-stackable-first.patch b/patches/unapplied/server/1054-check-if-itemstack-is-stackable-first.patch
deleted file mode 100644
index 3655bb3a13..0000000000
--- a/patches/unapplied/server/1054-check-if-itemstack-is-stackable-first.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: granny <[email protected]>
-Date: Sat, 24 Feb 2024 19:33:01 -0800
-Subject: [PATCH] check if itemstack is stackable first
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/player/Inventory.java b/src/main/java/net/minecraft/world/entity/player/Inventory.java
-index 309acf7bd07e38043aa81e0e686edba1136bd04c..96c898086f35fd83f9b1ce7e3fe53d31b2fa4c31 100644
---- a/src/main/java/net/minecraft/world/entity/player/Inventory.java
-+++ b/src/main/java/net/minecraft/world/entity/player/Inventory.java
-@@ -114,7 +114,7 @@ public class Inventory implements Container, Nameable {
- }
-
- private boolean hasRemainingSpaceForItem(ItemStack existingStack, ItemStack stack) {
-- return !existingStack.isEmpty() && ItemStack.isSameItemSameTags(existingStack, stack) && existingStack.isStackable() && existingStack.getCount() < existingStack.getMaxStackSize() && existingStack.getCount() < this.getMaxStackSize();
-+ return !existingStack.isEmpty() && existingStack.isStackable() && existingStack.getCount() < existingStack.getMaxStackSize() && existingStack.getCount() < this.getMaxStackSize() && ItemStack.isSameItemSameTags(existingStack, stack); // Paper - check if itemstack is stackable first
- }
-
- // CraftBukkit start - Watch method above! :D
diff --git a/patches/unapplied/server/1055-Fire-EntityDamageByEntityEvent-for-unowned-wither-sk.patch b/patches/unapplied/server/1055-Fire-EntityDamageByEntityEvent-for-unowned-wither-sk.patch
deleted file mode 100644
index 69eea7f52e..0000000000
--- a/patches/unapplied/server/1055-Fire-EntityDamageByEntityEvent-for-unowned-wither-sk.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: RodneyMKay <[email protected]>
-Date: Sun, 11 Feb 2024 20:05:11 +0100
-Subject: [PATCH] Fire EntityDamageByEntityEvent for unowned wither skulls
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-index 35e76fc8667d9fde5a8fc426699a617fb0a08e4b..5c7a6fe97b1f0b55b4a5dddbb684e4424688f866 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-@@ -72,7 +72,7 @@ public class WitherSkull extends AbstractHurtingProjectile {
- }
- }
- } else {
-- flag = entity.hurt(this.damageSources().magic(), 5.0F);
-+ flag = entity.hurt(this.damageSources().magic().customCausingEntity(this), 5.0F); // Paper - Fire EntityDamageByEntityEvent for unowned wither skulls
- }
-
- if (flag && entity instanceof LivingEntity) {
diff --git a/patches/unapplied/server/1057-Configurable-max-block-fluid-ticks.patch b/patches/unapplied/server/1057-Configurable-max-block-fluid-ticks.patch
deleted file mode 100644
index c1d19d41e3..0000000000
--- a/patches/unapplied/server/1057-Configurable-max-block-fluid-ticks.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Gero <[email protected]>
-Date: Mon, 19 Feb 2024 17:39:59 +0100
-Subject: [PATCH] Configurable max block/fluid ticks
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 6907d1be36fbdf0856c0e11983218d2fd1f9cb46..4bca3d20d1a01270a10c1e643a312fe462305b5d 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -849,9 +849,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
- if (!this.isDebug() && flag) {
- j = this.getGameTime();
- gameprofilerfiller.push("blockTicks");
-- this.blockTicks.tick(j, 65536, this::tickBlock);
-+ this.blockTicks.tick(j, paperConfig().environment.maxBlockTicks, this::tickBlock); // Paper - configurable max block ticks
- gameprofilerfiller.popPush("fluidTicks");
-- this.fluidTicks.tick(j, 65536, this::tickFluid);
-+ this.fluidTicks.tick(j, paperConfig().environment.maxFluidTicks, this::tickFluid); // Paper - configurable max fluid ticks
- gameprofilerfiller.pop();
- }
- this.timings.scheduledBlocks.stopTiming(); // Paper
diff --git a/patches/unapplied/server/1058-disable-forced-empty-world-ticks.patch b/patches/unapplied/server/1058-disable-forced-empty-world-ticks.patch
deleted file mode 100644
index 6f3fb1c6f0..0000000000
--- a/patches/unapplied/server/1058-disable-forced-empty-world-ticks.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Shane Freeder <[email protected]>
-Date: Tue, 21 Mar 2023 23:51:46 +0000
-Subject: [PATCH] disable forced empty world ticks
-
-
-diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
-index 4bca3d20d1a01270a10c1e643a312fe462305b5d..bf5e47e8c3706590fdc0731bd9a5858b56d06136 100644
---- a/src/main/java/net/minecraft/server/level/ServerLevel.java
-+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
-@@ -876,7 +876,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
-
- this.handlingTick = false;
- gameprofilerfiller.pop();
-- boolean flag1 = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players
-+ boolean flag1 = !paperConfig().unsupportedSettings.disableWorldTickingWhenEmpty || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players // Paper - restore this
-
- if (flag1) {
- this.resetEmptyTime();
diff --git a/patches/unapplied/server/1059-Suspicious-Effect-Entry-API.patch b/patches/unapplied/server/1059-Suspicious-Effect-Entry-API.patch
deleted file mode 100644
index 31c7a46ac6..0000000000
--- a/patches/unapplied/server/1059-Suspicious-Effect-Entry-API.patch
+++ /dev/null
@@ -1,247 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Owen1212055 <[email protected]>
-Date: Sun, 3 Mar 2024 19:43:40 +0100
-Subject: [PATCH] Suspicious Effect Entry API
-
-Exposes a new suspicious effect entry type that properly represents
-storable effects in the context of suspicious effects as they only
-define the potion effect type and duration.
-
-This differentiates them from the existing PotionEffect API found in
-bukkit and hence clarifies that storable values in the parts of the API
-in which it replaces PotionEffect.
-
-Co-authored-by: Yannick Lamprecht <[email protected]>
-
-diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
-index b453a47cadbda2e22262bcdc5454c4c6cf5b2583..983e0cdbd1bd950807967a36cba49859fb956f31 100644
---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
-+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMushroomCow.java
-@@ -32,20 +32,32 @@ public class CraftMushroomCow extends CraftCow implements MushroomCow, io.paperm
- return ImmutableList.of();
- }
-
-+ // Paper start - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- @Override
- public boolean addEffectToNextStew(PotionEffect potionEffect, boolean overwrite) {
- Preconditions.checkArgument(potionEffect != null, "PotionEffect cannot be null");
-- MobEffectInstance minecraftPotionEffect = CraftPotionUtil.fromBukkit(potionEffect);
-- if (!overwrite && this.hasEffectForNextStew(potionEffect.getType())) {
-+ return addEffectToNextStew(io.papermc.paper.potion.SuspiciousEffectEntry.create(potionEffect.getType(), potionEffect.getDuration()), overwrite);
-+ }
-+
-+ @Override
-+ public boolean addEffectToNextStew(io.papermc.paper.potion.SuspiciousEffectEntry suspiciousEffectEntry, boolean overwrite) {
-+ Preconditions.checkArgument(suspiciousEffectEntry != null, "SuspiciousEffectEntry cannot be null");
-+ MobEffect minecraftPotionEffect = CraftPotionEffectType.bukkitToMinecraft(suspiciousEffectEntry.effect());
-+ if (!overwrite && this.hasEffectForNextStew(suspiciousEffectEntry.effect())) {
- return false;
- }
-+ SuspiciousEffectHolder.EffectEntry recordSuspiciousEffect = new SuspiciousEffectHolder.EffectEntry(minecraftPotionEffect, suspiciousEffectEntry.duration());
-+ this.removeEffectFromNextStew(suspiciousEffectEntry.effect()); // Avoid duplicates of effects
-+ // Paper start - fix modification of immutable stew effects list
- if (this.getHandle().stewEffects == null) {
-- this.getHandle().stewEffects = new ArrayList<>();
-+ this.getHandle().stewEffects = List.of(recordSuspiciousEffect);
-+ } else {
-+ this.getHandle().stewEffects = io.papermc.paper.util.MCUtil.copyListAndAdd(this.getHandle().stewEffects, recordSuspiciousEffect);
- }
-- SuspiciousEffectHolder.EffectEntry recordSuspiciousEffect = new SuspiciousEffectHolder.EffectEntry(minecraftPotionEffect.getEffect(), minecraftPotionEffect.getDuration());
-- this.removeEffectFromNextStew(potionEffect.getType()); // Avoid duplicates of effects
-- return this.getHandle().stewEffects.add(recordSuspiciousEffect);
-+ // Paper end - fix modification of immutable stew effects list
-+ return true;
- }
-+ // Paper end - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-
- @Override
- public boolean removeEffectFromNextStew(PotionEffectType potionEffectType) {
-@@ -54,7 +66,21 @@ public class CraftMushroomCow extends CraftCow implements MushroomCow, io.paperm
- return false;
- }
- MobEffect minecraftPotionEffectType = CraftPotionEffectType.bukkitToMinecraft(potionEffectType);
-- return this.getHandle().stewEffects.removeIf(recordSuspiciousEffect -> recordSuspiciousEffect.effect().equals(minecraftPotionEffectType));
-+ // Paper start - fix modification of immutable stew effects list
-+ if (this.getHandle().stewEffects == null) return false;
-+
-+ final int oldSize = this.getHandle().stewEffects.size();
-+ this.getHandle().stewEffects = io.papermc.paper.util.MCUtil.copyListAndRemoveIf(
-+ this.getHandle().stewEffects, s -> java.util.Objects.equals(s.effect(), minecraftPotionEffectType)
-+ );
-+
-+ final int newSize = this.getHandle().stewEffects.size();
-+ if (newSize == 0) {
-+ this.getHandle().stewEffects = null; // Null the empty list, mojang expect this
-+ }
-+
-+ return oldSize != newSize; // Yield back if the size changed, implying an object was removed.
-+ // Paper end - fix modification of immutable stew effects list
- }
-
- @Override
-@@ -89,6 +115,43 @@ public class CraftMushroomCow extends CraftCow implements MushroomCow, io.paperm
- 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/inventory/CraftMetaSuspiciousStew.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java
-index 2c3b9f76067088efdc2250cdb5070df86e2dc0f5..243acae2c69dc46c02290ba103afc1549b618d85 100644
---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java
-+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSuspiciousStew.java
-@@ -24,7 +24,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- static final ItemMetaKey EFFECTS = new ItemMetaKey("effects", "effects");
- static final ItemMetaKey ID = new ItemMetaKey("id", "id");
-
-- private List<PotionEffect> customEffects;
-+ private List<io.papermc.paper.potion.SuspiciousEffectEntry> customEffects; // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-
- CraftMetaSuspiciousStew(CraftMetaItem meta) {
- super(meta);
-@@ -57,7 +57,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- duration = net.minecraft.world.item.SuspiciousStewItem.DEFAULT_DURATION;
- }
- // Paper end start - default duration is 160
-- this.customEffects.add(new PotionEffect(type, duration, 0));
-+ this.customEffects.add(io.papermc.paper.potion.SuspiciousEffectEntry.create(type, duration)); // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- }
- }
- }
-@@ -84,12 +84,14 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- ListTag effectList = new ListTag();
- tag.put(CraftMetaSuspiciousStew.EFFECTS.NBT, effectList);
-
-- for (PotionEffect effect : this.customEffects) {
-+ // Paper start - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-+ for (io.papermc.paper.potion.SuspiciousEffectEntry effect : this.customEffects) {
- CompoundTag effectData = new CompoundTag();
-- effectData.putString(CraftMetaSuspiciousStew.ID.NBT, effect.getType().getKey().toString());
-- if (effect.getDuration() != net.minecraft.world.item.SuspiciousStewItem.DEFAULT_DURATION) effectData.putInt(CraftMetaSuspiciousStew.DURATION.NBT, effect.getDuration()); // Paper - don't save duration if it's the default value
-+ effectData.putString(CraftMetaSuspiciousStew.ID.NBT, effect.effect().getKey().toString());
-+ if (effect.duration() != net.minecraft.world.item.SuspiciousStewItem.DEFAULT_DURATION) effectData.putInt(CraftMetaSuspiciousStew.DURATION.NBT, effect.duration()); // Paper - don't save duration if it's the default value
- effectList.add(effectData);
- }
-+ // Paper end - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- }
- }
-
-@@ -124,7 +126,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- @Override
- public List<PotionEffect> getCustomEffects() {
- if (this.hasCustomEffects()) {
-- return ImmutableList.copyOf(this.customEffects);
-+ return this.customEffects.stream().map(suspiciousEffectEntry -> suspiciousEffectEntry.effect().createEffect(suspiciousEffectEntry.duration(), 0)).toList(); // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- }
- return ImmutableList.of();
- }
-@@ -132,15 +134,21 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- @Override
- public boolean addCustomEffect(PotionEffect effect, boolean overwrite) {
- Preconditions.checkArgument(effect != null, "Potion effect cannot be null");
-+ return addCustomEffect(io.papermc.paper.potion.SuspiciousEffectEntry.create(effect.getType(), effect.getDuration()), overwrite); // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-+ }
-
-- int index = this.indexOfEffect(effect.getType());
-+ // Paper start - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-+ @Override
-+ public boolean addCustomEffect(final io.papermc.paper.potion.SuspiciousEffectEntry suspiciousEffectEntry, final boolean overwrite) {
-+ Preconditions.checkArgument(suspiciousEffectEntry != null, "Suspicious effect entry cannot be null");
-+ int index = this.indexOfEffect(suspiciousEffectEntry.effect());
- if (index != -1) {
- if (overwrite) {
-- PotionEffect old = this.customEffects.get(index);
-- if (old.getDuration() == effect.getDuration()) {
-+ io.papermc.paper.potion.SuspiciousEffectEntry old = this.customEffects.get(index);
-+ if (old.duration() == suspiciousEffectEntry.duration()) {
- return false;
- }
-- this.customEffects.set(index, effect);
-+ this.customEffects.set(index, suspiciousEffectEntry);
- return true;
- } else {
- return false;
-@@ -149,10 +157,11 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- if (this.customEffects == null) {
- this.customEffects = new ArrayList<>();
- }
-- this.customEffects.add(effect);
-+ this.customEffects.add(suspiciousEffectEntry);
- return true;
- }
- }
-+ // Paper end - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-
- @Override
- public boolean removeCustomEffect(PotionEffectType type) {
-@@ -163,10 +172,12 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- }
-
- boolean changed = false;
-- Iterator<PotionEffect> iterator = this.customEffects.iterator();
-+ // Paper start - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
-+ Iterator<io.papermc.paper.potion.SuspiciousEffectEntry> iterator = this.customEffects.iterator();
- while (iterator.hasNext()) {
-- PotionEffect effect = iterator.next();
-- if (type.equals(effect.getType())) {
-+ io.papermc.paper.potion.SuspiciousEffectEntry effect = iterator.next();
-+ if (type.equals(effect.effect())) {
-+ // Paper end - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- iterator.remove();
- changed = true;
- }
-@@ -189,7 +200,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- }
-
- for (int i = 0; i < this.customEffects.size(); i++) {
-- if (this.customEffects.get(i).getType().equals(type)) {
-+ if (this.customEffects.get(i).effect().equals(type)) { // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta
- return i;
- }
- }
-@@ -234,7 +245,7 @@ public class CraftMetaSuspiciousStew extends CraftMetaItem implements Suspicious
- super.serialize(builder);
-
- if (this.hasCustomEffects()) {
-- builder.put(CraftMetaSuspiciousStew.EFFECTS.BUKKIT, ImmutableList.copyOf(this.customEffects));
-+ builder.put(CraftMetaSuspiciousStew.EFFECTS.BUKKIT, ImmutableList.copyOf(com.google.common.collect.Lists.transform(this.customEffects, s -> new PotionEffect(s.effect(), s.duration(), 0)))); // Paper - add overloads to use suspicious effect entry to mushroom cow and suspicious stew meta - convert back to potion effect for bukkit legacy item serialisation to maintain backwards compatibility for the written format.
- }
-
- return builder;
diff --git a/patches/unapplied/server/1060-Per-world-ticks-per-spawn-settings.patch b/patches/unapplied/server/1060-Per-world-ticks-per-spawn-settings.patch
deleted file mode 100644
index cc4a0e5292..0000000000
--- a/patches/unapplied/server/1060-Per-world-ticks-per-spawn-settings.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Sat, 13 Nov 2021 12:36:26 -0800
-Subject: [PATCH] Per world ticks per spawn settings
-
-
-diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
-index a09017e74d972a12d0b88b4ade9a3532ce0ecd08..ca89d1593bf1b46c79a882db528cbca1359dc9d4 100644
---- a/src/main/java/net/minecraft/world/level/Level.java
-+++ b/src/main/java/net/minecraft/world/level/Level.java
-@@ -204,6 +204,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- return this.getChunkIfLoaded(chunkX, chunkZ) != null;
- }
- // Paper end - Use getChunkIfLoadedImmediately
-+ // Paper start - per world ticks per spawn
-+ private int getTicksPerSpawn(SpawnCategory spawnCategory) {
-+ final int perWorld = this.paperConfig().entities.spawning.ticksPerSpawn.getInt(CraftSpawnCategory.toNMS(spawnCategory));
-+ if (perWorld >= 0) {
-+ return perWorld;
-+ }
-+ return this.getCraftServer().getTicksPerSpawns(spawnCategory);
-+ }
-+ // Paper end
-
- public abstract ResourceKey<LevelStem> getTypeKey();
-
-@@ -216,7 +225,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
- // CraftBukkit Ticks things
- for (SpawnCategory spawnCategory : SpawnCategory.values()) {
- if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
-- this.ticksPerSpawnCategory.put(spawnCategory, (long) this.getCraftServer().getTicksPerSpawns(spawnCategory));
-+ this.ticksPerSpawnCategory.put(spawnCategory, this.getTicksPerSpawn(spawnCategory)); // Paper
- }
- }
-
diff --git a/patches/unapplied/server/1061-Add-onboarding-message-for-initial-server-start.patch b/patches/unapplied/server/1061-Add-onboarding-message-for-initial-server-start.patch
deleted file mode 100644
index 6210b12485..0000000000
--- a/patches/unapplied/server/1061-Add-onboarding-message-for-initial-server-start.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: leguan <[email protected]>
-Date: Sun, 10 Mar 2024 20:10:41 +0100
-Subject: [PATCH] Add onboarding message for initial server start
-
-
-diff --git a/src/main/java/io/papermc/paper/configuration/Configurations.java b/src/main/java/io/papermc/paper/configuration/Configurations.java
-index c01b4393439838976965823298f12e4762e72eff..218bf89fd7583d6db9f64754c4db8fcce5415bdb 100644
---- a/src/main/java/io/papermc/paper/configuration/Configurations.java
-+++ b/src/main/java/io/papermc/paper/configuration/Configurations.java
-@@ -126,6 +126,7 @@ public abstract class Configurations<G, W> {
- if (Files.notExists(configFile)) {
- node = CommentedConfigurationNode.root(loader.defaultOptions());
- node.node(Configuration.VERSION_FIELD).raw(this.globalConfigVersion());
-+ GlobalConfiguration.isFirstStart = true;
- } else {
- node = loader.load();
- this.verifyGlobalConfigVersion(node);
-diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
-index 31f34ac1c70df3ef6eb6f6dfd0f870b1b275adfa..30fe1c0645a07d663b08c0f988a1ab3a750bf7c4 100644
---- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
-+++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
-@@ -25,6 +25,7 @@ public class GlobalConfiguration extends ConfigurationPart {
- private static final Logger LOGGER = LogUtils.getLogger();
- static final int CURRENT_VERSION = 29; // (when you change the version, change the comment, so it conflicts on rebases): <insert changes here>
- private static GlobalConfiguration instance;
-+ public static boolean isFirstStart = false;
- public static GlobalConfiguration get() {
- return instance;
- }
-diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index f03f6922d15541c5491e5b37a3efa7ef0abef211..2dc07e5ef249636e85ad9c78e3729e9e066a8fe8 100644
---- a/src/main/java/net/minecraft/server/MinecraftServer.java
-+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1155,6 +1155,16 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
- long tickSection = Util.getNanos();
- long currentTime;
- // Paper end - further improve server tick loop
-+ // Paper start - Add onboarding message for initial server start
-+ if (io.papermc.paper.configuration.GlobalConfiguration.isFirstStart) {
-+ LOGGER.info("*************************************************************************************");
-+ LOGGER.info("This is the first time you're starting this server.");
-+ LOGGER.info("It's recommended you read our 'Getting Started' documentation for guidance.");
-+ LOGGER.info("View this and more helpful information here: https://docs.papermc.io/paper/next-steps");
-+ LOGGER.info("*************************************************************************************");
-+ }
-+ // Paper end - Add onboarding message for initial server start
-+
- while (this.running) {
- // Paper start - rewrite chunk system
- // guarantee that nothing can stop the server from halting if it can at least still tick
-diff --git a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
-index c42a9949c4d37d45883867a54222a7ab33944b39..7704a5951ac3d02020ed0f40d76500dd6ba005af 100644
---- a/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
-+++ b/src/main/java/net/minecraft/server/gui/MinecraftServerGui.java
-@@ -90,6 +90,7 @@ public class MinecraftServerGui extends JComponent {
- this.setLayout(new BorderLayout());
-
- try {
-+ this.add(this.buildOnboardingPanel(), "North"); // Paper - Add onboarding message for initial server start
- this.add(this.buildChatPanel(), "Center");
- this.add(this.buildInfoPanel(), "West");
- } catch (Exception exception) {
-@@ -115,6 +116,39 @@ public class MinecraftServerGui extends JComponent {
- return jpanel;
- }
-
-+ // Paper start - Add onboarding message for initial server start
-+ private JComponent buildOnboardingPanel() {
-+ String onboardingLink = "https://docs.papermc.io/paper/next-steps";
-+ JPanel jPanel = new JPanel();
-+
-+ javax.swing.JLabel jLabel = new javax.swing.JLabel("If you need help setting up your server you can visit:");
-+ jLabel.setFont(MinecraftServerGui.MONOSPACED);
-+
-+ javax.swing.JLabel link = new javax.swing.JLabel("<html><u> " + onboardingLink + "</u></html>");
-+ link.setFont(MinecraftServerGui.MONOSPACED);
-+ link.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
-+ link.addMouseListener(new java.awt.event.MouseAdapter() {
-+ @Override
-+ public void mouseClicked(final java.awt.event.MouseEvent e) {
-+ try {
-+ java.awt.Desktop.getDesktop().browse(java.net.URI.create(onboardingLink));
-+ } catch (java.io.IOException exception) {
-+ LOGGER.error("Unable to find a default browser. Please manually visit the website: " + onboardingLink, exception);
-+ } catch (UnsupportedOperationException exception) {
-+ LOGGER.error("This platform does not support the BROWSE action. Please manually visit the website: " + onboardingLink, exception);
-+ } catch (SecurityException exception) {
-+ LOGGER.error("This action has been denied by the security manager. Please manually visit the website: " + onboardingLink, exception);
-+ }
-+ }
-+ });
-+
-+ jPanel.add(jLabel);
-+ jPanel.add(link);
-+
-+ return jPanel;
-+ }
-+ // Paper end - Add onboarding message for initial server start
-+
- private JComponent buildPlayerPanel() {
- JList<?> jlist = new PlayerListComponent(this.server);
- JScrollPane jscrollpane = new JScrollPane(jlist, 22, 30);
diff --git a/patches/unapplied/server/1062-Fix-DamageSource-API.patch b/patches/unapplied/server/1062-Fix-DamageSource-API.patch
deleted file mode 100644
index e6ce72b632..0000000000
--- a/patches/unapplied/server/1062-Fix-DamageSource-API.patch
+++ /dev/null
@@ -1,198 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Jake Potrebic <[email protected]>
-Date: Sat, 9 Mar 2024 14:13:04 -0800
-Subject: [PATCH] Fix DamageSource API
-
-Uses the correct entity in the EntityDamageByEntity event
-Returns the correct entity for API's DamageSource#getCausingEntity
-
-diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
-index 1561b85a45f52a8162f43553f8485bfe084b8f1f..b26e4d58ea1898a5e4b31c3d6ab33f38835ab2c6 100644
---- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
-+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
-@@ -27,7 +27,8 @@ public class DamageSource {
- private boolean withSweep = false;
- private boolean melting = false;
- private boolean poison = false;
-- private Entity customCausingEntity = null; // This field is a helper for when causing entity damage is not set by vanilla
-+ @Nullable
-+ private Entity customEventDamager = null; // This field is a helper for when causing entity damage is not set by vanilla // Paper - fix DamageSource API
-
- public DamageSource sweep() {
- this.withSweep = true;
-@@ -56,13 +57,18 @@ public class DamageSource {
- return this.poison;
- }
-
-- public Entity getCausingEntity() {
-- return (this.customCausingEntity != null) ? this.customCausingEntity : this.causingEntity;
-+ // Paper start - fix DamageSource API
-+ public @Nullable Entity getCustomEventDamager() {
-+ return (this.customEventDamager != null) ? this.customEventDamager : this.directEntity;
- }
-
-- public DamageSource customCausingEntity(Entity entity) {
-+ public DamageSource customEventDamager(Entity entity) {
-+ if (this.directEntity != null) {
-+ throw new IllegalStateException("Cannot set a custom event damager entity when a direct entity is already set (report as a bug to Paper)");
-+ }
- DamageSource damageSource = this.cloneInstance();
-- damageSource.customCausingEntity = entity;
-+ damageSource.customEventDamager = entity;
-+ // Paper end - fix DamageSource API
- return damageSource;
- }
-
-diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
-index 7992375dc55492aeb6defb204b28dd267be4a6e7..637478fd8a284e6833cf8f5fa17ccf9d73d1dd3f 100644
---- a/src/main/java/net/minecraft/world/entity/Entity.java
-+++ b/src/main/java/net/minecraft/world/entity/Entity.java
-@@ -3462,7 +3462,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, S
- return;
- }
-
-- if (!this.hurt(this.damageSources().lightningBolt().customCausingEntity(lightning), 5.0F)) {
-+ if (!this.hurt(this.damageSources().lightningBolt().customEventDamager(lightning), 5.0F)) { // Paper - fix DamageSource API
- return;
- }
- // CraftBukkit end
-diff --git a/src/main/java/net/minecraft/world/entity/animal/Turtle.java b/src/main/java/net/minecraft/world/entity/animal/Turtle.java
-index dbdb6c432448b151fa4421f14235f8bad23dc720..2eb099957a3d0bae3339ff4edbab103fb348abed 100644
---- a/src/main/java/net/minecraft/world/entity/animal/Turtle.java
-+++ b/src/main/java/net/minecraft/world/entity/animal/Turtle.java
-@@ -336,7 +336,7 @@ public class Turtle extends Animal {
-
- @Override
- public void thunderHit(ServerLevel world, LightningBolt lightning) {
-- this.hurt(this.damageSources().lightningBolt().customCausingEntity(lightning), Float.MAX_VALUE); // CraftBukkit
-+ this.hurt(this.damageSources().lightningBolt().customEventDamager(lightning), Float.MAX_VALUE); // CraftBukkit // Paper - fix DamageSource API
- }
-
- @Override
-diff --git a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
-index 4dea85a8ab8ae16d02e35d226fd155891ce2319a..eaad15a4d201356c34c1a09c7fbe5c35f76a2176 100644
---- a/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
-+++ b/src/main/java/net/minecraft/world/entity/decoration/HangingEntity.java
-@@ -204,7 +204,7 @@ public abstract class HangingEntity extends Entity {
- } else {
- if (!this.isRemoved() && !this.level().isClientSide) {
- // CraftBukkit start - fire break events
-- Entity damager = (source.isIndirect()) ? source.getEntity() : source.getDirectEntity();
-+ Entity damager = (source.isIndirect() && source.getEntity() != null) ? source.getEntity() : source.getDirectEntity(); // Paper - fix DamageSource API
- HangingBreakEvent event;
- if (damager != null) {
- event = new HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damager.getBukkitEntity(), source.is(DamageTypeTags.IS_EXPLOSION) ? HangingBreakEvent.RemoveCause.EXPLOSION : HangingBreakEvent.RemoveCause.ENTITY);
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java b/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
-index a729460e35bbef134bdf0d72d8894c3df007f7b8..e6f549f1fcd261f96f0e4fc4cbe26a04c389d191 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/EvokerFangs.java
-@@ -132,7 +132,7 @@ public class EvokerFangs extends Entity implements TraceableEntity {
-
- if (target.isAlive() && !target.isInvulnerable() && target != entityliving1) {
- if (entityliving1 == null) {
-- target.hurt(this.damageSources().magic().customCausingEntity(this), 6.0F); // CraftBukkit
-+ target.hurt(this.damageSources().magic().customEventDamager(this), 6.0F); // CraftBukkit // Paper - fix DamageSource API
- } else {
- if (entityliving1.isAlliedTo((Entity) target)) {
- return;
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
-index 28690877c443ceb2bdf20e6d251c9d32f667814c..1fb1e729d6879568d8b4943071fa940325b2e5b0 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
-@@ -86,7 +86,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
-
- entityplayer.connection.teleport(teleEvent.getTo());
- entity.resetFallDistance();
-- entity.hurt(this.damageSources().fall().customCausingEntity(this), 5.0F); // CraftBukkit
-+ entity.hurt(this.damageSources().fall().customEventDamager(this), 5.0F); // CraftBukkit // Paper - fix DamageSource API
- }
- // CraftBukkit end
- this.level().playSound((Player) null, this.getX(), this.getY(), this.getZ(), SoundEvents.PLAYER_TELEPORT, SoundSource.PLAYERS);
-diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-index 5c7a6fe97b1f0b55b4a5dddbb684e4424688f866..6f49b9b8707d74330adb973e0db3cd5bccf138b6 100644
---- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-+++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java
-@@ -72,7 +72,7 @@ public class WitherSkull extends AbstractHurtingProjectile {
- }
- }
- } else {
-- flag = entity.hurt(this.damageSources().magic().customCausingEntity(this), 5.0F); // Paper - Fire EntityDamageByEntityEvent for unowned wither skulls
-+ flag = entity.hurt(this.damageSources().magic().customEventDamager(this), 5.0F); // Paper - Fire EntityDamageByEntityEvent for unowned wither skulls // Paper - fix DamageSource API
- }
-
- if (flag && entity instanceof LivingEntity) {
-diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java
-index b678da2cbb93cea7971bc3c4d324cfca18b0bc97..90a82bd7977ebe520bdcc2ab99e11452d5cf4a21 100644
---- a/src/main/java/net/minecraft/world/level/Explosion.java
-+++ b/src/main/java/net/minecraft/world/level/Explosion.java
-@@ -103,7 +103,7 @@ public class Explosion {
- this.z = z;
- this.fire = createFire;
- this.blockInteraction = destructionType;
-- this.damageSource = damageSource == null ? world.damageSources().explosion(this).customCausingEntity(entity) : damageSource.customCausingEntity(entity); // CraftBukkit - handle source entity
-+ this.damageSource = damageSource == null ? world.damageSources().explosion(this) : damageSource; // CraftBukkit - handle source entity // Paper - revert to fix DamageSource API
- this.damageCalculator = behavior == null ? this.makeDamageCalculator(entity) : behavior;
- this.smallExplosionParticles = particle;
- this.largeExplosionParticles = emitterParticle;
-diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
-index 6ae1ad21807c039726021f8f26f92042acce2fda..b7e2327c50195e8d3ca3ca3b47c7c0f9ea8e289c 100644
---- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
-+++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSource.java
-@@ -41,7 +41,7 @@ public class CraftDamageSource implements DamageSource {
-
- @Override
- public org.bukkit.entity.Entity getCausingEntity() {
-- net.minecraft.world.entity.Entity entity = this.getHandle().getCausingEntity();
-+ net.minecraft.world.entity.Entity entity = this.getHandle().getEntity(); // Paper - fix DamageSource API
- return (entity != null) ? entity.getBukkitEntity() : null;
- }
-
-@@ -65,7 +65,7 @@ public class CraftDamageSource implements DamageSource {
-
- @Override
- public boolean isIndirect() {
-- return this.getHandle().getCausingEntity() != this.getHandle().getDirectEntity();
-+ return this.getHandle().isIndirect(); // Paper - fix DamageSource API
- }
-
- @Override
-diff --git a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
-index 4c6e15535fa40aad8cf1920f392589404f9ba79c..35eb95ef6fb6a0f7ea63351e90741c489fdd15f9 100644
---- a/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
-+++ b/src/main/java/org/bukkit/craftbukkit/damage/CraftDamageSourceBuilder.java
-@@ -41,6 +41,11 @@ public class CraftDamageSourceBuilder implements DamageSource.Builder {
-
- @Override
- public DamageSource build() {
-+ // Paper start - fix DamageCause API
-+ if (this.causingEntity != null && this.directEntity == null) {
-+ throw new IllegalArgumentException("Direct entity must be set if causing entity is set");
-+ }
-+ // Paper end - fix DamageCause API
- return CraftDamageSource.buildFromBukkit(this.damageType, this.causingEntity, this.directEntity, this.damageLocation);
- }
- }
-diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index 0a041d0e56dfe1319e5174cb0e6085dc35fa5c48..c0823c612de9dc2a64cc797f061eef25c5f31359 100644
---- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -1083,7 +1083,7 @@ public class CraftEventFactory {
-
- private static EntityDamageEvent handleEntityDamageEvent(Entity entity, DamageSource source, Map<DamageModifier, Double> modifiers, Map<DamageModifier, Function<? super Double, Double>> modifierFunctions, boolean cancelled) {
- CraftDamageSource bukkitDamageSource = new CraftDamageSource(source);
-- Entity damager = source.getCausingEntity();
-+ final Entity damager = source.getCustomEventDamager(); // Paper - fix DamageSource API
- if (source.is(DamageTypeTags.IS_EXPLOSION)) {
- if (damager == null) {
- return CraftEventFactory.callEntityDamageEvent(source.getDirectBlock(), entity, DamageCause.BLOCK_EXPLOSION, bukkitDamageSource, modifiers, modifierFunctions, cancelled, source.explodedBlockState); // Paper - Include BlockState for damage
-@@ -1093,9 +1093,7 @@ public class CraftEventFactory {
- } else if (damager != null || source.getDirectEntity() != null) {
- DamageCause cause = (source.isSweep()) ? DamageCause.ENTITY_SWEEP_ATTACK : DamageCause.ENTITY_ATTACK;
-
-- if (bukkitDamageSource.isIndirect() && source.getDirectEntity() != null) {
-- damager = source.getDirectEntity();
-- }
-+ // Paper - fix DamageSource API
-
- if (damager instanceof net.minecraft.world.entity.projectile.Projectile) {
- if (damager.getBukkitEntity() instanceof ThrownPotion) {
diff --git a/patches/unapplied/server/1064-Fix-creation-of-invalid-block-entity-during-world-ge.patch b/patches/unapplied/server/1064-Fix-creation-of-invalid-block-entity-during-world-ge.patch
deleted file mode 100644
index 5f6f4e6b9c..0000000000
--- a/patches/unapplied/server/1064-Fix-creation-of-invalid-block-entity-during-world-ge.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Pierpaolo Coletta <[email protected]>
-Date: Sat, 30 Mar 2024 21:06:10 +0100
-Subject: [PATCH] Fix creation of invalid block entity during world generation
-
-
-diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-index 5ece375eaf6bcc61864997a389bb5e24625e4505..9c3f8f79c2b3389a118dce9a1558edda52446833 100644
---- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-@@ -352,6 +352,7 @@ public class WorldGenRegion implements WorldGenLevel {
- ichunkaccess.removeBlockEntity(pos);
- }
- } else {
-+ ichunkaccess.removeBlockEntity(pos); // Paper - Clear the block entity before setting up a DUMMY block entity
- CompoundTag nbttagcompound = new CompoundTag();
-
- nbttagcompound.putInt("x", pos.getX());
-diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index 6ec3fc801453fd54c25b642e6fa71c19b463311d..465458e8a7dbaf9afb32709a71c7b2620d1e1fd2 100644
---- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -1169,9 +1169,14 @@ public class LevelChunk extends ChunkAccess {
- if (this.blockEntity.getType().isValid(iblockdata)) {
- this.ticker.tick(LevelChunk.this.level, this.blockEntity.getBlockPos(), iblockdata, this.blockEntity);
- this.loggedInvalidBlockState = false;
-- } else if (!this.loggedInvalidBlockState) {
-- this.loggedInvalidBlockState = true;
-- LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata});
-+ // Paper start - Remove the Block Entity if it's invalid
-+ } else {
-+ LevelChunk.this.removeBlockEntity(this.getPos());
-+ if (!this.loggedInvalidBlockState) {
-+ this.loggedInvalidBlockState = true;
-+ LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata});
-+ }
-+ // Paper end - Remove the Block Entity if it's invalid
- }
-
- gameprofilerfiller.pop();
diff --git a/patches/unapplied/server/1067-Item-Mutation-Fixes.patch b/patches/unapplied/server/1067-Item-Mutation-Fixes.patch
deleted file mode 100644
index 4fc0800e22..0000000000
--- a/patches/unapplied/server/1067-Item-Mutation-Fixes.patch
+++ /dev/null
@@ -1,49 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Owen1212055 <[email protected]>
-Date: Wed, 20 Mar 2024 20:41:35 -0400
-Subject: [PATCH] Item Mutation Fixes
-
-
-diff --git a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
-index 343f44db579839eb61376f876b5eff2e615dc2e5..e6935b6632c7a7e07f4da459c95f564356242f98 100644
---- a/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
-+++ b/src/main/java/net/minecraft/world/inventory/EnchantmentMenu.java
-@@ -229,7 +229,7 @@ public class EnchantmentMenu extends AbstractContainerMenu {
- return false;
- } else if (this.costs[id] > 0 && !itemstack.isEmpty() && (player.experienceLevel >= j && player.experienceLevel >= this.costs[id] || player.getAbilities().instabuild)) {
- this.access.execute((world, blockposition) -> {
-- ItemStack itemstack2 = itemstack;
-+ ItemStack itemstack2 = itemstack; // Paper - diff on change
- List<EnchantmentInstance> list = this.getEnchantmentList(itemstack, id, this.costs[id]);
-
- // CraftBukkit start
-@@ -251,11 +251,18 @@ public class EnchantmentMenu extends AbstractContainerMenu {
- return;
- }
- // CraftBukkit end
-- boolean flag = itemstack.is(Items.BOOK);
-+ // Paper start
-+ itemstack2 = org.bukkit.craftbukkit.inventory.CraftItemStack.getOrCloneOnMutation(item, event.getItem());
-+ if (itemstack2 != itemstack) {
-+ this.enchantSlots.setItem(0, itemstack2);
-+ }
-+ boolean flag = itemstack2.is(Items.BOOK);
-+ // Paper end
-
- if (flag) {
-+ CompoundTag nbttagcompound = itemstack2.getTag(); // Paper - move up
- itemstack2 = new ItemStack(Items.ENCHANTED_BOOK);
-- CompoundTag nbttagcompound = itemstack.getTag();
-+ // Paper - move up
-
- if (nbttagcompound != null) {
- itemstack2.setTag(nbttagcompound.copy());
-@@ -277,7 +284,7 @@ public class EnchantmentMenu extends AbstractContainerMenu {
- EnchantmentInstance weightedrandomenchant = new EnchantmentInstance(nms, entry.getValue());
- EnchantedBookItem.addEnchantment(itemstack2, weightedrandomenchant);
- } else {
-- item.addUnsafeEnchantment(entry.getKey(), entry.getValue());
-+ CraftItemStack.asCraftMirror(itemstack2).addUnsafeEnchantment(entry.getKey(), entry.getValue()); // Paper
- }
- } catch (IllegalArgumentException e) {
- /* Just swallow invalid enchantments */