From 4810a20e506bbe5c128153f64acf10a5ea23de03 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 11:33:09 +0000 Subject: [PATCH] Updated Upstream (Purpur) Upstream has released updates that appear to apply and compile correctly [Purpur Changes] PurpurMC/Purpur@61e91ba: re-add sign and book color code patches --- gradle.properties | 2 +- patches/api/0001-Purpur-API-Changes.patch | 2 +- .../server/0001-Purpur-Server-Changes.patch | 199 ++++++++++++++++-- ...0012-Optimize-default-configurations.patch | 6 +- ...missing-purpur-configuration-options.patch | 14 +- ...sable-moved-to-quickly-check-for-spe.patch | 6 +- 6 files changed, 194 insertions(+), 35 deletions(-) diff --git a/gradle.properties b/gradle.properties index da47431c9..50b5d9986 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,4 +21,4 @@ pufferfishBranch = ver/1.20 usePufferfish = false paperCommit = ac3a5471c8dcdc1d0431025781da1d524895c47a -purpurCommit = d3971ad0ae3a36eaeded6969b034f81eb1a13d25 +purpurCommit = 61e91ba5ee46bfc262b61682abf2fbee024b8ae1 diff --git a/patches/api/0001-Purpur-API-Changes.patch b/patches/api/0001-Purpur-API-Changes.patch index 63fd8631c..6b78144cc 100644 --- a/patches/api/0001-Purpur-API-Changes.patch +++ b/patches/api/0001-Purpur-API-Changes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: granny -Date: Mon, 6 May 2024 15:08:02 +0900 +Date: Tue, 7 May 2024 11:28:43 +0000 Subject: [PATCH] Purpur API Changes PurpurMC diff --git a/patches/server/0001-Purpur-Server-Changes.patch b/patches/server/0001-Purpur-Server-Changes.patch index 20479eeef..03c9ca475 100644 --- a/patches/server/0001-Purpur-Server-Changes.patch +++ b/patches/server/0001-Purpur-Server-Changes.patch @@ -1,6 +1,6 @@ From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: granny -Date: Mon, 6 May 2024 15:08:02 +0900 +Date: Tue, 7 May 2024 11:28:43 +0000 Subject: [PATCH] Purpur Server Changes PurpurMC @@ -2742,7 +2742,7 @@ index 0981d440d0dbfe4df668d1f3f1b5706a93bc4434..f72af2feb74626abbdfbfd090c153574 } // 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 8437316888c6056060a2780652147590b6fe7443..42a623254bd2886d09eb0cfeb01dd12d0dda19cf 100644 +index 8437316888c6056060a2780652147590b6fe7443..d7e4a9fe9676563845d9981523bff1a7ff12282c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -298,6 +298,10 @@ public class ServerPlayer extends Player { @@ -2883,7 +2883,15 @@ index 8437316888c6056060a2780652147590b6fe7443..42a623254bd2886d09eb0cfeb01dd12d } ((ServerLevel) this.level()).updateSleepingPlayerList(); -@@ -1977,6 +2020,26 @@ public class ServerPlayer extends Player { +@@ -1643,6 +1686,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)); + } +@@ -1977,6 +2021,26 @@ public class ServerPlayer extends Player { this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -2910,7 +2918,7 @@ index 8437316888c6056060a2780652147590b6fe7443..42a623254bd2886d09eb0cfeb01dd12d @Override public void displayClientMessage(Component message, boolean overlay) { this.sendSystemMessage(message, overlay); -@@ -2296,8 +2359,68 @@ public class ServerPlayer extends Player { +@@ -2296,8 +2360,68 @@ public class ServerPlayer extends Player { public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -2979,7 +2987,7 @@ index 8437316888c6056060a2780652147590b6fe7443..42a623254bd2886d09eb0cfeb01dd12d public ServerStatsCounter getStats() { return this.stats; } -@@ -2865,4 +2988,50 @@ public class ServerPlayer extends Player { +@@ -2865,4 +2989,50 @@ public class ServerPlayer extends Player { return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -3178,7 +3186,7 @@ index 8ac5d8ccf731100a1be690cb2ed1be82cadba8ed..8368c5ff929df9d32cdb95cc2da0e9f7 private boolean checkIfClosed(long time) { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055f2707031 100644 +index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07db1bc20da 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -332,6 +332,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @@ -3256,7 +3264,86 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause return; } -@@ -1306,8 +1335,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1212,10 +1241,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); +@@ -1223,13 +1256,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) +@@ -1237,6 +1275,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)) { +@@ -1244,10 +1287,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 + } +@@ -1257,6 +1300,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()); +@@ -1306,8 +1359,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl @Override public void handleMovePlayer(ServerboundMovePlayerPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); @@ -3274,7 +3361,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 } else { ServerLevel worldserver = this.player.serverLevel(); -@@ -1494,7 +1531,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1494,7 +1555,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl movedWrongly = true; if (event.getLogWarning()) // Paper end @@ -3283,7 +3370,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 } // Paper } -@@ -1562,6 +1599,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1562,6 +1623,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); @@ -3292,7 +3379,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); this.cserver.getPluginManager().callEvent(event); -@@ -1603,6 +1642,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1603,6 +1666,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.player.resetCurrentImpulseContext(); } @@ -3306,7 +3393,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 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(); -@@ -1642,6 +1688,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1642,6 +1712,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl return false; } // Paper end - optimise out extra getCubes @@ -3322,7 +3409,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 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)); -@@ -1652,7 +1707,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1652,7 +1731,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl do { if (!iterator.hasNext()) { @@ -3331,7 +3418,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 } voxelshape1 = (VoxelShape) iterator.next(); -@@ -1990,6 +2045,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -1990,6 +2069,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl boolean cancelled; if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) { @@ -3339,7 +3426,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2466,7 +2522,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2466,7 +2546,7 @@ 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 @@ -3348,7 +3435,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); -@@ -2476,7 +2532,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2476,7 +2556,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { @@ -3357,7 +3444,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 return; } -@@ -2489,7 +2545,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2489,7 +2569,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); return; } finally { @@ -3366,7 +3453,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 } } // CraftBukkit end -@@ -2776,6 +2832,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2776,6 +2856,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl AABB axisalignedbb = entity.getBoundingBox(); if (this.player.canInteractWithEntity(axisalignedbb, 1.0D)) { @@ -3374,7 +3461,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055 packet.dispatch(new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand); -@@ -2789,6 +2846,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl +@@ -2789,6 +2870,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -18866,6 +18953,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 93bd70c1dc2ba8b893a6087730071c81fb1132f4..fb9611866671880fc7a1a969da928b8f2ad15269 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java @@ -21193,10 +21347,10 @@ index 0000000000000000000000000000000000000000..f49108ed94f7787347c5e0a721646083 +} 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..7a9a5985b1429c25467db732678d0658aafcfafa +index 0000000000000000000000000000000000000000..710511db0e882d9795c2a1ff31570fbb05fbb0f1 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -0,0 +1,3299 @@ +@@ -0,0 +1,3304 @@ +package org.purpurmc.purpur; + +import net.minecraft.core.registries.BuiltInRegistries; @@ -22310,6 +22464,11 @@ index 0000000000000000000000000000000000000000..7a9a5985b1429c25467db732678d0658 + 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); diff --git a/patches/server/0012-Optimize-default-configurations.patch b/patches/server/0012-Optimize-default-configurations.patch index 73abde1be..aa1b78afa 100644 --- a/patches/server/0012-Optimize-default-configurations.patch +++ b/patches/server/0012-Optimize-default-configurations.patch @@ -348,7 +348,7 @@ index b02a0dddd99df1691c125660828a61cc4a5a4d02..d6ead6b1bc73df85a8e8938acd2e8465 } diff --git a/src/main/java/org/plazmamc/plazma/configurations/PlazmaConfigurations.java b/src/main/java/org/plazmamc/plazma/configurations/PlazmaConfigurations.java -index af27a8199c46c2995424a60893439c0dbc162791..65cdf3336f11350351fb2da792cfc5f9fbcc0a72 100644 +index 1cda921b88e0c01f9376eaafddde6d20e72fd346..b04075cef0468ed2c54cb7a42e4bd8f61f637033 100644 --- a/src/main/java/org/plazmamc/plazma/configurations/PlazmaConfigurations.java +++ b/src/main/java/org/plazmamc/plazma/configurations/PlazmaConfigurations.java @@ -33,6 +33,15 @@ public class PlazmaConfigurations extends Configurations