From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Allink Date: Sun, 10 Jul 2022 09:46:20 +0100 Subject: [PATCH] Disable running commands in books by default diff --git a/src/main/java/com/github/atlasmediagroup/scissors/ScissorsConfig.java b/src/main/java/com/github/atlasmediagroup/scissors/ScissorsConfig.java index d0e2bcf4671d723d5893e0a9bc8c6e30a9b83be6..6fcbd02c02d70617e4533b450747c918ec3339d5 100644 --- a/src/main/java/com/github/atlasmediagroup/scissors/ScissorsConfig.java +++ b/src/main/java/com/github/atlasmediagroup/scissors/ScissorsConfig.java @@ -127,6 +127,12 @@ public class ScissorsConfig } } + public static boolean runCommandsInBooks = false; + + private static void runCommandsInBooks() { + runCommandsInBooks = getBoolean("runCommandsInBooks", false); + } + private static void set(String path, Object val) { config.set(path, val); diff --git a/src/main/java/net/minecraft/world/item/WrittenBookItem.java b/src/main/java/net/minecraft/world/item/WrittenBookItem.java index de11f8b4a783e7aa6029693f6812c950649fe88c..526206f11bdfc2aa7cb88649c47d707678753007 100644 --- a/src/main/java/net/minecraft/world/item/WrittenBookItem.java +++ b/src/main/java/net/minecraft/world/item/WrittenBookItem.java @@ -1,7 +1,10 @@ package net.minecraft.world.item; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.Nullable; + +import com.github.atlasmediagroup.scissors.ScissorsConfig; import net.minecraft.ChatFormatting; import net.minecraft.commands.CommandSourceStack; import net.minecraft.core.BlockPos; @@ -9,10 +12,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.chat.*; import net.minecraft.stats.Stats; import net.minecraft.util.StringUtil; import net.minecraft.world.InteractionHand; @@ -113,8 +113,7 @@ public class WrittenBookItem extends Item { public static boolean resolveBookComponents(ItemStack book, @Nullable CommandSourceStack commandSource, @Nullable Player player) { CompoundTag compoundTag = book.getTag(); - if (compoundTag != null && !compoundTag.getBoolean("resolved")) { - compoundTag.putBoolean("resolved", true); + if (compoundTag != null) { if (!makeSureTagIsValid(compoundTag)) { return false; } else { @@ -148,8 +147,41 @@ public class WrittenBookItem extends Item { component2 = new TextComponent(string); } - return Component.Serializer.toJson(component2); + return Component.Serializer.toJson(!ScissorsConfig.runCommandsInBooks ? sanitize(component2, 0) : component2); // Scissors - Allow server owners to disable run command in books + } + + // Scissors start - Allow server owners to disable run command in books + public static Component sanitize(Component component, int depth) { + if (depth > 128) { + return Component.nullToEmpty("Sanitization function depth limit exceeded"); + } + + MutableComponent component2 = component.copy(); + + final Style style = component2.getStyle(); + final ClickEvent clickEvent = style.getClickEvent(); + + if(clickEvent != null && clickEvent.getAction().equals(ClickEvent.Action.RUN_COMMAND)) + { + final String clickEventValue = clickEvent.getValue(); + + component2 = component2.copy().setStyle(style + .withClickEvent(null) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.nullToEmpty("Would've " + (clickEventValue.startsWith("/") ? "ran": "said") + ": " + clickEvent.getValue()))) + ); + } + + final List processedExtra = component2.getSiblings() + .stream() + .map(comp -> sanitize(comp, depth + 1)) + .toList(); + + component2.getSiblings().clear(); + component2.getSiblings().addAll(processedExtra); + + return component2; } + // Scissors end @Override public boolean isFoil(ItemStack stack) {