When installed on its own this plugin does nothing. It just allows other plugins to work.
While I was attempting to develop several minigames, I always came to the point where I had to find a solid system to manage signs that allowed me to check if someone clicked it and change the displayed text with code. I didn't find what I was looking for, everything I found did either not allow me to change my signs text at runtime or was not simple enough. This is why I ended up coding it myself and it works so good for me that I thought I'd share it. Please note that this API is still in development and it already works but I supposed there are a few things that should be finalized. Leave your feedback to make it better.
I plan on implementing signs that look different for each player and a customizable tag (that means the first line doesn't have to be [PluginSign]. If you're interested in these features please tell me in the comments or as a ticket.
If you're using this API, please leave a comment to let me know if there's a demand for updating it whenever necessary.
Using the PluginSignAPI is simple:
Keep in mind that server owners have to have the PluginSignAPI installed as a plugin if your plugin uses it.
And finally I have an example usage of the PluginSignAPI where you can have signs to display a players popping score, saved as the players level, and when someone right clicks the sign it outputs a text. The sign input looks like this:

You can see the pattern: first line [PluginSign], second line plugin (which is called "pop"), third line purpose and fourth line the data, in this case the player to show the score for. When you placed the sign it automatically gets updated as specified in the PluginSignUpdateEvent and looks like this:

And when you right click it, the PluginSignClickEvent gets called and it sends a message to the player who clicked:

@EventHandler public void onSignUpdate(PluginSignUpdateEvent event) { if(event.getPlugin().equalsIgnoreCase("pop")) { if(event.getPurpose().equalsIgnoreCase("showscore")) { event.setLine(0, "§aPOP Score"); event.setLine(1, event.getData()); if(getServer().getPlayer(event.getData()) != null) { Player player = getServer().getPlayer(event.getData()); event.setLine(2, "Score: " + player.getLevel()); } } } } @EventHandler public void onSignClick(PluginSignClickEvent event) { if(event.getPlugin().equalsIgnoreCase("pop")) { if(event.getPurpose().equalsIgnoreCase("showscore")) { if(getServer().getPlayer(event.getData()) != null) { Player player = getServer().getPlayer(event.getData()); event.getPlayer().sendMessage(player.getName() + " has a score of " + player.getLevel()); } } } }