commit 01115260a381c1567e61bb7c5fc2a69922218e5a Author: YouHaveTrouble Date: Fri Nov 21 19:56:08 2025 +0100 exploring dialogs a bit diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..379b7be --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + me.youhavetrouble.standin + Stand-in + 1.0-SNAPSHOT + jar + + Stand-in + + + 21 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.10-R0.1-SNAPSHOT + provided + + + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..69696b6 --- /dev/null +++ b/readme.md @@ -0,0 +1,5 @@ +## Stand-in + +Swap armor stands to mannequins or display entities! + +WIP diff --git a/src/main/java/me/youhavetrouble/standin/StandIn.java b/src/main/java/me/youhavetrouble/standin/StandIn.java new file mode 100644 index 0000000..955498f --- /dev/null +++ b/src/main/java/me/youhavetrouble/standin/StandIn.java @@ -0,0 +1,20 @@ +package me.youhavetrouble.standin; + +import org.bukkit.NamespacedKey; +import org.bukkit.plugin.java.JavaPlugin; + +public final class StandIn extends JavaPlugin { + + public static final NamespacedKey KEY = new NamespacedKey("stand-in", "stand-in"); + + @Override + public void onEnable() { + // Plugin startup logic + + } + + @Override + public void onDisable() { + // Plugin shutdown logic + } +} diff --git a/src/main/java/me/youhavetrouble/standin/StandinDialog.java b/src/main/java/me/youhavetrouble/standin/StandinDialog.java new file mode 100644 index 0000000..c95e30d --- /dev/null +++ b/src/main/java/me/youhavetrouble/standin/StandinDialog.java @@ -0,0 +1,72 @@ +package me.youhavetrouble.standin; + +import io.papermc.paper.dialog.Dialog; +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.text.Component; +import net.kyori.adventure.text.event.ClickCallback; +import net.kyori.adventure.util.TriState; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@SuppressWarnings("UnstableApiUsage") +public class StandinDialog { + + public static void openArmorStandDialog(@NotNull Player player, @NotNull ArmorStand armorStand) { + + if (armorStand.isDead()) return; + + UUID armorStandId = armorStand.getUniqueId(); + + List inputs = new ArrayList<>(); + + inputs.add( + DialogInput.text("name", Component.text("Display name")) + .labelVisible(true) + .build() + ); + inputs.add( + DialogInput.bool("invisible", Component.text("Invisible")) + .initial(armorStand.isInvisible()) + .build() + ); + + inputs.add( + DialogInput.bool("onFire", Component.text("On fire")) + .initial(Boolean.TRUE.equals(armorStand.getVisualFire().toBoolean())) + .build() + ); + + ActionButton saveButton = ActionButton.builder(Component.text("Save")).action( + DialogAction.customClick((view, audience) -> { + if (!(audience instanceof Player callbackPlayer)) return; + Entity entity = callbackPlayer.getWorld().getEntity(armorStandId); + if (!(entity instanceof ArmorStand stand)) return; + if (stand.isDead()) return; + stand.setInvisible(Boolean.TRUE.equals(view.getBoolean("invisible"))); + stand.setVisualFire(TriState.byBoolean(Boolean.TRUE.equals(view.getBoolean("onFire")))); + }, ClickCallback.Options.builder().lifetime(Duration.ofHours(1)).uses(1).build()) + ).build(); + + Dialog dialog = Dialog.create(builder -> builder.empty() + .base( + DialogBase.builder(Component.text("Armor Stand Editor")) + .inputs(inputs) + .build()) + .type(DialogType.confirmation(saveButton, ActionButton.builder(Component.text("Cancel")).build())) + ); + + player.showDialog(dialog); + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..6a7f149 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,4 @@ +name: Stand-in +version: '1.0-SNAPSHOT' +main: me.youhavetrouble.standin.StandIn +api-version: '1.21.7'