Skip to content
This repository was archived by the owner on Apr 13, 2025. It is now read-only.

Commit 9532ff0

Browse files
BillyGalbreathgranny
authored andcommitted
Signs allow color codes
1 parent bd481ee commit 9532ff0

5 files changed

Lines changed: 86 additions & 101 deletions

File tree

patches/server/0214-Signs-allow-color-codes.patch

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

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ public static Permission registerPermissions() {
5656
DefaultPermissions.registerPermission(PREFIX + "book.color.sign", "Allows the user to use color codes on books when signing", PermissionDefault.FALSE, book);
5757
book.recalculatePermissibles();
5858

59+
Permission sign = DefaultPermissions.registerPermission(PREFIX + "sign", "Allows the user to use all sign abilities", PermissionDefault.FALSE, purpur);
60+
DefaultPermissions.registerPermission(PREFIX + "sign.edit", "Allows the user to click signs to open sign editor", PermissionDefault.TRUE, sign);
61+
DefaultPermissions.registerPermission(PREFIX + "sign.color", "Allows the user to use color codes on signs", PermissionDefault.FALSE, sign);
62+
DefaultPermissions.registerPermission(PREFIX + "sign.style", "Allows the user to use style codes on signs", PermissionDefault.FALSE, sign);
63+
DefaultPermissions.registerPermission(PREFIX + "sign.magic", "Allows the user to use magic/obfuscate code on signs", PermissionDefault.FALSE, sign);
64+
sign.recalculatePermissibles();
65+
5966
Permission ride = DefaultPermissions.registerPermission("allow.ride", "Allows the user to ride all mobs", PermissionDefault.FALSE, purpur);
6067
for (String mob : mobs) {
6168
DefaultPermissions.registerPermission("allow.ride." + mob, "Allows the user to ride " + mob, PermissionDefault.FALSE, ride);

purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,14 @@
8989
}
9090

9191
((ServerLevel)this.level()).updateSleepingPlayerList();
92+
@@ -1709,6 +_,7 @@
93+
94+
@Override
95+
public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) {
96+
+ if (level().purpurConfig.signAllowColors) this.connection.send(signEntity.getTranslatedUpdatePacket(textFilteringEnabled, isFrontText)); // Purpur - Signs allow color codes
97+
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos()));
98+
this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText));
99+
}
92100
@@ -2014,6 +_,26 @@
93101
this.lastSentExp = -1; // CraftBukkit - Added to reset
94102
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
--- a/net/minecraft/world/level/block/entity/SignBlockEntity.java
2+
+++ b/net/minecraft/world/level/block/entity/SignBlockEntity.java
3+
@@ -163,16 +_,32 @@
4+
return this.setText(updater.apply(text), isFrontText);
5+
}
6+
7+
+ // Purpur start - Signs allow color codes
8+
+ private Component translateColors(org.bukkit.entity.Player player, String line, Style style) {
9+
+ if (level.purpurConfig.signAllowColors) {
10+
+ if (player.hasPermission("purpur.sign.color")) line = line.replaceAll("(?i)&([0-9a-fr])", "\u00a7$1");
11+
+ if (player.hasPermission("purpur.sign.style")) line = line.replaceAll("(?i)&([l-or])", "\u00a7$1");
12+
+ if (player.hasPermission("purpur.sign.magic")) line = line.replaceAll("(?i)&([kr])", "\u00a7$1");
13+
+
14+
+ return io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(line));
15+
+ } else {
16+
+ return Component.literal(line).setStyle(style);
17+
+ }
18+
+ }
19+
+ // Purpur end - Signs allow color codes
20+
+
21+
private SignText setMessages(Player player, List<FilteredText> filteredText, SignText text, boolean front) { // CraftBukkit
22+
SignText originalText = text; // CraftBukkit
23+
for (int i = 0; i < filteredText.size(); i++) {
24+
FilteredText filteredText1 = filteredText.get(i);
25+
Style style = text.getMessage(i, player.isTextFilteringEnabled()).getStyle();
26+
+
27+
+ org.bukkit.entity.Player craftPlayer = (org.bukkit.craftbukkit.entity.CraftPlayer) player.getBukkitEntity(); // Purpur - Signs allow color codes
28+
if (player.isTextFilteringEnabled()) {
29+
- text = text.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty())).setStyle(style)); // Paper - filter sign text to chat only
30+
+ text = text.setMessage(i, translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty()), style)); // Paper - filter sign text to chat only // Purpur - Signs allow color codes
31+
} else {
32+
text = text.setMessage(
33+
- i, Component.literal(filteredText1.raw()).setStyle(style), Component.literal(net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty())).setStyle(style) // Paper - filter sign text to chat only
34+
+ i, translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.raw()), style), translateColors(craftPlayer, net.minecraft.util.StringUtil.filterText(filteredText1.filteredOrEmpty()), style) // Paper - filter sign text to chat only // Purpur - Signs allow color codes
35+
);
36+
}
37+
}
38+
@@ -310,6 +_,28 @@
39+
// CraftBukkit - this
40+
return new CommandSourceStack(commandSource, Vec3.atCenterOf(pos), Vec2.ZERO, (ServerLevel) world, 2, string, component, world.getServer(), player); // Paper - Fix commands from signs not firing command events
41+
}
42+
+
43+
+ // Purpur start - Signs allow color codes
44+
+ public ClientboundBlockEntityDataPacket getTranslatedUpdatePacket(boolean filtered, boolean front) {
45+
+ final CompoundTag nbt = new CompoundTag();
46+
+ this.saveAdditional(nbt, this.getLevel().registryAccess());
47+
+ final Component[] lines = front ? frontText.getMessages(filtered) : backText.getMessages(filtered);
48+
+ final String side = front ? "front_text" : "back_text";
49+
+ for (int i = 0; i < 4; i++) {
50+
+ final var component = io.papermc.paper.adventure.PaperAdventure.asAdventure(lines[i]);
51+
+ final String line = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().serialize(component);
52+
+ final var text = net.kyori.adventure.text.Component.text(line);
53+
+ final String json = net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(text);
54+
+ if (!nbt.contains(side)) nbt.put(side, new CompoundTag());
55+
+ final CompoundTag sideNbt = nbt.getCompound(side);
56+
+ if (!sideNbt.contains("messages")) sideNbt.put("messages", new net.minecraft.nbt.ListTag());
57+
+ final net.minecraft.nbt.ListTag messagesNbt = sideNbt.getList("messages", Tag.TAG_STRING);
58+
+ messagesNbt.set(i, net.minecraft.nbt.StringTag.valueOf(json));
59+
+ }
60+
+ nbt.putString("PurpurEditor", "true");
61+
+ return ClientboundBlockEntityDataPacket.create(this, (blockEntity, registryAccess) -> nbt);
62+
+ }
63+
+ // Purpur end - Signs allow color codes
64+
65+
@Override
66+
public ClientboundBlockEntityDataPacket getUpdatePacket() {

purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,11 @@ private void respawnAnchorSettings() {
10081008
}
10091009
}
10101010

1011+
public boolean signAllowColors = false;
1012+
private void signSettings() {
1013+
signAllowColors = getBoolean("blocks.sign.allow-colors", signAllowColors);
1014+
}
1015+
10111016
public boolean slabHalfBreak = false;
10121017
private void slabSettings() {
10131018
slabHalfBreak = getBoolean("blocks.slab.break-individual-slabs-when-sneaking", slabHalfBreak);

0 commit comments

Comments
 (0)