|
43 | 43 | Location oldTo = to.clone(); |
44 | 44 | PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); |
45 | 45 | 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()); |
46 | 113 | @@ -1460,7 +_,7 @@ |
47 | 114 | movedWrongly = true; |
48 | 115 | if (event.getLogWarning()) |
|
0 commit comments