mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@bf5852a Fix NPE for PlayerPostRespawnEvent#getRespawnedLocation (#11268) PaperMC/Paper@fb53074 Apply optimise collision checking in move packet handling patch PaperMC/Paper@81bfda8 [ci skip] Specify rebase location in CONTRIBUTING (#11255) PaperMC/Paper@9571983 Fix scanForLegacyEnderDragon world config (#11262) PaperMC/Paper@ec55c11 Fix indestructable light blocks (#11275) PaperMC/Paper@1b8ab11 Add Configuration for vertical Despawn Ranges (#10440) PaperMC/Paper@534ab86 [ci-skip] Revert "Add Configuration for vertical Despawn Ranges (#10440)" (#11278) PaperMC/Paper@e619744 Allow skipping of world symlink validation (#11250) PaperMC/Paper@78216fe Re-implement portalCreateRadius world config (#11267) PaperMC/Paper@4829fbf Handle custom registry elements properly (#11230)
90 lines
5.3 KiB
Diff
90 lines
5.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
|
Date: Tue, 3 Nov 2020 01:25:06 -0600
|
|
Subject: [PATCH] Allow color codes in books
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index 0ec1a50485ce0107fe1983fd079be850b2341d46..efaa369dc1a01e4e40bec8a6a5562e7c1822b1ac 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1233,10 +1233,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<List<FilteredText>> 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);
|
|
@@ -1244,13 +1248,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
}
|
|
|
|
private void updateBookContents(List<FilteredText> pages, int slotId) {
|
|
+ // Purpur start
|
|
+ updateBookContents(pages, slotId, false);
|
|
+ }
|
|
+ private void updateBookContents(List<FilteredText> 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<Filterable<String>> list1 = pages.stream().map(this::filterableFromOutgoing).toList();
|
|
+ List<Filterable<String>> 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)
|
|
@@ -1258,6 +1267,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
}
|
|
|
|
private void signBook(FilteredText title, List<FilteredText> pages, int slotId) {
|
|
+ // Purpur start
|
|
+ signBook(title, pages, slotId, false);
|
|
+ }
|
|
+ private void signBook(FilteredText title, List<FilteredText> pages, int slotId, boolean hasPerm) {
|
|
+ // Purpur end
|
|
ItemStack itemstack = this.player.getInventory().getItem(slotId);
|
|
|
|
if (itemstack.is(Items.WRITABLE_BOOK)) {
|
|
@@ -1265,10 +1279,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
itemstack1.remove(DataComponents.WRITABLE_BOOK_CONTENT);
|
|
List<Filterable<Component>> list1 = (List<Filterable<Component>>) (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
|
|
}
|
|
@@ -1278,6 +1292,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());
|