From b34c89f1c28b69ee7c21c525dbc40768f1892df6 Mon Sep 17 00:00:00 2001 From: jakub Date: Sun, 12 Apr 2026 20:41:42 +0200 Subject: [PATCH] =?UTF-8?q?-=20P=C5=99=C3=ADprava=20men=C3=AD=C4=8Dka=20a?= =?UTF-8?q?=20funkce=20pro=20=C3=BApravu=20cedulek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xyz/soukup/ecoCraftCore/EcoCraftCore.java | 2 + .../ecoCraftCore/database/objects/Shop.java | 6 + .../ecoCraftCore/sign/SignEditCommand.java | 124 +++++++++++++++--- src/main/resources/messages.yml | 12 +- 4 files changed, 122 insertions(+), 22 deletions(-) diff --git a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java index ee28dad..44053db 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/EcoCraftCore.java @@ -45,6 +45,7 @@ import xyz.soukup.ecoCraftCore.positionMarker.MarkerEvent; import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.shop.ShopLogic; +import xyz.soukup.ecoCraftCore.sign.SignEditCommand; import xyz.soukup.ecoCraftCore.virtualChest.VirtualChestLogic; import java.io.IOException; @@ -284,6 +285,7 @@ public final class EcoCraftCore extends JavaPlugin { lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MarkerCommand.getCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MoneyCommand.getCommand().build())); lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(MineCommand.createCommand().build())); + lm.registerEventHandler(LifecycleEvents.COMMANDS, event -> event.registrar().register(SignEditCommand.getCommand().build())); } private void registerEvents(){ diff --git a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java index 2df895e..86c53a5 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/database/objects/Shop.java @@ -7,6 +7,7 @@ import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; import xyz.soukup.ecoCraftCore.database.DaoRegistry; import xyz.soukup.ecoCraftCore.utilities.Converter; @@ -149,6 +150,11 @@ public class Shop { public void writeIntoSign(Sign sign){ PDC.set(sign, "shop", this.id); + if (PDC.getUniversal(sign, "line1", PersistentDataType.STRING) != null){ + sign.update(); + return; + } + Component prices; Component shopType; diff --git a/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java b/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java index 1d86395..3d6b9d3 100644 --- a/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java +++ b/src/main/java/xyz/soukup/ecoCraftCore/sign/SignEditCommand.java @@ -5,11 +5,13 @@ import com.mojang.brigadier.context.CommandContext; import io.papermc.paper.command.brigadier.CommandSourceStack; import io.papermc.paper.command.brigadier.Commands; import io.papermc.paper.dialog.Dialog; +import io.papermc.paper.dialog.DialogResponseView; import io.papermc.paper.registry.data.dialog.ActionButton; import io.papermc.paper.registry.data.dialog.DialogBase; import io.papermc.paper.registry.data.dialog.action.DialogAction; import io.papermc.paper.registry.data.dialog.input.DialogInput; import io.papermc.paper.registry.data.dialog.type.DialogType; +import net.kyori.adventure.audience.Audience; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.event.ClickCallback; import net.kyori.adventure.text.minimessage.MiniMessage; @@ -20,14 +22,22 @@ import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; import org.bukkit.entity.Player; +import org.bukkit.persistence.PersistentDataType; import xyz.soukup.ecoCraftCore.database.objects.Shop; import xyz.soukup.ecoCraftCore.messages.Messages; import xyz.soukup.ecoCraftCore.regions.RegionManager; +import xyz.soukup.ecoCraftCore.utilities.PDC; +import javax.sound.sampled.Line; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; + public class SignEditCommand { + + private static final HashMap> clipBoard = new HashMap<>(); + public static LiteralArgumentBuilder getCommand(){ return Commands.literal("edit-sign") .requires(source -> source.getSender() instanceof Player) @@ -51,49 +61,127 @@ public class SignEditCommand { return 1; } + Dialog dialog = buildEditDialog(sign, player, null); + player.showDialog(dialog); + return 0; } - @SuppressWarnings("UnstableApiUsage") - public static Dialog buildEditDialog(Sign sign){ - SignSide signSide = sign.getSide(Side.FRONT); - List lines = signSide.lines(); - MiniMessage miniMessage = MiniMessage.miniMessage(); + public static Dialog buildEditDialog(Sign sign, Player player, List lines){ + + if (lines == null){ + lines = getLines(sign); + } List actionButtons = new ArrayList<>(); - actionButtons.add(ActionButton.builder(Messages.get("gui.shop-edit.button.confirm")) - .action(DialogAction.customClick( - (view, audience) -> {audience.closeDialog();}, - ClickCallback.Options.builder().build() - )) + + + actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.copy")) + .action(DialogAction.customClick((view, audience) -> copySignText(view, player, sign), ClickCallback.Options.builder().build())) + .build()); + actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.paste")) + .action(DialogAction.customClick((view, audience) -> pasteSignText(sign, player), ClickCallback.Options.builder().build())) + .build()); + actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.confirm")) + .action(DialogAction.customClick((view, audience) -> editSign(view, sign, player), ClickCallback.Options.builder().build())) + .build()); + actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.cancel")) + .action(DialogAction.customClick((view, audience) -> audience.closeDialog(), ClickCallback.Options.builder().build())) .build()); + + List finalLines = lines; + return Dialog.create(builder -> builder.empty() - .base(DialogBase.builder(Messages.get("gui.shop-edit.title")) + .base(DialogBase.builder(Messages.get("gui.sign-edit.title")) .inputs(List.of( DialogInput.text("line1", Messages.get("gui.sign-edit.inputs.line1")) - .initial(miniMessage.serialize(lines.getFirst())) + .initial(finalLines.getFirst()) + .maxLength(256) .build(), DialogInput.text("line2", Messages.get("gui.sign-edit.inputs.line2")) - .initial(miniMessage.serialize(lines.get(1))) + .initial(finalLines.get(1)) + .maxLength(256) .build(), DialogInput.text("line3", Messages.get("gui.sign-edit.inputs.line3")) - .initial(miniMessage.serialize(lines.get(2))) + .initial(finalLines.get(2)) + .maxLength(256) .build(), DialogInput.text("line4", Messages.get("gui.sign-edit.inputs.line4")) - .initial(miniMessage.serialize(lines.get(3))) + .initial(finalLines.get(3)) + .maxLength(256) .build() - - )) .build()) .type(DialogType.multiAction(actionButtons).build()) - ); } + private static List getLines(Sign sign){ + List lines = new ArrayList<>(); + + if (PDC.getUniversal(sign, "line1", PersistentDataType.STRING) != null){ + for (int i = 1; i<5; i++){ + lines.add((String) PDC.getUniversal(sign, "line" + i,PersistentDataType.STRING)); + } + return lines; + } + + SignSide signSide = sign.getSide(Side.FRONT); + List componentLines = signSide.lines(); + + for (Component componentLine : componentLines){ + lines.add(MiniMessage.miniMessage().serialize(componentLine)); + } + + return lines; + } + + private static void copySignText(DialogResponseView view, Player player, Sign sign){ + List lines = new ArrayList<>(); + + lines.add(view.getText("line1")); + lines.add(view.getText("line2")); + lines.add(view.getText("line3")); + lines.add(view.getText("line4")); + + clipBoard.put(player, lines); + Messages.send(player, "gui.sign-edit.success.copied"); + pasteSignText(sign, player); + } + + + private static void pasteSignText(Sign sign, Player player){ + Dialog dialog = buildEditDialog(sign, player, clipBoard.get(player)); + player.showDialog(dialog); + } + + private static void editSign(DialogResponseView view, Sign sign, Audience audience){ + MiniMessage mm = MiniMessage.miniMessage(); + SignSide signSide = sign.getSide(Side.FRONT); + + List lines = new ArrayList<>(); + + + for (int i = 1; i < 5; i++) { + String key = "line" + i; + String line = view.getText(key); + + if (line == null){ + line = ""; + } + + PDC.setUniversal(sign, key, line, PersistentDataType.STRING); + signSide.line(i-1, mm.deserialize(line)); + + } + sign.update(); + + } + + } diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 4c9b324..b8f5bcf 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -74,15 +74,19 @@ gui: sign-edit: title: "Editace Cedulky" inputs: - line1: "1. řádek" - line2: "2. řádek" - line3: "3. řádek" - line4: "4. řádek" + line1: "1. Linka" + line2: "2. Linka" + line3: "3. Linka" + line4: "4. Linka" + glow: "Zvíraznit text" buttons: confirm: "Potvrdit" cancel: "Zrušit" copy: "Kopírovat" paste: "Vložit" + success: + copied: "Obsah cedulky zkopírován!" + pasted: "Obsah cedulky vložen!" shop-edit: title: "Editace Obchodu" inputs: