diff --git a/gradle.properties b/gradle.properties index bce90dd4..b262ef8b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.dreeam.leaf version = 1.20.6-R0.1-SNAPSHOT -galeCommit = 6582b9b215859997f52debf81c75dfb7aec3e2ac +galeCommit = 593d73f96816716e0ef7c017140b914bf0c93279 org.gradle.caching = true org.gradle.parallel = true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a..5208d7e1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-rc-1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a42..b740cf13 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/patches/api/0001-Leaf-config-files.patch b/patches/api/0001-Leaf-config-files.patch index 309dc019..58975780 100644 --- a/patches/api/0001-Leaf-config-files.patch +++ b/patches/api/0001-Leaf-config-files.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Leaf config files diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index db539f0324f2d7c9a9bcb2738bd8eb4158f8d4b5..defa5be01d2f396a1e46c3ad9aa1d20e7c505424 100644 +index 359dcc9e25a49df5b79e568bfbf7a03e79b6d645..4fefbde12a189a481efd0fd0fec06ff0bd02a57b 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2307,6 +2307,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2310,6 +2310,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi // Paper end diff --git a/patches/api/0003-Purpur-API-Changes.patch b/patches/api/0003-Purpur-API-Changes.patch index d4200ddc..8d6bb68b 100644 --- a/patches/api/0003-Purpur-API-Changes.patch +++ b/patches/api/0003-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: a90a4730d672968428e371f024c8317b64eba9af +Commit: a398e71e9d559597b85108ca91b929738352582e Patches below are removed in this patch: Pufferfish-API-Changes.patch @@ -33,10 +33,10 @@ index a736d7bcdc5861a01b66ba36158db1c716339346..22fc165fd9c95f0f3ae1be7a0857e48c @Override diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java -index 1a4eae45a9352fcc55b8c8a63a126d734604e8c6..a3c696dfb2d6b00ba3f681b74e2cd56c65cf16b2 100644 +index 8dfb22c3cf06c8037ca709ebd486a37c71a5a352..76dbc19ab0b87a3b081dbc38e8185268a50f4e3e 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java -@@ -2974,4 +2974,127 @@ public final class Bukkit { +@@ -2977,4 +2977,127 @@ public final class Bukkit { public static Server.Spigot spigot() { return server.spigot(); } @@ -255,10 +255,10 @@ index 918a045165cdcde264bc24082b7afebb407271de..687d11619379aead7f665d4a5f8f8bcc + // Purpur end } diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java -index 82d009c0bbe4b3026a535e02d6e0ed20c7bd525d..0366400fe6dea7af40badaa3335b49ff5992a516 100644 +index 7a337fe908915f8ea487a0b9236c511cb07d5e66..1dd02e2782364bf25521088cf8858d3443643447 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java -@@ -11653,4 +11653,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla +@@ -11657,4 +11657,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla public boolean isEnabledByFeature(@NotNull World world) { return Bukkit.getDataPackManager().isEnabledByFeature(this, world); } @@ -411,10 +411,10 @@ index 30298a629b39bd43ce14b414fc697b2dfcbea89c..ce00af9121de7a910aaea4e0685a06d4 + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java -index defa5be01d2f396a1e46c3ad9aa1d20e7c505424..20b9547f892e6da0337e1f19015fbb2d144cf871 100644 +index 4fefbde12a189a481efd0fd0fec06ff0bd02a57b..5f306e9cf3ca332338a82414a420f3c7a58c31fe 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java -@@ -2307,6 +2307,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2310,6 +2310,18 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi // Paper end @@ -433,7 +433,7 @@ index defa5be01d2f396a1e46c3ad9aa1d20e7c505424..20b9547f892e6da0337e1f19015fbb2d // Leaf start @NotNull public org.bukkit.configuration.file.YamlConfiguration getLeafConfig() -@@ -2624,4 +2636,104 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi +@@ -2627,4 +2639,104 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi long getLastTickOversleepTime(); // Gale end - YAPFA - last tick time - API @@ -996,10 +996,10 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc + // Purpur end } diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 0b3a1f3285fc0d8954f4204a93d3905df01cd828..2ba39b38a97333f867bcabdf593448ca14255703 100644 +index ba3edf4cb1a2fc0529465d6973ec086291bae41c..04392bebe3a0ca1cff8932610393cb3dbec1c722 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3806,4 +3806,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3816,4 +3816,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM @Override Spigot spigot(); // Spigot end diff --git a/patches/api/0007-KeYi-Player-Skull-API.patch b/patches/api/0007-KeYi-Player-Skull-API.patch index 717de8ce..6c134b85 100644 --- a/patches/api/0007-KeYi-Player-Skull-API.patch +++ b/patches/api/0007-KeYi-Player-Skull-API.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index 2ba39b38a97333f867bcabdf593448ca14255703..fbe4f03bec652e096c46496f1f52080ce43982eb 100644 +index 04392bebe3a0ca1cff8932610393cb3dbec1c722..2d454fb1446c2d8808253b4f020c0afda341545c 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3925,4 +3925,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3935,4 +3935,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM sendDeathScreen(message); } // Purpur end diff --git a/patches/api/0008-Slice-Smooth-Teleports.patch b/patches/api/0008-Slice-Smooth-Teleports.patch index 1f2aa941..53cb64a9 100644 --- a/patches/api/0008-Slice-Smooth-Teleports.patch +++ b/patches/api/0008-Slice-Smooth-Teleports.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java -index fbe4f03bec652e096c46496f1f52080ce43982eb..55a578e216cbc160d98d5f5675d8e3c52fa8c178 100644 +index 2d454fb1446c2d8808253b4f020c0afda341545c..e2dbb6bf5a424d7d8b9e9b233badc2fe8cbbf28f 100644 --- a/src/main/java/org/bukkit/entity/Player.java +++ b/src/main/java/org/bukkit/entity/Player.java -@@ -3628,6 +3628,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM +@@ -3638,6 +3638,19 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM String getClientBrandName(); // Paper end diff --git a/patches/generated-api/0001-Purpur-generated-api-Changes.patch b/patches/generated-api/0001-Purpur-generated-api-Changes.patch index 2783be27..48273f9f 100644 --- a/patches/generated-api/0001-Purpur-generated-api-Changes.patch +++ b/patches/generated-api/0001-Purpur-generated-api-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur generated-api Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: a90a4730d672968428e371f024c8317b64eba9af +Commit: a398e71e9d559597b85108ca91b929738352582e diff --git a/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/com/destroystokyo/paper/entity/ai/VanillaGoal.java index 43f4deacef349502cbb207aafc4f9cb7a75177c5..6b692c24a62e2172116a6b9c371b1c0e2411c27e 100644 diff --git a/patches/server/0010-Purpur-Server-Changes.patch b/patches/server/0010-Purpur-Server-Changes.patch index 76c8e771..f7ba92db 100644 --- a/patches/server/0010-Purpur-Server-Changes.patch +++ b/patches/server/0010-Purpur-Server-Changes.patch @@ -9,7 +9,7 @@ Fix-pufferfish-issues.patch Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: a90a4730d672968428e371f024c8317b64eba9af +Commit: a398e71e9d559597b85108ca91b929738352582e Patches below are removed in this patch: Metrics changes in Purpur-config-files.patch @@ -657,10 +657,10 @@ index a024c697a65bbab27408da1d6a75e531d9719b47..e4fab82b369f2c2ea0d8c8acd814d061 // Paper end - Add drops to shear events continue; diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index 6da6a7befa2dc8988900abee03d24ba894939932..8c9e214f6d77b3118750f63398a5f3881989cb42 100644 +index 20dbef631bbb10285cc8060652247d00b2e1472e..364bbcd77316e781eefa5e40738b368331324d77 100644 --- a/src/main/java/net/minecraft/network/Connection.java +++ b/src/main/java/net/minecraft/network/Connection.java -@@ -608,11 +608,20 @@ public class Connection extends SimpleChannelInboundHandler> { +@@ -609,11 +609,20 @@ public class Connection extends SimpleChannelInboundHandler> { private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world private static int joinAttemptsThisTick; // Paper - Buffer joins to world private static int currTick; // Paper - Buffer joins to world @@ -1279,7 +1279,7 @@ index cdcbd708b7ee74002428ca8a148d857912ce14ab..bda8c6af98945d3e5fa671b9b3bc016d } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index f4829e31111bb640901e8143ed3afa4de3e28b7d..ada4956a0b204cb098e90979aff14db32455f481 100644 +index f4829e31111bb640901e8143ed3afa4de3e28b7d..2707bc1dc8b45a239ffe0b0aeffe96a1359b9a5c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -299,6 +299,10 @@ public class ServerPlayer extends Player { @@ -1392,7 +1392,15 @@ index f4829e31111bb640901e8143ed3afa4de3e28b7d..ada4956a0b204cb098e90979aff14db3 } ((ServerLevel) this.level()).updateSleepingPlayerList(); -@@ -1974,6 +2017,26 @@ public class ServerPlayer extends Player { +@@ -1640,6 +1683,7 @@ public class ServerPlayer extends Player { + + @Override + public void openTextEdit(SignBlockEntity sign, boolean front) { ++ if (level().purpurConfig.signAllowColors) this.connection.send(sign.getTranslatedUpdatePacket(textFilteringEnabled, front)); // Purpur + this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos())); + this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), front)); + } +@@ -1974,6 +2018,26 @@ public class ServerPlayer extends Player { this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -1419,7 +1427,7 @@ index f4829e31111bb640901e8143ed3afa4de3e28b7d..ada4956a0b204cb098e90979aff14db3 @Override public void displayClientMessage(Component message, boolean overlay) { this.sendSystemMessage(message, overlay); -@@ -2299,8 +2362,68 @@ public class ServerPlayer extends Player { +@@ -2299,8 +2363,68 @@ public class ServerPlayer extends Player { public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -1488,7 +1496,7 @@ index f4829e31111bb640901e8143ed3afa4de3e28b7d..ada4956a0b204cb098e90979aff14db3 public ServerStatsCounter getStats() { return this.stats; } -@@ -2868,4 +2991,50 @@ public class ServerPlayer extends Player { +@@ -2868,4 +2992,50 @@ public class ServerPlayer extends Player { return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -1614,7 +1622,7 @@ index 83196467cf7152ba756f5f6d179ee17c00a4325f..5972362c1c968dbabb799824227c6ae3 try { String channels = payload.toString(com.google.common.base.Charsets.UTF_8); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a002389dd 100644 +index 79894b08d778a73336b3d265759baeb837d14ada..8432a36a7b047cf2d930735feb426233769e1931 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -336,6 +336,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -1692,7 +1700,86 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1315,8 +1344,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1221,10 +1250,14 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + + Objects.requireNonNull(list); + stream.forEach(list::add); ++ // Purpur start ++ boolean hasEditPerm = getCraftPlayer().hasPermission("purpur.book.color.edit"); ++ boolean hasSignPerm = hasEditPerm || getCraftPlayer().hasPermission("purpur.book.color.sign"); ++ // Purpur end + Consumer> consumer = optional.isPresent() ? (list1) -> { +- this.signBook((FilteredText) list1.get(0), list1.subList(1, list1.size()), i); ++ this.signBook((FilteredText) list1.get(0), list1.subList(1, list1.size()), i, hasSignPerm); // Purpur + } : (list1) -> { +- this.updateBookContents(list1, i); ++ this.updateBookContents(list1, i, hasEditPerm); // Purpur + }; + + this.filterTextPacket((List) list).thenAcceptAsync(consumer, this.server); +@@ -1232,13 +1265,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + } + + private void updateBookContents(List pages, int slotId) { ++ // Purpur start ++ updateBookContents(pages, slotId, false); ++ } ++ private void updateBookContents(List pages, int slotId, boolean hasPerm) { ++ // Purpur end + // CraftBukkit start + ItemStack handItem = this.player.getInventory().getItem(slotId); + ItemStack itemstack = handItem.copy(); + // CraftBukkit end + + if (itemstack.is(Items.WRITABLE_BOOK)) { +- List> list1 = pages.stream().map(this::filterableFromOutgoing).toList(); ++ List> list1 = pages.stream().map(filteredText -> filterableFromOutgoing(filteredText).map(s -> color(s, hasPerm))).toList(); // Purpur + + itemstack.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(list1)); + this.player.getInventory().setItem(slotId, CraftEventFactory.handleEditBookEvent(this.player, slotId, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent) +@@ -1246,6 +1284,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + } + + private void signBook(FilteredText title, List pages, int slotId) { ++ // Purpur start ++ signBook(title, pages, slotId, false); ++ } ++ private void signBook(FilteredText title, List pages, int slotId, boolean hasPerm) { ++ // Purpur end + ItemStack itemstack = this.player.getInventory().getItem(slotId); + + if (itemstack.is(Items.WRITABLE_BOOK)) { +@@ -1253,10 +1296,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + + itemstack1.remove(DataComponents.WRITABLE_BOOK_CONTENT); + List> list1 = (List>) (List) pages.stream().map((filteredtext1) -> { // CraftBukkit - decompile error +- return this.filterableFromOutgoing(filteredtext1).map(Component::literal); ++ return this.filterableFromOutgoing(filteredtext1).map(s -> hexColor(s, hasPerm)); // Purpur + }).toList(); + +- itemstack1.set(DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list1, true)); ++ itemstack1.set(DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title).map(s -> color(s, hasPerm)), this.player.getName().getString(), 0, list1, true)); // Purpur + CraftEventFactory.handleEditBookEvent(this.player, slotId, itemstack, itemstack1); // CraftBukkit + this.player.getInventory().setItem(slotId, itemstack); // CraftBukkit - event factory updates the hand book + } +@@ -1266,6 +1309,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl + return this.player.isTextFilteringEnabled() ? Filterable.passThrough(message.filteredOrEmpty()) : Filterable.from(message); + } + ++ // Purpur start ++ private Component hexColor(String str, boolean hasPerm) { ++ return hasPerm ? PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(str)) : Component.literal(str); ++ } ++ ++ private String color(String str, boolean hasPerm) { ++ return hasPerm ? org.bukkit.ChatColor.color(str, false) : str; ++ } ++ // Purpur end ++ + @Override + public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) { + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); +@@ -1315,8 +1368,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); @@ -1710,7 +1797,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a } else { ServerLevel worldserver = this.player.serverLevel(); -@@ -1503,7 +1540,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1503,7 +1564,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl movedWrongly = true; if (event.getLogWarning()) // Paper end @@ -1719,7 +1806,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a } // Paper } -@@ -1571,6 +1608,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1571,6 +1632,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -1728,7 +1815,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1612,6 +1651,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1612,6 +1675,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetCurrentImpulseContext(); } @@ -1742,7 +1829,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); -@@ -1651,6 +1697,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1651,6 +1721,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return false; } // Paper end - optimise out extra getCubes @@ -1758,7 +1845,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) { AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ()); Iterable iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D)); -@@ -1661,7 +1716,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1661,7 +1740,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl do { if (!iterator.hasNext()) { @@ -1767,7 +1854,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a } voxelshape1 = (VoxelShape) iterator.next(); -@@ -1999,6 +2054,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1999,6 +2078,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -1775,7 +1862,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2783,6 +2839,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2785,6 +2865,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl AABB axisalignedbb = entity.getBoundingBox(); if (this.player.canInteractWithEntity(axisalignedbb, 1.0D)) { @@ -1783,7 +1870,7 @@ index 5d02133cffb226ea7e48f517c1414ee7933b300f..45cf2c58fac237fe169a4be75c9a445a packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); -@@ -2796,6 +2853,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2798,6 +2879,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -3607,7 +3694,7 @@ index 68bc8699a9389d118411ea7134ea0e0588adf8dc..1731147abd53ca2149683ea593e96523 if (baseEntity == null) { if (this.isCombat && (!targetEntity.canBeSeenAsEnemy() || targetEntity.level().getDifficulty() == Difficulty.PEACEFUL)) { diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java -index f223e369dd8d781e32e1f06572b2ae717afd6f32..f1a3e05d993e87cb93e6916d2c5a130d7d852b6a 100644 +index f223e369dd8d781e32e1f06572b2ae717afd6f32..d88bf61a864c8d2f579a43e831cfa0e1740a5317 100644 --- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java +++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java @@ -44,12 +44,59 @@ public class Bat extends AmbientCreature { @@ -3623,7 +3710,7 @@ index f223e369dd8d781e32e1f06572b2ae717afd6f32..f1a3e05d993e87cb93e6916d2c5a130d + // Purpur start + @Override -+ public boolean shouldSendAttribute(net.minecraft.world.entity.ai.attributes.Attribute attribute) { return attribute != Attributes.FLYING_SPEED; } // Fixes log spam on clients ++ public boolean shouldSendAttribute(net.minecraft.world.entity.ai.attributes.Attribute attribute) { return attribute != Attributes.FLYING_SPEED.value(); } // Fixes log spam on clients + + @Override + public boolean isRidable() { @@ -6319,7 +6406,7 @@ index 30b87b5cb18c25cdd04eab64cfbe5acd6c1b6d84..01dc59695f295657b1cd7bb015558bfc this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0D, (double) this.turtle.getSpeed() * d1 * 0.1D, 0.0D)); diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index b5ee82e5abfecc59e2362628f288b76881855f36..b12544d1280f39b6c365317a0f4965c8d65b6497 100644 +index cebbb7341f86b13dcbfc3a41cbe264e9d4b68d60..e1f6202df983be2510436538904a45beedbdc9c2 100644 --- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java +++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java @@ -30,6 +30,8 @@ import net.minecraft.world.DifficultyInstance; @@ -6514,7 +6601,7 @@ index b5ee82e5abfecc59e2362628f288b76881855f36..b12544d1280f39b6c365317a0f4965c8 this.interestedAngleO = this.interestedAngle; if (this.isInterested()) { this.interestedAngle += (1.0F - this.interestedAngle) * 0.4F; -@@ -505,6 +629,19 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder(this, Player.class, true)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed20fb2d759 100644 +index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff6abae4a2 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java +++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java -@@ -68,14 +68,54 @@ public class Ravager extends Raider { +@@ -68,14 +68,55 @@ public class Ravager extends Raider { this.setPathfindingMalus(PathType.LEAVES, 0.0F); } @@ -10337,6 +10424,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed2 super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur ++ if (level().purpurConfig.ravagerAvoidRabbits) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.AvoidEntityGoal<>(this, net.minecraft.world.entity.animal.Rabbit.class, 6.0F, 1.0D, 1.2D)); // Purpur this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, true)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.4D)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); @@ -10345,7 +10433,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed2 this.targetSelector.addGoal(2, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (entityliving) -> { -@@ -128,7 +168,7 @@ public class Ravager extends Raider { +@@ -128,7 +169,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); @@ -10354,7 +10442,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed2 if (this.isImmobile()) { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D); } else { -@@ -138,7 +178,7 @@ public class Ravager extends Raider { +@@ -138,7 +179,7 @@ public class Ravager extends Raider { this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0)); } @@ -10363,7 +10451,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed2 boolean flag = false; AABB axisalignedbb = this.getBoundingBox().inflate(0.2D); Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator(); -@@ -148,7 +188,7 @@ public class Ravager extends Raider { +@@ -148,7 +189,7 @@ public class Ravager extends Raider { BlockState iblockdata = this.level().getBlockState(blockposition); Block block = iblockdata.getBlock(); @@ -13707,7 +13795,7 @@ index 49557d6f22c5725c663a231deab019d4f6fe95fa..046652e8f9c5dcdf7c90acb9391214ca return true; diff --git a/src/main/java/net/minecraft/world/item/CrossbowItem.java b/src/main/java/net/minecraft/world/item/CrossbowItem.java -index 0f6504a7160bc304b3af554f8740c65e2987cd37..9a8092602c96ddd77c8e6fcfe7a6f5ed733023a2 100644 +index 1f52feb5684ee1bab710e1557cf69b43b4d4dfd4..78f124f5204e4af9318ca3eeced6b1e3353b210f 100644 --- a/src/main/java/net/minecraft/world/item/CrossbowItem.java +++ b/src/main/java/net/minecraft/world/item/CrossbowItem.java @@ -60,7 +60,7 @@ public class CrossbowItem extends ProjectileWeaponItem { @@ -13871,7 +13959,7 @@ index 06497b5141e611cc7a1b6030a7b9c54b5c4eda06..28df1b3230762e52b5458ac93a85c9a5 return InteractionResult.PASS; } diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 028d86b7c26724b955e88373c80af5fea7869d67..1545ec1759526ab88838309133e2a16c634ce074 100644 +index 1856d56b2ef1f8839bf2526133b945be637ef062..ae3e1ebb26a04e744e5db3ebd68196e0d04028f1 100644 --- a/src/main/java/net/minecraft/world/item/ItemStack.java +++ b/src/main/java/net/minecraft/world/item/ItemStack.java @@ -475,6 +475,7 @@ public final class ItemStack implements DataComponentHolder { @@ -14031,7 +14119,7 @@ index 774c982f28b4f127fc3f036c19dfb47fb9ae3264..d49b60e7e643498b49c03593dc0da2f8 // Paper end - Add PlayerNameEntityEvent mob.setPersistenceRequired(); diff --git a/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java -index f91ce87491b18f4f4ae6458192d1f320b308102a..aec96d297401b705ca2af97904739afdf1134574 100644 +index d27e83c08c45b8514207f26e48ceb1a91ded94be..8f01772a7b06b2acf96a3f922cb9b481f634680b 100644 --- a/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java +++ b/src/main/java/net/minecraft/world/item/ProjectileWeaponItem.java @@ -131,6 +131,14 @@ public abstract class ProjectileWeaponItem extends Item { @@ -14893,14 +14981,14 @@ index daae7fd6e0148cfba8e359d990748a0c83a3376e..0e06b1bcd906e92c083dc74d56d6d0a2 return random.nextFloat() < f1 ? this.getNext(state) : Optional.empty(); } diff --git a/src/main/java/net/minecraft/world/level/block/ChestBlock.java b/src/main/java/net/minecraft/world/level/block/ChestBlock.java -index 491474b66856fccb038ee436968c9a5d3e4bf75c..a66499c9bd9af9da5d261a3c1aa23b1d436d4008 100644 +index 8fbfd18b3caeed769396b3ffb1b1778b2f38edc0..4cdfd2d181089e0e198d7f2690d1598b54d0ac4b 100644 --- a/src/main/java/net/minecraft/world/level/block/ChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/ChestBlock.java @@ -343,6 +343,7 @@ public class ChestBlock extends AbstractChestBlock implements } - private static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { -+ if (world instanceof Level && ((Level) world).purpurConfig.chestOpenWithBlockOnTop) return false; // Purpur + public static boolean isBlockedChestByBlock(BlockGetter world, BlockPos pos) { ++ if(world instanceof Level && ((Level) world).purpurConfig.chestOpenWithBlockOnTop) return false; // Purpur BlockPos blockposition1 = pos.above(); return world.getBlockState(blockposition1).isRedstoneConductor(world, blockposition1); @@ -15102,7 +15190,7 @@ index 7272d70c672b54dcf595beafd7a2ed33c96e35cb..d7f33c676bba279661583d908d3a58c8 ServerLevel worldserver = ((ServerLevel) world).getServer().getLevel(resourcekey); diff --git a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java -index 5f9858ef8d0ec1a74d469ab4426eb1db068873fd..d7ef772444b301d0a3f167679027195e4150b064 100644 +index ca92d49ef2010ba00c623491671dcde8ebe697c1..bd65df4588584b8bb001e9dc3656a14e381a0b6d 100644 --- a/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java +++ b/src/main/java/net/minecraft/world/level/block/EnderChestBlock.java @@ -91,7 +91,7 @@ public class EnderChestBlock extends AbstractChestBlock i @@ -16081,7 +16169,7 @@ index 7b263fab4f0014400b3b8e7e33db32f9a125f6ba..f7a6ab35c95ffda73f17843916ddb624 private int ticksInHive; diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 7963afff4b32a0e46be9bdeb413657718cfc14f5..5168e8e9ebb54b6c00acb7f2939262eb06a7426d 100644 +index 6349f2e0a5ba30d250f5ffe43771f325c0999a76..8dc1436fe78759cee5247cc28e8a18999e738a1b 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -87,6 +87,12 @@ public abstract class BlockEntity { @@ -16113,7 +16201,7 @@ index 7963afff4b32a0e46be9bdeb413657718cfc14f5..5168e8e9ebb54b6c00acb7f2939262eb protected void saveAdditional(CompoundTag nbt, HolderLookup.Provider registryLookup) {} public final CompoundTag saveWithFullMetadata(HolderLookup.Provider registryLookup) { -@@ -397,4 +412,16 @@ public abstract class BlockEntity { +@@ -407,4 +422,16 @@ public abstract class BlockEntity { T getOrDefault(DataComponentType type, T fallback); } @@ -16252,6 +16340,73 @@ index d47bc2f54c4722a0b8c419b99ee57eb3cb25d750..fdeabdcc781b605d6f3ee18528fd380f + } + // Purpur } +diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +index a28be7a332659be655f419d969e0c64e659b6c21..8cd812a25b1cc05ea14675658bf9c1503ebebd51 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java +@@ -201,16 +201,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C + return this.setText((SignText) textChanger.apply(signtext), front); + } + ++ // Purpur start ++ private Component translateColors(org.bukkit.entity.Player player, String line, Style style) { ++ if (level.purpurConfig.signAllowColors) { ++ if (player.hasPermission("purpur.sign.color")) line = line.replaceAll("(?i)&([0-9a-fr])", "\u00a7$1"); ++ if (player.hasPermission("purpur.sign.style")) line = line.replaceAll("(?i)&([l-or])", "\u00a7$1"); ++ if (player.hasPermission("purpur.sign.magic")) line = line.replaceAll("(?i)&([kr])", "\u00a7$1"); ++ ++ return io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(line)); ++ } else { ++ return Component.literal(line).setStyle(style); ++ } ++ } ++ // Purpur end ++ + private SignText setMessages(net.minecraft.world.entity.player.Player entityhuman, List list, SignText signtext, boolean front) { // CraftBukkit + SignText originalText = signtext; // CraftBukkit + for (int i = 0; i < list.size(); ++i) { + FilteredText filteredtext = (FilteredText) list.get(i); + Style chatmodifier = signtext.getMessage(i, entityhuman.isTextFilteringEnabled()).getStyle(); + ++ org.bukkit.entity.Player player = (org.bukkit.craftbukkit.entity.CraftPlayer) entityhuman.getBukkitEntity(); // Purpur + if (entityhuman.isTextFilteringEnabled()) { +- signtext = signtext.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty())).setStyle(chatmodifier)); // Paper - filter sign text to chat only ++ signtext = signtext.setMessage(i, translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty()), chatmodifier)); // Paper - filter sign text to chat only // Purpur + } else { +- signtext = signtext.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.raw())).setStyle(chatmodifier), Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty())).setStyle(chatmodifier)); // Paper - filter sign text to chat only ++ signtext = signtext.setMessage(i, translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.raw()), chatmodifier), translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty()), chatmodifier)); // Paper - filter sign text to chat only // Purpur + } + } + +@@ -345,6 +360,28 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C + return new CommandSourceStack(commandSource, Vec3.atCenterOf(pos), Vec2.ZERO, (ServerLevel) world, 2, s, (Component) object, world.getServer(), player); // Paper - Fix commands from signs not firing command events + } + ++ // Purpur start ++ public ClientboundBlockEntityDataPacket getTranslatedUpdatePacket(boolean filtered, boolean front) { ++ final CompoundTag nbt = new CompoundTag(); ++ this.saveAdditional(nbt, this.getLevel().registryAccess()); ++ final Component[] lines = front ? frontText.getMessages(filtered) : backText.getMessages(filtered); ++ final String side = front ? "front_text" : "back_text"; ++ for (int i = 0; i < 4; i++) { ++ final var component = io.papermc.paper.adventure.PaperAdventure.asAdventure(lines[i]); ++ final String line = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().serialize(component); ++ final var text = net.kyori.adventure.text.Component.text(line); ++ final String json = net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(text); ++ if (!nbt.contains(side)) nbt.put(side, new CompoundTag()); ++ final CompoundTag sideNbt = nbt.getCompound(side); ++ if (!sideNbt.contains("messages")) sideNbt.put("messages", new net.minecraft.nbt.ListTag()); ++ final net.minecraft.nbt.ListTag messagesNbt = sideNbt.getList("messages", Tag.TAG_STRING); ++ messagesNbt.set(i, net.minecraft.nbt.StringTag.valueOf(json)); ++ } ++ nbt.putString("PurpurEditor", "true"); ++ return ClientboundBlockEntityDataPacket.create(this, (blockEntity, registryAccess) -> nbt); ++ } ++ // Purpur end ++ + @Override + public ClientboundBlockEntityDataPacket getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java index 3a3182544ca338e81edfa64fd116092775ca0c6c..0e58011d22536051a18388c2d45fd1a30c2f5ffd 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -16761,7 +16916,7 @@ index 9d93130f23addb18b97d7f5ec013faef17a74529..29d2fb87a65778926aea2cfc7a5b486c + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 1231a1e2106a75417d1da9dc3e1488704b91a3f1..339b16641a7548d89fb15baad8edf0c5f95db635 100644 +index 5f9cc88fbb05e587e022160b392e58a88b7d6fea..483e16f27cd07cc9a0276db9cb9d84d8a41f97d0 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -407,6 +407,20 @@ public final class CraftServer implements Server { @@ -16954,7 +17109,7 @@ index 2abe6131cc04ed397446c2aa08f77f9da00ce8c5..f27cf4efa3675cee8e6dd45c6f366cda public Collection getStructures(int x, int z) { return this.getStructures(x, z, struct -> true); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index cd8ca1c9c8253e54c0b34d30b08fb0c2341cc98e..42f08f65207673125b288d4a74fc6d18eb713e9e 100644 +index 87a82481476e2011ed33bded68e3a5c2e9e0fd9f..49aa5493f65e6e53553290ab82f91632e9dd6d20 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -196,6 +196,14 @@ public class Main { @@ -17338,10 +17493,10 @@ index 0ad16ee7b33582d214dab41eeee378d52c8e38ed..16bd1294c219f15ada653ef810bc2d74 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 0ff9bb5f5d312503ec4b3cf3bf8c532b09a8f08b..1c1159867c78a54984219a9d56a3838c630c58d8 100644 +index 5f896948d158651cd9837364759dbfbcce6b7d21..88948526f9acf4bb2157484b80891902fd843b02 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -565,10 +565,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -574,10 +574,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setPlayerListName(String name) { @@ -17358,7 +17513,7 @@ index 0ff9bb5f5d312503ec4b3cf3bf8c532b09a8f08b..1c1159867c78a54984219a9d56a3838c if (this.getHandle().connection == null) return; // Paper - Updates are possible before the player has fully joined for (ServerPlayer player : (List) this.server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { -@@ -1429,6 +1434,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1438,6 +1443,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API @@ -17369,7 +17524,7 @@ index 0ff9bb5f5d312503ec4b3cf3bf8c532b09a8f08b..1c1159867c78a54984219a9d56a3838c return false; } -@@ -2727,6 +2736,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2736,6 +2745,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return this.getHandle().getAbilities().walkingSpeed * 2f; } @@ -17398,7 +17553,7 @@ index 0ff9bb5f5d312503ec4b3cf3bf8c532b09a8f08b..1c1159867c78a54984219a9d56a3838c private void validateSpeed(float value) { Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value); } -@@ -3513,4 +3544,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3522,4 +3553,70 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setSendViewDistance(final int viewDistance) { this.getHandle().setSendViewDistance(viewDistance); } @@ -18291,10 +18446,10 @@ index 0000000000000000000000000000000000000000..8facd29bac314d4b8897113460f78ea7 +} diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..dde2e82e8f3686f6b77fefdaad9beaeb90059c23 +index 0000000000000000000000000000000000000000..4a385c42da7ab3be46d5e47d00daee5e0b6da88f --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3284 @@ +@@ -0,0 +1,3291 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -19402,6 +19557,11 @@ index 0000000000000000000000000000000000000000..dde2e82e8f3686f6b77fefdaad9beaeb + sculkShriekerCanSummonDefault = getBoolean("blocks.sculk_shrieker.can-summon-default", sculkShriekerCanSummonDefault); + } + ++ public boolean signAllowColors = false; ++ private void signSettings() { ++ signAllowColors = getBoolean("blocks.sign.allow-colors", signAllowColors); ++ } ++ + public boolean slabHalfBreak = false; + private void slabSettings() { + slabHalfBreak = getBoolean("blocks.slab.break-individual-slabs-when-sneaking", slabHalfBreak); @@ -20689,6 +20849,7 @@ index 0000000000000000000000000000000000000000..dde2e82e8f3686f6b77fefdaad9beaeb + public boolean ravagerTakeDamageFromWater = false; + public List ravagerGriefableBlocks = new ArrayList<>(); + public boolean ravagerAlwaysDropExp = false; ++ public boolean ravagerAvoidRabbits = false; + private void ravagerSettings() { + ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable); + ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater); @@ -20719,6 +20880,7 @@ index 0000000000000000000000000000000000000000..dde2e82e8f3686f6b77fefdaad9beaeb + } + }); + ravagerAlwaysDropExp = getBoolean("mobs.ravager.always-drop-exp", ravagerAlwaysDropExp); ++ ravagerAvoidRabbits = getBoolean("mobs.ravager.avoid-rabbits", ravagerAvoidRabbits); + } + + public boolean salmonRidable = false; diff --git a/patches/server/0014-Remove-Timings.patch b/patches/server/0014-Remove-Timings.patch index 0ca5222a..ea9d6bd5 100644 --- a/patches/server/0014-Remove-Timings.patch +++ b/patches/server/0014-Remove-Timings.patch @@ -829,7 +829,7 @@ index 56b07a3306e5735816c8d89601b519cb0db6379a..524d9f0e2cc9a840fdf74bfa98537b5c return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null; } diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java -index 6db7af1f073649dc1a35e00d38e961638ca84022..1bab647e27e72bc9e94454351c86435c4e663a7e 100644 +index e246171b3eb3b8d8caab2c2535f305e8af2f3701..f6dd905176605228cbd6673ca2f77431a48248ad 100644 --- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -1,6 +1,5 @@ @@ -1519,10 +1519,10 @@ index 8099bcb9e66ddd0ae4518e8a0129d72823cdcff1..2d649d98985203005f3e423d61e88a8e } else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 45cf2c58fac237fe169a4be75c9a445a002389dd..b36daaeb6372cb217c579d0449a19a71c0c3bef1 100644 +index 8432a36a7b047cf2d930735feb426233769e1931..a42431f9788fbb75eb3daae4b7be7f8261056dcc 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2529,7 +2529,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2555,7 +2555,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl public void handleCommand(String s) { // Paper - private -> public org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher @@ -1530,7 +1530,7 @@ index 45cf2c58fac237fe169a4be75c9a445a002389dd..b36daaeb6372cb217c579d0449a19a71 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2539,7 +2538,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2565,7 +2564,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -1538,7 +1538,7 @@ index 45cf2c58fac237fe169a4be75c9a445a002389dd..b36daaeb6372cb217c579d0449a19a71 return; } -@@ -2551,8 +2549,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2577,8 +2575,6 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; @@ -1800,7 +1800,7 @@ index 14aaabb6b9595847358f65ff01c81b179d9548ea..3dc9f10f00dd982ca28a66b364e5088c @Nullable private String descriptionId; diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java -index 5168e8e9ebb54b6c00acb7f2939262eb06a7426d..4687526a250ef4e6f2aead29cf4ccb1e2e38c20e 100644 +index 8dc1436fe78759cee5247cc28e8a18999e738a1b..ce3cc2d4b8cdfae98c02e03f7290c6115b0198d7 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java @@ -33,14 +33,9 @@ import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry; @@ -1862,7 +1862,7 @@ index 35147d7a6649708c2b068065eb44831f40c3ab8e..1a2ef85cd8a62824b23f4212a5e2a70c @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 339b16641a7548d89fb15baad8edf0c5f95db635..f17eb11741d09f9b04eac98918261680b600749a 100644 +index 483e16f27cd07cc9a0276db9cb9d84d8a41f97d0..141056d003eaaee8b2a436554733e52d7d74689d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -470,7 +470,6 @@ public final class CraftServer implements Server { @@ -1874,7 +1874,7 @@ index 339b16641a7548d89fb15baad8edf0c5f95db635..f17eb11741d09f9b04eac98918261680 console.autosavePeriod = this.configuration.getInt("ticks-per.autosave"); this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose")); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java -index 42f08f65207673125b288d4a74fc6d18eb713e9e..f236e7c56c6c72f3fcdba8314f258026e6561ecb 100644 +index 49aa5493f65e6e53553290ab82f91632e9dd6d20..27edd8f2dec9426fb2b51641305a1c13c307a970 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -374,8 +374,6 @@ public class Main { @@ -2051,7 +2051,7 @@ index d67089b621f3ba07f3cf4cd64ee6ccb99ed23445..44153969844ac521cc082c9bdb3bd02e @Override diff --git a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java -index b4cca06a583fbb7918237de256f43ee61fd8ec6c..dd4a5f610e6e84a73051a8ed46e1961804356ca3 100644 +index b1fc5368d439ef77128c77468c497dc3fbb0ccb8..b95cd1755fb9187db75eec266bf79a901d16f570 100644 --- a/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java +++ b/src/main/java/org/galemc/gale/configuration/GaleGlobalConfiguration.java @@ -80,41 +80,6 @@ public class GaleGlobalConfiguration extends ConfigurationPart { @@ -2095,7 +2095,7 @@ index b4cca06a583fbb7918237de256f43ee61fd8ec6c..dd4a5f610e6e84a73051a8ed46e19618 - public Keepalive keepalive; public class Keepalive extends ConfigurationPart { - public boolean sendMultiple = true; // Gale - Purpur - send multiple keep-alive packets + public boolean sendMultiple = false; // Gale - Purpur - send multiple keep-alive packets diff --git a/src/main/java/org/galemc/gale/configuration/timingsexport/GaleConfigurationTimingsExport.java b/src/main/java/org/galemc/gale/configuration/timingsexport/GaleConfigurationTimingsExport.java deleted file mode 100644 index 579c2e69d8f6ce8398eb1297d1d1ead98c9068a5..0000000000000000000000000000000000000000 diff --git a/patches/server/0018-Remove-UseItemOnPacket-Too-Far-Check.patch b/patches/server/0018-Remove-UseItemOnPacket-Too-Far-Check.patch index b116c1df..c8910080 100644 --- a/patches/server/0018-Remove-UseItemOnPacket-Too-Far-Check.patch +++ b/patches/server/0018-Remove-UseItemOnPacket-Too-Far-Check.patch @@ -7,10 +7,10 @@ This Check is added in 1.17.x -> 1.18.x update by Mojang. By removing this check, it enable hackers to use some modules of hack clients. diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a18cbed0089a845eaf31b1ac351c60bbfede7aad..bafe83f2a9b12868a7f310ab3a63c2302cbac28f 100644 +index a42431f9788fbb75eb3daae4b7be7f8261056dcc..479fe0a14736a2eec61a7d50b7afbacc548c06e2 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1984,7 +1984,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2008,7 +2008,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl Vec3 vec3d1 = vec3d.subtract(Vec3.atCenterOf(blockposition)); double d0 = 1.0000001D; diff --git a/patches/server/0020-KeYi-Player-Skull-API.patch b/patches/server/0020-KeYi-Player-Skull-API.patch index fde0835e..40edac09 100644 --- a/patches/server/0020-KeYi-Player-Skull-API.patch +++ b/patches/server/0020-KeYi-Player-Skull-API.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/KeYiMC/KeYi diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 90338017ebcb2a690dff7dad57aa6fbb95e0ff93..fd57b7f69f3a8ee490cd4fa55c0e5480e0a4a14b 100644 +index 88948526f9acf4bb2157484b80891902fd843b02..1e5fb608ff04d2e9ae8db30896eb88fde914b8af 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -3610,4 +3610,27 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -3619,4 +3619,27 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message))); } // Purpur end diff --git a/patches/server/0027-Slice-Smooth-Teleports.patch b/patches/server/0027-Slice-Smooth-Teleports.patch index a1a68b67..d0293dde 100644 --- a/patches/server/0027-Slice-Smooth-Teleports.patch +++ b/patches/server/0027-Slice-Smooth-Teleports.patch @@ -7,7 +7,7 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index ada4956a0b204cb098e90979aff14db32455f481..31111babbb119175fa3c7b79624bb2a955b9cba3 100644 +index 2707bc1dc8b45a239ffe0b0aeffe96a1359b9a5c..7fc94ec08f6bd9649ad9168ea3b9aa6ac9bf60e0 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -303,6 +303,7 @@ public class ServerPlayer extends Player { @@ -36,10 +36,10 @@ index c9673051ce9f4096b981087eefe8b72bbe34819a..07b9f53d49d9ba8bbd3fa3da99bb7cd0 entityplayer1.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); entityplayer1.connection.send(new ClientboundSetExperiencePacket(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel)); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index fd57b7f69f3a8ee490cd4fa55c0e5480e0a4a14b..bdc69aed63d1d84a398c25ccf3dabc7ae123fad8 100644 +index 1e5fb608ff04d2e9ae8db30896eb88fde914b8af..507faaf2578d49c900ed8a3d9ab995695d47142d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -1338,6 +1338,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -1347,6 +1347,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Paper end } diff --git a/patches/server/0030-Leaves-Disable-moved-wrongly-threshold.patch b/patches/server/0030-Leaves-Disable-moved-wrongly-threshold.patch index 0240094a..f8dcca90 100644 --- a/patches/server/0030-Leaves-Disable-moved-wrongly-threshold.patch +++ b/patches/server/0030-Leaves-Disable-moved-wrongly-threshold.patch @@ -7,7 +7,7 @@ Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index f0886b4b63adb17ffe73b60f6ff6bdb734a4e8cf..b877dc3f82bdd9640f522e7bd2dc1dbf23610eb1 100644 +index 479fe0a14736a2eec61a7d50b7afbacc548c06e2..1acac1e6288e67db00599f98fbdf8ba12702c11a 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -589,7 +589,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -28,7 +28,7 @@ index f0886b4b63adb17ffe73b60f6ff6bdb734a4e8cf..b877dc3f82bdd9640f522e7bd2dc1dbf flag2 = true; // Paper - diff on change, this should be moved wrongly ServerGamePacketListenerImpl.LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", new Object[]{entity.getName().getString(), this.player.getName().getString(), Math.sqrt(d10)}); } -@@ -1462,7 +1462,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1486,7 +1486,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY, toX, toY, toZ, toYaw, toPitch, true); if (!event.isAllowed()) { @@ -37,7 +37,7 @@ index f0886b4b63adb17ffe73b60f6ff6bdb734a4e8cf..b877dc3f82bdd9640f522e7bd2dc1dbf ServerGamePacketListenerImpl.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8}); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; -@@ -1532,7 +1532,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1556,7 +1556,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl d10 = d6 * d6 + d7 * d7 + d8 * d8; boolean movedWrongly = false; // Paper - Add fail move event; rename diff --git a/patches/server/0037-Reduce-canSee-work.patch b/patches/server/0037-Reduce-canSee-work.patch index 59e09714..a6f6accb 100644 --- a/patches/server/0037-Reduce-canSee-work.patch +++ b/patches/server/0037-Reduce-canSee-work.patch @@ -36,10 +36,10 @@ index a3adc109213885a193f7131405bd4a2f6a90f9be..e971ef13754402f3de118ea24cb9f83b if (net.minecraft.world.phys.shapes.Shapes.joinIsNotEmpty(voxelshape, net.minecraft.world.phys.shapes.Shapes.create(entity.getBoundingBox()), net.minecraft.world.phys.shapes.BooleanOp.AND)) { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index bdc69aed63d1d84a398c25ccf3dabc7ae123fad8..753e5a1c99e427729c4bcb5378005fc8012996ab 100644 +index 507faaf2578d49c900ed8a3d9ab995695d47142d..d2e869d35bfb12fe2e0fe1c4e144446883166dd3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -627,6 +627,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -636,6 +636,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return false; } OfflinePlayer other = (OfflinePlayer) obj; diff --git a/patches/server/0041-Configurable-movement-speed-of-more-entities.patch b/patches/server/0041-Configurable-movement-speed-of-more-entities.patch index f46d6be3..3c8a038e 100644 --- a/patches/server/0041-Configurable-movement-speed-of-more-entities.patch +++ b/patches/server/0041-Configurable-movement-speed-of-more-entities.patch @@ -97,10 +97,10 @@ index 5bae3215ee0bf222c3bd77b3131f3d01ac6c9c41..8a643108954698425413d14eb9a2c86c @Override public EntityDimensions getDefaultDimensions(Pose pose) { diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb1bee1497 100644 +index 4a385c42da7ab3be46d5e47d00daee5e0b6da88f..7a3017177f68111c0de9b197b0bf8e4159fd561d 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1525,6 +1525,7 @@ public class PurpurWorldConfig { +@@ -1530,6 +1530,7 @@ public class PurpurWorldConfig { public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; public boolean drownedAlwaysDropExp = false; @@ -108,7 +108,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1542,6 +1543,7 @@ public class PurpurWorldConfig { +@@ -1547,6 +1548,7 @@ public class PurpurWorldConfig { drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); @@ -116,7 +116,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb } public boolean elderGuardianRidable = false; -@@ -1888,6 +1890,7 @@ public class PurpurWorldConfig { +@@ -1893,6 +1895,7 @@ public class PurpurWorldConfig { public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; public boolean huskAlwaysDropExp = false; @@ -124,7 +124,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -1904,6 +1907,7 @@ public class PurpurWorldConfig { +@@ -1909,6 +1912,7 @@ public class PurpurWorldConfig { huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); @@ -132,7 +132,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb } public boolean illusionerRidable = false; -@@ -3118,6 +3122,7 @@ public class PurpurWorldConfig { +@@ -3125,6 +3129,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -140,7 +140,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3137,6 +3142,7 @@ public class PurpurWorldConfig { +@@ -3144,6 +3149,7 @@ public class PurpurWorldConfig { zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -148,7 +148,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb } public boolean zombieHorseRidable = false; -@@ -3185,6 +3191,7 @@ public class PurpurWorldConfig { +@@ -3192,6 +3198,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -156,7 +156,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3204,6 +3211,7 @@ public class PurpurWorldConfig { +@@ -3211,6 +3218,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); @@ -164,7 +164,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb } public boolean zombifiedPiglinRidable = false; -@@ -3217,6 +3225,7 @@ public class PurpurWorldConfig { +@@ -3224,6 +3232,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = true; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -172,7 +172,7 @@ index dde2e82e8f3686f6b77fefdaad9beaeb90059c23..3416c6778faf56666a521a69382799bb private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3234,6 +3243,7 @@ public class PurpurWorldConfig { +@@ -3241,6 +3250,7 @@ public class PurpurWorldConfig { zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/patches/server/0045-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0045-Plazma-Add-missing-purpur-configuration-options.patch index b1b1a4ca..257d3a1d 100644 --- a/patches/server/0045-Plazma-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0045-Plazma-Add-missing-purpur-configuration-options.patch @@ -236,10 +236,10 @@ index 8facd29bac314d4b8897113460f78ea7ed3e82b6..300d5144d828330e3de934b1026a0f1b org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd93ec2865 100644 +index 7a3017177f68111c0de9b197b0bf8e4159fd561d..fb7bead916b9ed069b3a3351625393958da5cd83 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1165,10 +1165,20 @@ public class PurpurWorldConfig { +@@ -1170,10 +1170,20 @@ public class PurpurWorldConfig { public boolean allayRidable = false; public boolean allayRidableInWater = true; public boolean allayControllable = true; @@ -260,7 +260,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd } public boolean axolotlRidable = false; -@@ -1282,6 +1292,10 @@ public class PurpurWorldConfig { +@@ -1287,6 +1297,10 @@ public class PurpurWorldConfig { public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMax = 0.09D; public int camelBreedingTicks = 6000; @@ -271,7 +271,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd private void camelSettings() { camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); -@@ -1291,6 +1305,10 @@ public class PurpurWorldConfig { +@@ -1296,6 +1310,10 @@ public class PurpurWorldConfig { camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); @@ -282,7 +282,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd } public boolean catRidable = false; -@@ -1712,12 +1730,22 @@ public class PurpurWorldConfig { +@@ -1717,12 +1735,22 @@ public class PurpurWorldConfig { public boolean frogControllable = true; public float frogRidableJumpHeight = 0.65F; public int frogBreedingTicks = 6000; @@ -305,7 +305,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd } public boolean ghastRidable = false; -@@ -2658,12 +2686,20 @@ public class PurpurWorldConfig { +@@ -2665,12 +2693,20 @@ public class PurpurWorldConfig { public boolean snifferControllable = true; public double snifferMaxHealth = 14.0D; public int snifferBreedingTicks = 6000; @@ -326,7 +326,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd } public boolean squidRidable = false; -@@ -2757,10 +2793,20 @@ public class PurpurWorldConfig { +@@ -2764,10 +2800,20 @@ public class PurpurWorldConfig { public boolean tadpoleRidable = false; public boolean tadpoleRidableInWater = true; public boolean tadpoleControllable = true; @@ -347,7 +347,7 @@ index 3416c6778faf56666a521a69382799bb1bee1497..92e41dab573e8c979564c83377e460cd } public boolean traderLlamaRidable = false; -@@ -2973,10 +3019,20 @@ public class PurpurWorldConfig { +@@ -2980,10 +3026,20 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/patches/server/0050-SparklyPaper-Optimize-canSee-checks.patch b/patches/server/0050-SparklyPaper-Optimize-canSee-checks.patch index 90da3b54..35a9c1e8 100644 --- a/patches/server/0050-SparklyPaper-Optimize-canSee-checks.patch +++ b/patches/server/0050-SparklyPaper-Optimize-canSee-checks.patch @@ -29,7 +29,7 @@ index 3852985ebf9643f6b1b17a3d090175800bcdd079..4f2f652cf7403221226e524586aa73fe } // CraftBukkit end diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 753e5a1c99e427729c4bcb5378005fc8012996ab..ea784b6c5aeb156147900ad6161c52cc185825dd 100644 +index d2e869d35bfb12fe2e0fe1c4e144446883166dd3..65105a4fc797c9d7767fa9f837d9cef08f3f46ab 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -198,7 +198,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @@ -41,7 +41,7 @@ index 753e5a1c99e427729c4bcb5378005fc8012996ab..ea784b6c5aeb156147900ad6161c52cc private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>(); private int hash = 0; -@@ -2238,9 +2238,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -2247,9 +2247,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public boolean canSee(org.bukkit.entity.Entity entity) { diff --git a/patches/server/0059-Improve-Purpur-AFK-system.patch b/patches/server/0059-Improve-Purpur-AFK-system.patch index 3a41af78..30a40ea2 100644 --- a/patches/server/0059-Improve-Purpur-AFK-system.patch +++ b/patches/server/0059-Improve-Purpur-AFK-system.patch @@ -21,10 +21,10 @@ index 6ad5245aebba43abf10fe980e63a8872e3e15484..9f48fc9bc38e0138c45000456a49c78d org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 31111babbb119175fa3c7b79624bb2a955b9cba3..bd7f40e04f8b0117eeaa12f62c7e61d4a41d3d82 100644 +index 7fc94ec08f6bd9649ad9168ea3b9aa6ac9bf60e0..2fac364c8ce66a4c00b65adc4c723b734e165ddc 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2368,6 +2368,8 @@ public class ServerPlayer extends Player { +@@ -2369,6 +2369,8 @@ public class ServerPlayer extends Player { // Purpur Start private boolean isAfk = false; @@ -33,7 +33,7 @@ index 31111babbb119175fa3c7b79624bb2a955b9cba3..bd7f40e04f8b0117eeaa12f62c7e61d4 @Override public void setAfk(boolean afk) { -@@ -2405,6 +2407,9 @@ public class ServerPlayer extends Player { +@@ -2406,6 +2408,9 @@ public class ServerPlayer extends Player { String prefix = (split.length > 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, ""); String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, ""); if (afk) { @@ -44,10 +44,10 @@ index 31111babbb119175fa3c7b79624bb2a955b9cba3..bd7f40e04f8b0117eeaa12f62c7e61d4 } else { getBukkitEntity().setPlayerListName(prefix + scoreboardName + suffix); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index b877dc3f82bdd9640f522e7bd2dc1dbf23610eb1..492de69a877318bad5e49fb57ee461974ad562b6 100644 +index 1acac1e6288e67db00599f98fbdf8ba12702c11a..5fe21ffe8a868184b909e444798701fab52e91c1 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2230,8 +2230,34 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2254,8 +2254,34 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } diff --git a/patches/server/0062-Block-log4j-rce-exploit-in-chat.patch b/patches/server/0062-Block-log4j-rce-exploit-in-chat.patch index 5c591f42..0ac3ed49 100644 --- a/patches/server/0062-Block-log4j-rce-exploit-in-chat.patch +++ b/patches/server/0062-Block-log4j-rce-exploit-in-chat.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Block log4j rce exploit in chat diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 492de69a877318bad5e49fb57ee461974ad562b6..7aa64742d7967a74e4078af168b6b2bac005ccd1 100644 +index 5fe21ffe8a868184b909e444798701fab52e91c1..b4bab818c53c31bba220996696406a05cb57db8b 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2418,6 +2418,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2444,6 +2444,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } private void tryHandleChat(String s, Runnable runnable, boolean sync) { // CraftBukkit @@ -17,7 +17,7 @@ index 492de69a877318bad5e49fb57ee461974ad562b6..7aa64742d7967a74e4078af168b6b2ba if (ServerGamePacketListenerImpl.isChatMessageIllegal(s)) { this.disconnect(Component.translatable("multiplayer.disconnect.illegal_characters"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_CHARACTERS); // Paper } else if (this.player.isRemoved() || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) { // CraftBukkit - dead men tell no tales -@@ -2449,6 +2451,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2475,6 +2477,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl } } @@ -34,10 +34,10 @@ index 492de69a877318bad5e49fb57ee461974ad562b6..7aa64742d7967a74e4078af168b6b2ba for (int i = 0; i < message.length(); ++i) { if (!StringUtil.isAllowedChatCharacter(message.charAt(i))) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index ea784b6c5aeb156147900ad6161c52cc185825dd..f4e916c3f38900576df974269ec5c88648a29eac 100644 +index 65105a4fc797c9d7767fa9f837d9cef08f3f46ab..059aebbe2173bfc77071fad0884d92ebe756f848 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -742,6 +742,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { +@@ -751,6 +751,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (this.getHandle().connection == null) return;