From 2c9189905539cf7ad7fab4b85bad66f4967439df Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 1/7] Add MiniMessage support to CoreProtectAPI chat logger --- .../java/net/coreprotect/CoreProtectAPI.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/net/coreprotect/CoreProtectAPI.java b/src/main/java/net/coreprotect/CoreProtectAPI.java index 757427b..c1bfd25 100755 --- a/src/main/java/net/coreprotect/CoreProtectAPI.java +++ b/src/main/java/net/coreprotect/CoreProtectAPI.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -235,6 +236,30 @@ public class CoreProtectAPI extends Queue { return true; } + /** + * Logs a componentized chat message for a player. + * + * @param player + * The player who sent the message + * @param component + * The chat message + * @return True if the message was logged + */ + public boolean logChat(Player player, Component component) { + if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) { + return false; + } + + if (component == null) { + return false; + } + + long timestamp = System.currentTimeMillis() / 1000L; + // TODO: proper implementation + Queue.queuePlayerChat(player, component.insertion(), timestamp); + return true; + } + /** * Logs a command executed by a player. * From 38c557fa12e4a494465326c91d5135ac416f850b Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 2/7] Allow logging chat messages with CommandSender --- .../java/net/coreprotect/CoreProtectAPI.java | 33 ++++++++----------- .../java/net/coreprotect/consumer/Queue.java | 9 +++++ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/coreprotect/CoreProtectAPI.java b/src/main/java/net/coreprotect/CoreProtectAPI.java index c1bfd25..9080189 100755 --- a/src/main/java/net/coreprotect/CoreProtectAPI.java +++ b/src/main/java/net/coreprotect/CoreProtectAPI.java @@ -15,6 +15,7 @@ import org.bukkit.Server; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.data.BlockData; +import org.bukkit.command.CommandSender; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -216,15 +217,19 @@ public class CoreProtectAPI extends Queue { /** * Logs a chat message for a player. * - * @param player + * @param sender * The player who sent the message * @param message * The chat message * @return True if the message was logged */ - public boolean logChat(Player player, String message) { - if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) { - return false; + public boolean logChat(CommandSender sender, String message) { + Player player = null; + if (sender instanceof Player) { + player = (Player) sender; + if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) { + return false; + } } if (message == null || message.isEmpty() || message.startsWith("/")) { @@ -232,32 +237,22 @@ public class CoreProtectAPI extends Queue { } long timestamp = System.currentTimeMillis() / 1000L; - Queue.queuePlayerChat(player, message, timestamp); + if(player == null) Queue.queueChat(sender, message, timestamp); + else Queue.queuePlayerChat(player, message, timestamp); return true; } /** * Logs a componentized chat message for a player. * - * @param player + * @param sender * The player who sent the message * @param component * The chat message * @return True if the message was logged */ - public boolean logChat(Player player, Component component) { - if (!isEnabledForPlayer(player) || !Config.getConfig(player.getWorld()).PLAYER_MESSAGES) { - return false; - } - - if (component == null) { - return false; - } - - long timestamp = System.currentTimeMillis() / 1000L; - // TODO: proper implementation - Queue.queuePlayerChat(player, component.insertion(), timestamp); - return true; + public boolean logChat(CommandSender sender, Component component) { + return logChat(sender, component.insertion()); } /** diff --git a/src/main/java/net/coreprotect/consumer/Queue.java b/src/main/java/net/coreprotect/consumer/Queue.java index 8ef2d71..5a6407f 100755 --- a/src/main/java/net/coreprotect/consumer/Queue.java +++ b/src/main/java/net/coreprotect/consumer/Queue.java @@ -13,6 +13,7 @@ import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Bisected.Half; import org.bukkit.block.data.type.Bed; import org.bukkit.block.data.type.Bed.Part; +import org.bukkit.command.CommandSender; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -303,6 +304,14 @@ public class Queue { queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), null }, new Object[] { timestamp, player.getLocation().clone() }); } + protected static void queueChat(CommandSender sender, String message, long timestamp) { + int currentConsumer = Consumer.currentConsumer; + int consumerId = Consumer.newConsumerId(currentConsumer); + addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_CHAT, null, 0, null, 0, 0, null }); + Consumer.consumerStrings.get(currentConsumer).put(consumerId, message); + queueStandardData(consumerId, currentConsumer, new String[] { sender.getName(), null }, new Object[] { timestamp, null }); + } + protected static void queuePlayerCommand(Player player, String message, long timestamp) { int currentConsumer = Consumer.currentConsumer; int consumerId = Consumer.newConsumerId(currentConsumer); From fcf4d4301091db9b0887e11aa6ed5529a9a8be88 Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 3/7] Actually serialize components into MiniMessage --- src/main/java/net/coreprotect/CoreProtectAPI.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/CoreProtectAPI.java b/src/main/java/net/coreprotect/CoreProtectAPI.java index 9080189..46806ee 100755 --- a/src/main/java/net/coreprotect/CoreProtectAPI.java +++ b/src/main/java/net/coreprotect/CoreProtectAPI.java @@ -7,7 +7,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -252,7 +256,15 @@ public class CoreProtectAPI extends Queue { * @return True if the message was logged */ public boolean logChat(CommandSender sender, Component component) { - return logChat(sender, component.insertion()); + return logChat(sender, MiniMessage.miniMessage().serialize(component)); + } + // API Stub + public boolean logChat(Player sender, String message) { + return logChat((CommandSender) sender, message); + } + // API Stub + public boolean logChat(Player sender, Component component) { + return logChat(sender, MiniMessage.miniMessage().serialize(component)); } /** From ab0a01b12f43623d2d7fb03357815017a9b3cdeb Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 4/7] Add MaterialUtils#asTranslatable to convert Material to the MiniMessage key --- src/main/java/net/coreprotect/utility/MaterialUtils.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/net/coreprotect/utility/MaterialUtils.java b/src/main/java/net/coreprotect/utility/MaterialUtils.java index 25129cd..9f92848 100644 --- a/src/main/java/net/coreprotect/utility/MaterialUtils.java +++ b/src/main/java/net/coreprotect/utility/MaterialUtils.java @@ -3,6 +3,7 @@ package net.coreprotect.utility; import java.util.Locale; import java.util.Set; +import org.bukkit.Bukkit; import org.bukkit.Material; import net.coreprotect.config.ConfigHandler; @@ -213,4 +214,9 @@ public class MaterialUtils extends Queue { return isInventory ? 2 : 1; } } + + // Griefus + public static String asTranslatable(Material material) { + return ""; + } } From e743be761560257373d558299302d4e9b6aab69d Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 5/7] Add EntityUtils#asTranslatable to convert EntityType to the MiniMessage key Yes --- src/main/java/net/coreprotect/utility/EntityUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/coreprotect/utility/EntityUtils.java b/src/main/java/net/coreprotect/utility/EntityUtils.java index 7e1ab37..79ceff5 100644 --- a/src/main/java/net/coreprotect/utility/EntityUtils.java +++ b/src/main/java/net/coreprotect/utility/EntityUtils.java @@ -137,4 +137,8 @@ public class EntityUtils extends Queue { return result; } + + public static String asTranslatable(EntityType type){ + return ""; + } } From edf08fc750eca434078641599243ec04740268ee Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 6/7] Translate item/block/entity names in lookups/inspector results --- .../command/lookup/StandardLookupThread.java | 20 +++++++++++--- .../database/lookup/BlockLookup.java | 27 ++++++++++++------- .../lookup/ChestTransactionLookup.java | 5 ++++ .../database/lookup/InteractionLookup.java | 5 ++++ 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java index a833ba0..fb78926 100644 --- a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java +++ b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java @@ -286,7 +286,11 @@ public class StandardLookupThread implements Runnable { String rbd = ((Integer.parseInt(data[8]) == 2 || Integer.parseInt(data[8]) == 3) ? Color.STRIKETHROUGH : ""); String timeago = ChatUtils.getTimeSince(Integer.parseInt(time), unixtimestamp, true); Material blockType = ItemUtils.itemFilter(MaterialUtils.getType(dtype), (Integer.parseInt(data[13]) == 0)); - String dname = StringUtils.nameFilter(blockType.name().toLowerCase(Locale.ROOT), ddata); + + // Griefus begin + //String dname = StringUtils.nameFilter(blockType.name().toLowerCase(Locale.ROOT), ddata); + String dname = MaterialUtils.asTranslatable(blockType); + // Griefus end byte[] metadata = data[11] == null ? null : data[11].getBytes(StandardCharsets.ISO_8859_1); String tooltip = ItemUtils.getEnchantments(metadata, dtype, amount); @@ -362,13 +366,19 @@ public class StandardLookupThread implements Runnable { isPlayer = true; } else { - dname = EntityUtils.getEntityType(dtype).name(); + // Griefus begin + // dname = EntityUtils.getEntityType(dtype).name(); + dname = EntityUtils.asTranslatable(EntityUtils.getEntityType(dtype)); + // Griefus end } } else { - dname = MaterialUtils.getType(dtype).name().toLowerCase(Locale.ROOT); - dname = StringUtils.nameFilter(dname, ddata); + // Griefus begin + //dname = MaterialUtils.getType(dtype).name().toLowerCase(Locale.ROOT); + //dname = StringUtils.nameFilter(dname, ddata); + dname = MaterialUtils.asTranslatable(MaterialUtils.getType(dtype)); } + /* if (dname.length() > 0 && !isPlayer) { dname = "minecraft:" + dname.toLowerCase(Locale.ROOT) + ""; } @@ -378,6 +388,8 @@ public class StandardLookupThread implements Runnable { String[] blockNameSplit = dname.split(":"); dname = blockNameSplit[1]; } + */ + // Griefus end // Functions.sendMessage(player2, timeago+" " + ChatColors.WHITE + "- " + ChatColors.DARK_AQUA+rbd+""+dplayer+" " + ChatColors.WHITE+rbd+""+a+" " + ChatColors.DARK_AQUA+rbd+"#"+dtype+ChatColors.WHITE + ". " + ChatColors.GREY + "(x"+x+"/y"+y+"/z"+z+")"); diff --git a/src/main/java/net/coreprotect/database/lookup/BlockLookup.java b/src/main/java/net/coreprotect/database/lookup/BlockLookup.java index 5603df1..97470f4 100644 --- a/src/main/java/net/coreprotect/database/lookup/BlockLookup.java +++ b/src/main/java/net/coreprotect/database/lookup/BlockLookup.java @@ -109,24 +109,30 @@ public class BlockLookup { String target; if (resultAction == 3) { - target = EntityUtils.getEntityType(resultType).name(); + // Griefus begin + //target = EntityUtils.getEntityType(resultType).name(); + target = EntityUtils.asTranslatable(EntityUtils.getEntityType(resultType)); + // Griefus end } else { Material resultMaterial = MaterialUtils.getType(resultType); if (resultMaterial == null) { resultMaterial = Material.AIR; } - target = StringUtils.nameFilter(resultMaterial.name().toLowerCase(Locale.ROOT), resultData); - target = "minecraft:" + target.toLowerCase(Locale.ROOT); + // Griefus begin + //target = StringUtils.nameFilter(resultMaterial.name().toLowerCase(Locale.ROOT), resultData); + //target = "minecraft:" + target.toLowerCase(Locale.ROOT); + target = MaterialUtils.asTranslatable(resultMaterial); } - if (target.length() > 0) { + /*if (target.length() > 0) { target = "" + target + ""; - } + }*/ - // Hide "minecraft:" for now. - if (target.startsWith("minecraft:")) { + // Hide "minecraft:" for now. - do not!! + /*if (target.startsWith("minecraft:")) { target = target.split(":")[1]; - } + } */ + // Griefus end resultTextBuilder.append(timeAgo + " " + tag + " ").append(Phrase.build(phrase, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, Color.DARK_AQUA + rbFormat + target + Color.WHITE, selector)).append("\n"); PluginChannelListener.getInstance().sendData(commandSender, resultTime, phrase, selector, resultUser, target, -1, x, y, z, worldId, rbFormat, false, tag.contains("+")); @@ -150,7 +156,10 @@ public class BlockLookup { // resultText = Color.WHITE + "No block data found at " + Color.ITALIC + "x" + x + "/y" + y + "/z" + z + "."; resultText = Phrase.build(Phrase.NO_DATA_LOCATION, Selector.FIRST); if (!blockName.equals("air") && !blockName.equals("cave_air")) { - resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT) + Color.WHITE) + "\n"; + // Griefus begin + //resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT) + Color.WHITE) + "\n"; + resultText = Phrase.build(Phrase.NO_DATA, Color.ITALIC + MaterialUtils.asTranslatable(block.getType()) + Color.WHITE) + "\n"; + // Griefus end } } } diff --git a/src/main/java/net/coreprotect/database/lookup/ChestTransactionLookup.java b/src/main/java/net/coreprotect/database/lookup/ChestTransactionLookup.java index 8119a99..cbad978 100644 --- a/src/main/java/net/coreprotect/database/lookup/ChestTransactionLookup.java +++ b/src/main/java/net/coreprotect/database/lookup/ChestTransactionLookup.java @@ -112,6 +112,9 @@ public class ChestTransactionLookup { if (resultMaterial == null) { resultMaterial = Material.AIR; } + // Griefus begin + String target = MaterialUtils.asTranslatable(resultMaterial); + /* String target = resultMaterial.name().toLowerCase(Locale.ROOT); target = StringUtils.nameFilter(target, resultData); if (target.length() > 0) { @@ -122,6 +125,8 @@ public class ChestTransactionLookup { if (target.startsWith("minecraft:")) { target = target.split(":")[1]; } + */ + // Griefus end result.add(new StringBuilder(timeAgo + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, "x" + resultAmount, ChatUtils.createTooltip(Color.DARK_AQUA + rbFormat + target, tooltip) + Color.WHITE, selector)).toString()); PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_CONTAINER, selector, resultUser, target, resultAmount, x, y, z, worldId, rbFormat, true, tag.contains("+")); diff --git a/src/main/java/net/coreprotect/database/lookup/InteractionLookup.java b/src/main/java/net/coreprotect/database/lookup/InteractionLookup.java index 20333aa..781ca03 100644 --- a/src/main/java/net/coreprotect/database/lookup/InteractionLookup.java +++ b/src/main/java/net/coreprotect/database/lookup/InteractionLookup.java @@ -100,6 +100,9 @@ public class InteractionLookup { if (resultMaterial == null) { resultMaterial = Material.AIR; } + // Griefus begin + String target = MaterialUtils.asTranslatable(resultMaterial); + /* String target = resultMaterial.name().toLowerCase(Locale.ROOT); target = StringUtils.nameFilter(target, resultData); if (target.length() > 0) { @@ -110,6 +113,8 @@ public class InteractionLookup { if (target.startsWith("minecraft:")) { target = target.split(":")[1]; } + */ + // Griefus end resultBuilder.append(timeAgo + " " + Color.WHITE + "- ").append(Phrase.build(Phrase.LOOKUP_INTERACTION, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, Color.DARK_AQUA + rbFormat + target + Color.WHITE, Selector.FIRST)).append("\n"); PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_INTERACTION, Selector.FIRST, resultUser, target, -1, x, y, z, worldId, rbFormat, false, false); From 173bed6a1079704eee2941cd7d69c913204b64c5 Mon Sep 17 00:00:00 2001 From: whitebelyash Date: Sun, 8 Feb 2026 22:04:09 +0400 Subject: [PATCH 7/7] Add inspector mode shortcut command (/coi|/gusi) --- .../java/net/coreprotect/command/CommandHandler.java | 8 ++++++++ src/main/resources/plugin.yml | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/net/coreprotect/command/CommandHandler.java b/src/main/java/net/coreprotect/command/CommandHandler.java index 50f9ba8..baf05c4 100755 --- a/src/main/java/net/coreprotect/command/CommandHandler.java +++ b/src/main/java/net/coreprotect/command/CommandHandler.java @@ -25,6 +25,14 @@ public class CommandHandler implements CommandExecutor { public boolean onCommand(CommandSender user, Command command, String commandLabel, String[] argumentArray) { String commandName = command.getName().toLowerCase(Locale.ROOT); + // Griefus begin + if (commandName.equals("coi") || commandName.equals("gusi")) { + boolean permission = user.hasPermission("coreprotect.inspect"); + InspectCommand.runCommand(user, permission, argumentArray); + return true; + } + // Griefus end + if (commandName.equals("core") || commandName.equals("coreprotect") || commandName.equals("co") || commandName.equals("griefus") || commandName.equals("gus")) { int resultc = argumentArray.length; if (resultc > -1) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7816f51..dd41707 100755 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -35,6 +35,16 @@ commands: permission: coreprotect.griefus permission-message: §3Griefus §f- You do not have permission to do that. usage: / + coi: + description: Inspector mode shortcut + permission: coreprotect.inspect + permission-message: §3Griefus §f- You do not have permission to do that. + usage: / + gusi: + description: Inspector mode shortcut + permission: coreprotect.inspect + permission-message: §3Griefus §f- You do not have permission to do that. + usage: / permissions: coreprotect.*: description: Gives access to all Griefus actions and commands