diff options
author | Nassim Jahnke <[email protected]> | 2024-04-25 12:27:57 +0200 |
---|---|---|
committer | Nassim Jahnke <[email protected]> | 2024-04-25 12:27:57 +0200 |
commit | ec4ada852ef617875e1d58c60063f4c1089aa7fa (patch) | |
tree | eb486b250ab20ee0330be18e3e6e9ee419761e36 /patches/unapplied | |
parent | f6ea3736a7e4466785d2884de71f3763bf4f34cc (diff) | |
download | Paper-ec4ada852ef617875e1d58c60063f4c1089aa7fa.tar.gz Paper-ec4ada852ef617875e1d58c60063f4c1089aa7fa.zip |
Apply and move up non-optimization patches
Diffstat (limited to 'patches/unapplied')
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 */ |