|
|
|
@ -5,11 +5,13 @@ import com.mojang.brigadier.context.CommandContext; |
|
|
|
import io.papermc.paper.command.brigadier.CommandSourceStack; |
|
|
|
import io.papermc.paper.command.brigadier.CommandSourceStack; |
|
|
|
import io.papermc.paper.command.brigadier.Commands; |
|
|
|
import io.papermc.paper.command.brigadier.Commands; |
|
|
|
import io.papermc.paper.dialog.Dialog; |
|
|
|
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.ActionButton; |
|
|
|
import io.papermc.paper.registry.data.dialog.DialogBase; |
|
|
|
import io.papermc.paper.registry.data.dialog.DialogBase; |
|
|
|
import io.papermc.paper.registry.data.dialog.action.DialogAction; |
|
|
|
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.input.DialogInput; |
|
|
|
import io.papermc.paper.registry.data.dialog.type.DialogType; |
|
|
|
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.Component; |
|
|
|
import net.kyori.adventure.text.event.ClickCallback; |
|
|
|
import net.kyori.adventure.text.event.ClickCallback; |
|
|
|
import net.kyori.adventure.text.minimessage.MiniMessage; |
|
|
|
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.Side; |
|
|
|
import org.bukkit.block.sign.SignSide; |
|
|
|
import org.bukkit.block.sign.SignSide; |
|
|
|
import org.bukkit.entity.Player; |
|
|
|
import org.bukkit.entity.Player; |
|
|
|
|
|
|
|
import org.bukkit.persistence.PersistentDataType; |
|
|
|
import xyz.soukup.ecoCraftCore.database.objects.Shop; |
|
|
|
import xyz.soukup.ecoCraftCore.database.objects.Shop; |
|
|
|
import xyz.soukup.ecoCraftCore.messages.Messages; |
|
|
|
import xyz.soukup.ecoCraftCore.messages.Messages; |
|
|
|
import xyz.soukup.ecoCraftCore.regions.RegionManager; |
|
|
|
import xyz.soukup.ecoCraftCore.regions.RegionManager; |
|
|
|
|
|
|
|
import xyz.soukup.ecoCraftCore.utilities.PDC; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.sound.sampled.Line; |
|
|
|
import java.util.ArrayList; |
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.List; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class SignEditCommand { |
|
|
|
public class SignEditCommand { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final HashMap<Player, List<String>> clipBoard = new HashMap<>(); |
|
|
|
|
|
|
|
|
|
|
|
public static LiteralArgumentBuilder<CommandSourceStack> getCommand(){ |
|
|
|
public static LiteralArgumentBuilder<CommandSourceStack> getCommand(){ |
|
|
|
return Commands.literal("edit-sign") |
|
|
|
return Commands.literal("edit-sign") |
|
|
|
.requires(source -> source.getSender() instanceof Player) |
|
|
|
.requires(source -> source.getSender() instanceof Player) |
|
|
|
@ -51,49 +61,127 @@ public class SignEditCommand { |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dialog dialog = buildEditDialog(sign, player, null); |
|
|
|
|
|
|
|
player.showDialog(dialog); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@SuppressWarnings("UnstableApiUsage") |
|
|
|
|
|
|
|
public static Dialog buildEditDialog(Sign sign){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SignSide signSide = sign.getSide(Side.FRONT); |
|
|
|
public static Dialog buildEditDialog(Sign sign, Player player, List<String> lines){ |
|
|
|
List<Component> lines = signSide.lines(); |
|
|
|
|
|
|
|
MiniMessage miniMessage = MiniMessage.miniMessage(); |
|
|
|
if (lines == null){ |
|
|
|
|
|
|
|
lines = getLines(sign); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
List<ActionButton> actionButtons = new ArrayList<>(); |
|
|
|
List<ActionButton> actionButtons = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
actionButtons.add(ActionButton.builder(Messages.get("gui.shop-edit.button.confirm")) |
|
|
|
|
|
|
|
.action(DialogAction.customClick( |
|
|
|
|
|
|
|
(view, audience) -> {audience.closeDialog();}, |
|
|
|
actionButtons.add(ActionButton.builder(Messages.get("gui.sign-edit.buttons.copy")) |
|
|
|
ClickCallback.Options.builder().build() |
|
|
|
.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()); |
|
|
|
.build()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<String> finalLines = lines; |
|
|
|
|
|
|
|
|
|
|
|
return Dialog.create(builder -> builder.empty() |
|
|
|
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( |
|
|
|
.inputs(List.of( |
|
|
|
DialogInput.text("line1", Messages.get("gui.sign-edit.inputs.line1")) |
|
|
|
DialogInput.text("line1", Messages.get("gui.sign-edit.inputs.line1")) |
|
|
|
.initial(miniMessage.serialize(lines.getFirst())) |
|
|
|
.initial(finalLines.getFirst()) |
|
|
|
|
|
|
|
.maxLength(256) |
|
|
|
.build(), |
|
|
|
.build(), |
|
|
|
DialogInput.text("line2", Messages.get("gui.sign-edit.inputs.line2")) |
|
|
|
DialogInput.text("line2", Messages.get("gui.sign-edit.inputs.line2")) |
|
|
|
.initial(miniMessage.serialize(lines.get(1))) |
|
|
|
.initial(finalLines.get(1)) |
|
|
|
|
|
|
|
.maxLength(256) |
|
|
|
.build(), |
|
|
|
.build(), |
|
|
|
DialogInput.text("line3", Messages.get("gui.sign-edit.inputs.line3")) |
|
|
|
DialogInput.text("line3", Messages.get("gui.sign-edit.inputs.line3")) |
|
|
|
.initial(miniMessage.serialize(lines.get(2))) |
|
|
|
.initial(finalLines.get(2)) |
|
|
|
|
|
|
|
.maxLength(256) |
|
|
|
.build(), |
|
|
|
.build(), |
|
|
|
DialogInput.text("line4", Messages.get("gui.sign-edit.inputs.line4")) |
|
|
|
DialogInput.text("line4", Messages.get("gui.sign-edit.inputs.line4")) |
|
|
|
.initial(miniMessage.serialize(lines.get(3))) |
|
|
|
.initial(finalLines.get(3)) |
|
|
|
|
|
|
|
.maxLength(256) |
|
|
|
.build() |
|
|
|
.build() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
)) |
|
|
|
)) |
|
|
|
.build()) |
|
|
|
.build()) |
|
|
|
.type(DialogType.multiAction(actionButtons).build()) |
|
|
|
.type(DialogType.multiAction(actionButtons).build()) |
|
|
|
|
|
|
|
|
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static List<String> getLines(Sign sign){ |
|
|
|
|
|
|
|
List<String> 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<Component> 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<String> 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<Component> 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(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|