From 0e0f5d55d09984a0b91483a2ae4de9128ee51ae0 Mon Sep 17 00:00:00 2001 From: Husky <39809509+Huskydog9988@users.noreply.github.com> Date: Mon, 6 Apr 2026 15:00:33 -0400 Subject: [PATCH] add clickable dest signs Dest signs are denoted with [DEST] or [DESTINATION] on the first line. A dest sign can have one dest per remain line on the sign. Players can punch the sign to cycle through the available dests. Destinations prefixed with "/dest " will have the prefixed removed automatically. --- gradle/libs.versions.toml | 2 + plugins/railswitch-paper/build.gradle.kts | 1 + .../sh/okx/railswitch/DestSignListener.java | 60 +++++++++++++++++++ .../sh/okx/railswitch/RailSwitchPlugin.java | 1 + 4 files changed, 64 insertions(+) create mode 100644 plugins/railswitch-paper/src/main/java/sh/okx/railswitch/DestSignListener.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b5ce47b5e7..c6727fe00c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,8 @@ runpaper = { id = "xyz.jpenilla.run-paper", version = "2.3.1" } paper-api = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } velocity-api = { group = "com.velocitypowered", name = "velocity-api", version.ref = "velocity"} +adventure-text-serializer-plain = { group = "net.kyori", name = "adventure-text-serializer-plain", version = "4.26.1" } + aikar-acf = { group = "co.aikar", name = "acf-paper", version = "0.5.1-SNAPSHOT" } aikar-taskchain = { group = "co.aikar", name = "taskchain-bukkit", version = "3.7.2" } diff --git a/plugins/railswitch-paper/build.gradle.kts b/plugins/railswitch-paper/build.gradle.kts index 699fbacf87..c809b5d442 100644 --- a/plugins/railswitch-paper/build.gradle.kts +++ b/plugins/railswitch-paper/build.gradle.kts @@ -9,6 +9,7 @@ dependencies { paperDevBundle(libs.versions.paper) } + implementation(libs.adventure.text.serializer.plain) compileOnly(project(":plugins:civmodcore-paper")) compileOnly(project(":plugins:namelayer-paper")) compileOnly(project(":plugins:citadel-paper")) diff --git a/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/DestSignListener.java b/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/DestSignListener.java new file mode 100644 index 0000000000..c3fb5bb128 --- /dev/null +++ b/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/DestSignListener.java @@ -0,0 +1,60 @@ +package sh.okx.railswitch; + +import java.util.Arrays; +import java.util.ArrayList; +import java.util.List; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; +import org.bukkit.block.sign.SignSide; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import sh.okx.railswitch.settings.SettingsManager; + +public class DestSignListener implements Listener { + + private final List destStrings = Arrays.asList("[DEST]", + "[DESTINATION]"); + private static final PlainTextComponentSerializer plainSerializer = PlainTextComponentSerializer.plainText(); + + @EventHandler + public void signClick(PlayerInteractEvent event) { + if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; + + Block block = event.getClickedBlock(); + if (block == null) return; + + if (!(block.getState() instanceof Sign sign)) return; + + SignSide clickedSide = sign.getTargetSide(event.getPlayer()); + var firstLine = plainSerializer.serialize(clickedSide.line(0)).trim(); + if (!destStrings.contains(firstLine)) return; + + List destinations = new ArrayList<>(); + for (int i = 1; i < 4; i++) { + var line = plainSerializer.serialize(clickedSide.line(i)); + // remove "/dest " from start if it exists as some players include it + line = line.replaceFirst("^/dest ", "").trim(); + if (line.isEmpty()) continue; + destinations.add(line); + } + if (destinations.isEmpty()) return; + + String currentDest = SettingsManager.getDestination(event.getPlayer()); + int currentIndex = -1; + for (int i = 0; i < destinations.size(); i++) { + if (destinations.get(i).equalsIgnoreCase(currentDest)) { + currentIndex = i; + break; + } + } + + int nextIndex = currentIndex + 1; + if (nextIndex >= destinations.size()) { + nextIndex = 0; + } + SettingsManager.setDestination(event.getPlayer(), destinations.get(nextIndex)); + } +} diff --git a/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/RailSwitchPlugin.java b/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/RailSwitchPlugin.java index 597dfa6b92..15e0cced0e 100644 --- a/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/RailSwitchPlugin.java +++ b/plugins/railswitch-paper/src/main/java/sh/okx/railswitch/RailSwitchPlugin.java @@ -21,6 +21,7 @@ public void onEnable() { SettingsManager.init(this); registerListener(new CitadelGlue(this)); registerListener(new SwitchListener()); + registerListener(new DestSignListener()); commandManager = new CommandManager(this); commandManager.init(); commandManager.registerCommand(new DestinationCommand());