Skip to content

Commit b7601d9

Browse files
BillyGalbreathgranny
authored andcommitted
Allow color codes in books
1 parent c84be28 commit b7601d9

4 files changed

Lines changed: 76 additions & 93 deletions

File tree

patches/server/0069-Allow-color-codes-in-books.patch

Lines changed: 0 additions & 89 deletions
This file was deleted.

purpur-api/src/main/java/org/purpurmc/purpur/util/permissions/PurpurPermissions.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ public static Permission registerPermissions() {
3131

3232
DefaultPermissions.registerPermission(PREFIX + "debug.f3n", "Allows the user to use F3+N keybind to swap gamemodes", PermissionDefault.FALSE, purpur);
3333

34+
Permission book = DefaultPermissions.registerPermission(PREFIX + "book", "Allows the user to use color codes on books", PermissionDefault.FALSE, purpur);
35+
DefaultPermissions.registerPermission(PREFIX + "book.color.edit", "Allows the user to use color codes on books when editing", PermissionDefault.FALSE, book);
36+
DefaultPermissions.registerPermission(PREFIX + "book.color.sign", "Allows the user to use color codes on books when signing", PermissionDefault.FALSE, book);
37+
book.recalculatePermissibles();
38+
3439
Permission ride = DefaultPermissions.registerPermission("allow.ride", "Allows the user to ride all mobs", PermissionDefault.FALSE, purpur);
3540
for (String mob : mobs) {
3641
DefaultPermissions.registerPermission("allow.ride." + mob, "Allows the user to ride " + mob, PermissionDefault.FALSE, ride);

purpur-server/minecraft-patches/features/0001-Ridables.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,10 @@ index 8be848d3aaa34be2fa9a9de8f9f2908f0903b60f..a1ebdd491e79fff8e224095ee6058cd5
6262

6363
private void updatePlayerAttributes() {
6464
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
65-
index b083228bb3dc87794c6f177ad99832daf6925a39..bf863cfae63a50636c3fcc8fcf9761f1f117d218 100644
65+
index 8e3359e0d2b3ff0ecb5f736eed8e22133819fd36..413e47a0257a6d275fe389e5c249be34685e38cc 100644
6666
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
6767
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
68-
@@ -2770,6 +2770,8 @@ public class ServerGamePacketListenerImpl
68+
@@ -2794,6 +2794,8 @@ public class ServerGamePacketListenerImpl
6969

7070
ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event);
7171

@@ -177,7 +177,7 @@ index efee812785240c1ab1fd47514cfb236a3548f9cf..666455fff2b391b637cf1c07091e8810
177177
protected ParticleOptions getInkParticle() {
178178
return ParticleTypes.GLOW_SQUID_INK;
179179
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
180-
index f1f894db42ea71c21ac5d76223bc7208fb82dff3..5b27adec57614b6563f8ebb520035736708c195e 100644
180+
index fd518913a12651a6df719628dfedc88b70806567..3e85aa9f530bef69a678c9349f366d9c65c87311 100644
181181
--- a/net/minecraft/world/entity/LivingEntity.java
182182
+++ b/net/minecraft/world/entity/LivingEntity.java
183183
@@ -250,9 +250,9 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -5032,7 +5032,7 @@ index 47c1ad2ef30d464abb3c804260f0fd7cde193ba5..c6b3894fe085c2b565651ab3ae2f1acb
50325032
this.openTradingScreen(player, this.getDisplayName(), 1);
50335033
}
50345034
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
5035-
index a8a605188f42b7875e616424be34c4bca823dd38..f58c49e6b8f121ea56f11bc107aa236969aa3208 100644
5035+
index 7305ef5af0b13cb40b9a881a0364895395ff2072..27a0cb04dd50974a96ed420ef811d9c9f3182e52 100644
50365036
--- a/net/minecraft/world/entity/player/Player.java
50375037
+++ b/net/minecraft/world/entity/player/Player.java
50385038
@@ -218,6 +218,19 @@ public abstract class Player extends LivingEntity {

purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,73 @@
4343
Location oldTo = to.clone();
4444
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
4545
this.cserver.getPluginManager().callEvent(event);
46+
@@ -1212,31 +_,45 @@
47+
Optional<String> optional = packet.title();
48+
optional.ifPresent(list::add);
49+
list.addAll(packet.pages());
50+
+ // Purpur start - Allow color codes in books
51+
+ boolean hasEditPerm = getCraftPlayer().hasPermission("purpur.book.color.edit");
52+
+ boolean hasSignPerm = hasEditPerm || getCraftPlayer().hasPermission("purpur.book.color.sign");
53+
+ // Purpur end - Allow color codes in books
54+
Consumer<List<FilteredText>> consumer = optional.isPresent()
55+
- ? texts -> this.signBook(texts.get(0), texts.subList(1, texts.size()), slot)
56+
- : texts -> this.updateBookContents(texts, slot);
57+
+ ? texts -> this.signBook(texts.get(0), texts.subList(1, texts.size()), slot, hasSignPerm) // Purpur - Allow color codes in books
58+
+ : texts -> this.updateBookContents(texts, slot, hasEditPerm); // Purpur - Allow color codes in books
59+
this.filterTextPacket(list).thenAcceptAsync(consumer, this.server);
60+
}
61+
}
62+
63+
private void updateBookContents(List<FilteredText> pages, int index) {
64+
+ // Purpur start - Allow color codes in books
65+
+ updateBookContents(pages, index, false);
66+
+ }
67+
+ private void updateBookContents(List<FilteredText> pages, int index, boolean hasPerm) {
68+
+ // Purpur end - Allow color codes in books
69+
// CraftBukkit start
70+
ItemStack handItem = this.player.getInventory().getItem(index);
71+
ItemStack item = handItem.copy();
72+
// CraftBukkit end
73+
if (item.has(DataComponents.WRITABLE_BOOK_CONTENT)) {
74+
- List<Filterable<String>> list = pages.stream().map(this::filterableFromOutgoing).toList();
75+
+ List<Filterable<String>> list = pages.stream().map(filteredText -> filterableFromOutgoing(filteredText).map(s -> color(s, hasPerm))).toList(); // Purpur - Allow color codes in books
76+
item.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(list));
77+
this.player.getInventory().setItem(index, CraftEventFactory.handleEditBookEvent(this.player, index, handItem, item)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent)
78+
}
79+
}
80+
81+
private void signBook(FilteredText title, List<FilteredText> pages, int index) {
82+
+ // Purpur start - Allow color codes in books
83+
+ signBook(title, pages, index, false);
84+
+ }
85+
+ private void signBook(FilteredText title, List<FilteredText> pages, int index, boolean hasPerm) {
86+
+ // Purpur end - Allow color codes in books
87+
ItemStack item = this.player.getInventory().getItem(index);
88+
if (item.has(DataComponents.WRITABLE_BOOK_CONTENT)) {
89+
ItemStack itemStack = item.transmuteCopy(Items.WRITTEN_BOOK);
90+
itemStack.remove(DataComponents.WRITABLE_BOOK_CONTENT);
91+
- List<Filterable<Component>> list = pages.stream().map(filteredText -> this.filterableFromOutgoing(filteredText).<Component>map(Component::literal)).toList();
92+
+ List<Filterable<Component>> list = pages.stream().map((filteredText) -> this.filterableFromOutgoing(filteredText).map(s -> hexColor(s, hasPerm))).toList(); // Purpur - Allow color codes in books
93+
itemStack.set(
94+
DataComponents.WRITTEN_BOOK_CONTENT,
95+
new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list, true)
96+
@@ -1250,6 +_,16 @@
97+
return this.player.isTextFilteringEnabled() ? Filterable.passThrough(filteredText.filteredOrEmpty()) : Filterable.from(filteredText);
98+
}
99+
100+
+ // Purpur start - Allow color codes in books
101+
+ private Component hexColor(String str, boolean hasPerm) {
102+
+ return hasPerm ? PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(str)) : Component.literal(str);
103+
+ }
104+
+
105+
+ private String color(String str, boolean hasPerm) {
106+
+ return hasPerm ? org.bukkit.ChatColor.color(str, false) : str;
107+
+ }
108+
+ // Purpur end - Allow color codes in books
109+
+
110+
@Override
111+
public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) {
112+
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
46113
@@ -1460,7 +_,7 @@
47114
movedWrongly = true;
48115
if (event.getLogWarning())

0 commit comments

Comments
 (0)