java.lang.IllegalStateException: Unable to call method: getSide on Bukkit 1.19.4 due to incomplete sign side support in that version of Bukkit
Under the Hood
SignHelpers.setEditableOldApi() called the wrong Bukkit method (should be Sign.setEditable() instead of Sign.setWaxed()), but this probably has no practical effect. It only affects the correctness of how this plugin interacts with Bukkit 1.13.2 through Bukkit 1.19.4.
The sign side calculation based on the player's relative position from the sign (SideShim.fromRelativePosition) will now say front on Bukkit 1.19.4 and older, as the back side had not yet been added in those versions of Bukkit.
bypass_wax_cannot_rewax – Warning after a /sign text change that wax was not reapplied because the player lacks permission to /sign wax
forbidden_waxed_sign_edit – Error that a /sign text change was blocked because the target sign is waxed and the player lacks permission to /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
Increased the right-click event handling priority to the highest level to avoid interfering with other plugins that take over right-click events on signs (#36)
Permission processing moved from SignCommand.permitted(Player, String) to InteractionCommand.isPermitted()
SignText.signChanged() renamed to SignText.signTextChanged() as part of clarification that only text changes count in /sign undo and /sign redo
Started pulling org.bukkit.entity.Player out of constructor injections, as various classes are being used in wider scopes.
Gradle 9.0 compatibility:
Replaced Gradle 8.2 deprecations with recommended replacements
Updated Gradle to version 8.2.1
Added JDK toolchain resolver plugin to download Java 1.8
Skip ProGuard for development builds
Eliminated the dependency on commons-lang:commons-lang
Added a workaround for a Spigot 1.20 bug where having a player open a sign does not make the sign editable (SPIGOT-7391)
Preserve the native honeycomb-on-sign action if the signedit.sign.wax permission is denied.
Locale changes:
wax_removed and wax_applied should just be those and not excessively wordy in what their effects are.
Eliminated bypass_wax_before and bypass_wax_after to prefer only error messages, as users probably don't care if the implicit de/re-waxing is successful.
Reworded bypass_wax_cannot_rewax to make it clear that the wax that was previously on the sign was discarded.
Known Issues
The new locale strings relating to waxed signs have not been proofread for the locales zh-CN, zh-TW, and zh-HK.
Added
Support for Minecraft 1.20 sign sides (front and back)
Support for Minecraft 1.20 honeycomb wax on signs
On Minecraft 1.20+, opening an editable sign (sign without honeycomb wax) by right-click will open a sign editor handled by this plugin.
(Minecraft 1.20+ only) /sign wax and /sign unwax commands and permissions to apply and remove honeycomb wax from signs, respectively
New locale strings:
wax_removed – Completed /sign unwax action
wax_applied – Completed /sign wax action
bypass_wax_cannot_rewax – Warning after a /sign text change that wax was not reapplied because the player lacks permission to /sign wax
forbidden_waxed_sign_edit – Error that a /sign text change was blocked because the target sign is waxed and the player lacks permission to /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
When using compatibility.edit-validation: Extra, SignEdit for Bukkit could have submitted a null rather than an air block for the block next to floating wall hanging signs, causing other plugins to fail to handle the BlockPlaceEvent. Although not possible in normal Minecraft, SignEdit for Bukkit now simulates hanging wall hanging signs in the air for validation purposes.
Hopefully improved the machine translations of the wax-related locale strings
Known Issues
When using the Spigot server, /sign ui edits are not registered due to a bug (SPIGOT-7391). Either switch to PaperMC or use /sign set as a workaround.
The new locale strings relating to waxed signs have not been proofread for the locales de, nl, zh-CN, zh-TW, and zh-HK.
Added
Support for Minecraft 1.20 sign sides (front and back)
Support for Minecraft 1.20 honeycomb wax on signs
On Minecraft 1.20+, opening an editable sign (sign without honeycomb wax) by right-click will open a sign editor handled by this plugin.
(Minecraft 1.20+ only) /sign wax and /sign unwax commands and permissions to apply and remove honeycomb wax from signs, respectively
New locale strings:
wax_removed – Completed /sign unwax action
wax_applied – Completed /sign wax action
bypass_wax_before – Warning before a /sign text change that wax will be removed
bypass_wax_after – Warning after a /sign text change that wax was reapplied
bypass_wax_cannot_rewax – Warning after a /sign text change that wax was not reapplied because the player lacks permission to /sign wax
forbidden_waxed_sign_edit – Error when attempting to edit a waxed sign without permission to run /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
forbidden_waxed_sign_edit – Error when attempting to edit a waxed sign without permission to run /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
Fixed the server crash when right-clicking a sign (#37)
SignEdit for Bukkit now properly takes over the native Minecraft sign editor for unwaxed signs in Minecraft 1.20+. (#35)
PaperMC no longer causes SignEdit for Bukkit to say "Sign edit forbidden by policy or other plugin" or "Modified by another plugin" on PaperMC when using /sign ui and any existing line begins with a formatting code and there are no other formatting codes on the line.
Fixed compatibility with other plugins that take control of right-click on signs (#36)
Fixed documentation of /sign undo and /sign redo in /? signedit
Added a machine translation for the new locale strings in Hong Kong Cantonese (zh-HK)
Known Issues
/sign undo and /sign redo treat waxed signs as unwaxed signs.
When using the Spigot server, /sign ui edits are not registered due to a bug (SPIGOT-7391). Either switch to PaperMC or use /sign set as a workaround.
The new locale strings relating to waxed signs have not been proofread for the locales de, nl, zh-CN, zh-TW, and zh-HK.
Added
Support for Minecraft 1.20 sign sides (front and back)
Support for Minecraft 1.20 honeycomb wax on signs
On Minecraft 1.20+, opening an editable sign (sign without honeycomb wax) by right-click will open a sign editor handled by this plugin.
(Minecraft 1.20+ only) /sign wax and /sign unwax commands and permissions to apply and remove honeycomb wax from signs, respectively
New locale strings:
wax_removed – Completed /sign unwax action
wax_applied – Completed /sign wax action
bypass_wax_before – Warning before a /sign text change that wax will be removed
bypass_wax_after – Warning after a /sign text change that wax was reapplied
bypass_wax_cannot_rewax – Warning after a /sign text change that wax was not reapplied because the player lacks permission to /sign wax
forbidden_waxed_sign_edit – Error when attempting to edit a waxed sign without permission to run /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
SignEdit for Bukkit now takes over the native Minecraft sign editor for unwaxed signs in Minecraft 1.20+.
Fixed sending side data when firing SignChangeEvent in the validation phase
Known Issues
/sign undo and /sign redo treat waxed signs as unwaxed signs.
When using the Spigot server, /sign ui edits might not be registered. This might be due to a bug in Spigot's SignChangeEvent handling. Either switch to PaperMC or use /sign set as a workaround.
When using /sign ui and any existing line begins with a formatting code and there are no other formatting codes on the line, SignEdit for Bukkit may incorrectly say "Sign edit forbidden by policy or other plugin" or "Modified by another plugin". This might be a compatibility issue with PaperMC's mapping of text components to formatting codes.
Added
Support for Minecraft 1.20 sign sides (front and back)
On Minecraft 1.20+, opening an editable sign (sign without honeycomb wax) by right-click will open a sign editor handled by this plugin.
(Minecraft 1.20+ only) /sign wax and /sign unwax commands and permissions to apply and remove honeycomb wax from signs, respectively
New locale strings:
wax_removed – Completed /sign unwax action
wax_applied – Completed /sign wax action
bypass_wax_before – Warning before a /sign text change that wax will be removed
bypass_wax_after – Warning after a /sign text change that wax was reapplied
bypass_wax_cannot_rewax – Warning after a /sign text change that wax was not reapplied because the player lacks permission to /sign wax
forbidden_waxed_sign_edit – Error when attempting to edit a waxed sign without permission to run /sign unwax
Changed
The documentation of /sign undo and /sign redo has been clarified to indicate that they affect only the sign text, not the dyes or wax applied to the sign.
Restored compatibility with Bukkit 1.8.3 through Bukkit 1.12.2
Known Issues
Waxed signs (i.e. signs with honeycomb applied to them) remain editable with /sign subcommands.
Edits made with the Minecraft 1.20 native right-mouse click sign edit action on unwaxed signs are not registered by SignEdit for Bukkit. We might not be able to handle these native edits due to SPIGOT-7391.
When using the Spigot server, /sign ui edits might not be registered. This might be due to a bug in Spigot's SignChangeEvent handling. Either switch to PaperMC or use /sign set as a workaround.
When using /sign ui and any existing line begins with a formatting code and there are no other formatting codes on the line, SignEdit for Bukkit may incorrectly say "Sign edit forbidden by policy or other plugin" or "Modified by another plugin". This might be a compatibility issue with PaperMC's mapping of text components to formatting codes.
Added
Support for Minecraft 1.20 sign sides (front and back)
Waxed signs (i.e. signs with honeycomb applied to them) remain editable with /sign subcommands.
Edits made with the Minecraft 1.20 native right-mouse click sign edit action on unwaxed signs are not registered by SignEdit for Bukkit. We might not be able to handle these native edits due to SPIGOT-7391.
When using the Spigot server, /sign ui edits might not be registered. This might be due to a bug in Spigot's SignChangeEvent handling. Either switch to PaperMC or use /sign set as a workaround.
When using /sign ui and any existing line begins with a formatting code and there are no other formatting codes on the line, SignEdit for Bukkit may incorrectly say "Sign edit forbidden by policy or other plugin" or "Modified by another plugin". This might be a compatibility issue with PaperMC's mapping of text components to formatting codes.
Added
Support for Minecraft 1.20 sign sides (front and back)
The German (de) locale pluralized 0 incorrectly in the history_have string. Credit to @phpwutz
A minor typo in the file that gets deployed to ./plugins/SignEdit/locales/README.txt
A race condition that assumed that a block is still a sign when using compatibility.edit-validation: Extra (#33)
Changed
If the file modification time of ./plugins/SignEdit/config.yml is not changed, the configuration will no longer be reloaded. (#29) This means that merely changing the file's ownership or permissions will not trigger the configuration reload anymore.
Under the Hood
Updated copyright year 2023
Restructured SignSubcommand inheritance to make more sense
Replaced constructor injection of ChatComms with a factory to avoid nesting assisted dependency injections
Extracted line selection parsing to new class LineSelectorParser to improve separation of concerns
Gradle has been updated from version 7.3.1 to version 8.1-rc-2.
Limited support for Bukkit 1.8.3 through 1.12.2 in addition to the existing full support for Bukkit 1.13 through 1.18
Fixed
Unhandled Java Errors are now caught and more gracefully logged.
Changed
If Bukkit is too old (versions 1.8.3 through 1.11.2), fall back to the configured default locale instead of erroring out and preventing the plugin from being used.
If a Java Error or any other unhandled Exception is encountered while validating a /sign ui edit, the sign edit is now cancelled. Previously, the edit would not be cancelled.
No more dependency on CraftBukkit – /sign ui previously tried various reflection workarounds to invoke the sign editor and always assumed that the server was running CraftBukkit without too many changes. SignEdit for Bukkit >= 1.12.7, < 1.13.4 settled on a minimally intrusive unstable API call that worked for CraftBukkit 1.8 through CraftBukkit 1.17.1, but CraftBukkit stopped mapping method names starting in CraftBukkit 1.18, which broke /sign ui.
/sign ui won't break in future versions of Bukkit – As SignEdit for Bukkit = 1.13.5 now prefers to use the stable Bukkit API, /sign ui will keep working on future major versions of Bukkit.
For improved compatibility, the old reflection-based sign editor open call―now named net.deltik.mc.signedit.interactions.UiSignEditInteraction.openSignEditorWithReflection()―will try to find the unstable API ("NMS") EntityHuman method to open the sign editor based on the TileEntitySign passed into that method rather than by the name EntityHuman.openSign(). CraftBukkit no longer maps the NMS method names. This fix is moot for Bukkit 1.18 and newer, but it may be less likely to break other CraftBukkit variants.
The plugin will now build on Java 17. CI will continue to build on Java 1.8 for compatibility with Bukkit 1.13 servers.
Gradle will now use Java 1.8 to build the plugin. Redistributors or future versions of this plugin intending to build on newer versions of Java can change the Java toolchain language version in the build.gradle file to override this behavior.
CI now uses a newer Java 17 image for build-time dependencies. The resulting build artifact will remain compatible with Java 1.8.
/sign help now tab-completes page numbers when there is more than one help page.
Changed
A player's pending sign interaction will only be cancelled if they perform a sign edit (SignChangeEvent) outside of this plugin rather than when they place a block.
This reverts the change from SignEdit for Bukkit = 1.13.3. This new approach should be less prone to bugs.
Fixed
When the plugin is configured with compatibility.edit-validation: Extra, /sign ui should not skip the extra checks. (#26)
Under the Hood
All mentions of deltik.org have been changed to deltik.net.
The plugin package was renamed from org.deltik.mc.signedit to net.deltik.mc.signedit.
Most code inspection warnings have been fixed.
Gradle has been updated from version 7.0.2 to version 7.3.
Version numbers are now generated automatically from Git tags.
org.bukkit.plugin.IllegalPluginAccessException warning while unloading the plugin (reported in Spigot forum thread) prevents unload-time configuration file validation
Changes to the configuration file (plugins/SignEdit/config.yml) are now detected and reloaded at runtime, so a CraftBukkit server restart is no longer needed to make the new settings take effect.
New locale strings:
usage_page_heading – Styling for the heading of the redesigned /sign help
usage_page_info – Contents of the heading of /sign help
usage_page_numbering – Shows the page number of the /sign help page
Changed
The <lines> argument of /sign clear [<lines>] is now optional. If <lines> is not provided, all lines on the targeted sign will be blanked out.
Reworked /sign help so that it will only display /sign subcommands to which the player has access. (#23)
Tab completion now will only suggest for /sign subcommands to which the player has access.
Removed locale strings:
usage_section – This string is no longer used due to the rework of /sign help.
Fixed
If another plugin modified the lines in a SignChangeEvent, SignEdit for Bukkit may ignore the updated lines and apply the staged lines, bypassing other plugins' changes. (#22)
This defect is a regression from SignEdit for Bukkit = 1.12.2. The cause of this defect was an incorrect assumption that the sign lines array passed in the SignChangeEvent would be mutated in place by the Bukkit event handler and other listening plugins.
/sign undo and /sign redo missing from /sign help (#23)
Internal error while tab-completing and not looking at a sign
Under the Hood
Added documentation of the arguments in the locale strings
Simplified dependency injection for SignSubcommand subclasses
Event listeners split up between CoreSignEditListener, which is always used, and BookUiSignEditListener, which is only used when the editable book alternative sign editor GUI is enabled
The event listeners pertaining to the editable book alternative sign editor GUI are no longer registered if it is disabled.
SignEditInteractionManager extracted out of SignEditListener
Suppressed JavaReflectionMemberAccess warning in org.deltik.mc.signedit.commands.SignCommand.getTargetBlockOfPlayer() because we develop against Bukkit 1.13 before they added org.bukkit.entity.LivingEntity.getTargetBlockExact()
UiSignEditInteraction now uses much less reflection, which should hopefully make it more resistant to breaking changes in the unstable Minecraft server API.
MinecraftReflector has been renamed to CraftBukkitReflector and no longer tries to access net.minecraft.… packages by name. This plugin now performs reflection name lookups against CraftBukkit, which is hopefully more stable.
Java 1.8 (bytecode version 52.0) remains the minimum version for broader compatibility, even though Minecraft 1.17 itself requires Java 16.
Gradle has been updated from version 6.5.1 to version 7.0.2.
Tab completion of existing sign text when using /sign set and looking at a sign (#19)
Changed
Undoing and redoing sign text will now only change the sign text. Previously, the sign orientation and dye color would also be modified to what was remembered in the history stack.
Undoing and redoing sign text is now possible even if the sign is replaced with one of a new material (e.g. a spruce sign in place of an oak sign) as long as the new sign is in the same position.
/sign redo now puts the current sign text into the history, so undoing the redo will now restore the latest sign text instead of the staged (remembered at the time of the first undo) text in the history.
Fixed
When undoing and redoing, the "before" section of the comparison now uses the current text/state of the sign rather than the remembered state from when the edit was made, which may be outdated.
/sign undo after using /sign ui would show "Sign did not change".
Under the Hood
Migrated tests from JUnit 4 to JUnit 5
SignText.verifyBlockPlaced() no longer tries to update the block's state to check if the block is placed. It is now called SignText.reloadTargetSign() and uses the non-invasive BlockState.isPlaced() method.
Tab completion for multi-line selection (e.g. /sign 1,2,… and /sign cut 3-4,1-…)
If another plugin changes the sign text after using this plugin to edit a sign, a warning will be displayed. The example below shows the warning when another plugin strips out formatting codes from the execution of /sign set 3 &b&lSignEdit:
New locale strings:
modified_by_another_plugin – Warning to the player that another plugin changed their applied sign text
section_decorator – Theme to apply to the text shown at the end of before_section and after_section
Changed
/sign subcommands are now case-insensitive. For example, /sign ClEaR is now the same as /sign clear. Previously, capitalized subcommands would not be understood as valid subcommands.
/sign ui with the native sign editor no longer modifies the real sign on the server to present human-editable formatting codes. Only the player who invoked the command will see the reformatted sign.
If a different plugin undoes the sign edit but does not cancel the corresponding SignChangeEvent, this plugin will now tell the player "Sign edit forbidden by policy or other plugin" instead of "Sign did not change".
Changed locale strings:
before_section now takes one argument ({0}) for optional text that may be shown at the end of the same line as the section.
after_section now takes one argument ({0}) for optional text that may be shown at the end of the same line as the section.
Fixed
/sign cut only put empty lines into the clipboard (#17)
/sign ui with the native sign editor incorrectly puts the de-formatted sign text into the history (regression from = 1.12.2)
/sign ui on Minecraft 1.16.2+ loses all formatting codes when opening the default (native) sign editor GUI.
/sign ui with the native sign editor would not show the actual "after" sign lines if another plugin modified the SignChangeEvent originating from the Minecraft client.
Line selection validation for /sign cut and /sign copy
Line selection validation should not accept empty delimiters at the end (e.g. /sign set 1,3,,,,)
Allow the administrator to opt in or out of the alternative sign editor GUI introduced in = 1.12.0 with the new configuration option compatibility.sign-ui: [Auto|EditableBook|Native]
New configuration option to send extra events (BlockBreakEvent and BlockPlaceEvent) on sign edit: compatibility.edit-validation: [Standard|Extra|None]
Fixed
If there was an error while editing a sign in two or more steps (e.g. right-mouse click action, sign editor GUI), the error won't be shown to the player, and the server console shows a "Cannot pass event … to SignEdit v…" error and stack trace. (#16)
The SignChangeEvent emitted natively by the native sign editor GUI is no longer sent twice.
Under the Hood
Removed the confusing concept of "in progress" interactions. These are no different from "pending" interactions.
Cleaned up dependencies passed from SignSubcommand to SignEditInteraction by letting Dagger 2 handle them
Configuration getters now validate their options and return the default if the existing value is invalid.
Builds now use the Bukkit v1.13 library to limit feature development to the minimum version supported
The alternative sign editor GUI introduced in = 1.12.0 has been restricted to Minecraft 1.16.1 only. Previously, the GUI was present on Minecraft 1.16 and above, but the bug that necessitated it was fixed in Minecraft 1.16.2. Using this version of the plugin on Minecraft 1.16.2 and higher will open the native sign editor GUI again.
Under the Hood
Build and test dependencies updated to their latest versions
sign_editor_item_name – The display name of the ephemeral book and quill used in Minecraft 1.16+ as an alternative for the broken native sign editor
right_click_air_to_open_sign_editor – Tells the player to look away from the targeted sign and right-mouse click to open the sign editor (Minecraft 1.16+)
right_click_air_to_apply_action_hint – Right-mouse click air action hint shown in /sign status, currently only used for /sign ui on Minecraft 1.16
Changed
Minimum Bukkit version is now v1.13 (was v1.12) due to the usage of Bukkit v1.13 materials for the alternative sign editor GUI
Changed locale strings:
cancelled_pending_right_click_action has been renamed to cancelled_pending_action and no longer explicates the right-mouse click.
no_right_click_action_to_cancel has been renamed to no_pending_action_to_cancel, and the associated action is now modified by "pending" rather than "right-click".
Fixed
Translation improvements for the Dutch (nl) locale Credit to SBDeveloper (#14)
Translation improvements for the Simplified Chinese (zh) and Traditional Chinese (zh-TW) locales Credit to Aobi (#15)
sign_editor_item_name – The display name of the ephemeral book and quill used in Minecraft 1.16+ as an alternative for the broken native sign editor
right_click_air_to_open_sign_editor – Tells the player to look away from the targeted sign and right-mouse click to open the sign editor (Minecraft 1.16+)
right_click_air_to_apply_action_hint – Right-mouse click air action hint shown in /sign status, currently only used for /sign ui on Minecraft 1.16
Changed
Minimum Bukkit version is now v1.13 (was v1.12) due to the usage of Bukkit v1.13 materials for the alternative sign editor GUI
Changed locale strings:
cancelled_pending_right_click_action has been renamed to cancelled_pending_action and no longer explicates the right-mouse click.
no_right_click_action_to_cancel has been renamed to no_pending_action_to_cancel, and the associated action is now modified by "pending" rather than "right-click".
Intermediate translation for Simplified Chinese (zh and zh-CN) locale replaces the machine translation of Chinese introduced in = 1.10.2. Credit to Aobi for the translation (#13)
Intermediate translation for Traditional Chinese (zh-TW) locale Credit to Aobi for the translation (#13)
Under the Hood
Gradle has been updated from version 6.1.1 to version 6.2.2.
Native translation for Dutch (nl) locale Credit to SBDeveloper (#10)
Fixed
In the English (en/default), German (de), and Dutch (nl) locales, if there is a pending sign action and the player runs /sign status, Minecraft 1.15+ displayed a non-breaking space block. This character has been changed to a normal space.
The theme (colors) and translations of this plugin can now be customized in the locale files! (Fixes #9)
Fixed
The locale configuration option was not working as documented. In = 1.10.2, if the player's locale was not supported, English would always be used as the fallback. This release follows the documented behavior: the fallback language is what is specified in the locale configuration option, and the fallback for that fallback is English.
The force-locale configuration option is now sanitized; a boolean value is now enforced.
Concatenation eliminated from localized messages, which increases flexibility for future language translations
Numbers are now correctly localized
Chinese punctuation
Chinese grammar? (Still machine-translated)
The Spigot api-version warning is now suppressed, at least from Spigot 1.13 through Spigot 1.15.2.
The configuration handler may excuse input/output (I/O) errors when it should not be continuing to run the plugin. I/O errors while enabling the plugin now prevent the plugin from starting.
Resolved a java.lang.NullPointerException in the configuration handler due to some mismanaged state when the ./plugins/SignEdit/ folder doesn't exist.
Changed
The configuration file config.yml is now rendered from a template. The template includes comments to make configuration easier to understand without consulting the online documentation.
Under the Hood
Builds now use ProGuard to shrink the JAR file size.
Each source code file now contains the proper copyright and license notice.
Replaced various method signatures containing the SignEditPlugin type with the Plugin interface
Gradle now supplies the plugin name to the resource templates.
Permission inheritance of /sign version was not defined correctly in plugin.yml
Permission inheritance of /sign cancel was not defined correctly in plugin.yml
In clicking mode false, some subcommands would spit out usage text if the player wasn't looking at a sign, but this should not happen.
It is now possible to input literal ampersand (&) characters using /sign subcommands thanks to smarter parsing of sign text and an escape sequence (\&).
Changed
The README should be more readable now.
The single line selector has been replaced with a multiple line selector.
When the plugin is unloading, the configuration file is now reloaded before being rewritten, so changes made while the plugin is loaded will now persist.
Players cannot edit signs that they do not have permission to edit. Every attempted edit is validated through a SignChangeEvent and will not succeed if another plugin or policy cancels the SignChangeEvent.
Under the Hood
Gradle has been updated from version 3.5rc2 to version 5.3.
A concept of "selected lines", which are parsed for multi-line interactions in /sign subcommands
Player chat interactions now happen through a ChatComms class.
Added a set of Exceptions for things that can go wrong in this plugin
Exceptions are centrally reported in ChatComms.
New model SignText handles the state of a single sign edit and can import, back up, restore, and change Bukkit Sign blocks.
New singleton SignTextClipboardManager facilitates cut, copy, and paste for each player.
New singleton SignTextHistoryManager maps players to their undo/redo history and tracks their state globally.
ArgStruct has been replaced with a more extensible ArgParser, including support for multiple absolute selected lines instead of a single relative selected line.
/sign cancel subcommand cancels the player's pending right-mouse click action when "clicking" mode is in effect. (Fixes #5)
If the permissions system forbids the player from running a /sign command or subcommand, the player will see an error message instead of the plugin silently ignoring the command.
Fixed
When the player types an out-of-bounds line number in /sign set <line>, Bukkit no longer vomits the full plugin usage help.
Changed
The plugin's general messages to the player were in red, but now they're gold to distinguish them from error messages, which are still red.
/sign ui command opens the native Minecraft sign editor on the target sign. (Fixes #3)
More fine-grained permissions in the format of signedit.COMMAND.SUBCOMMAND
Right before editing a sign, SignEdit simulates blanking out the targeted sign to see if another plugin is forbidding the player from editing the sign. SignEdit will no longer edit a sign that the player isn't allowed to edit.
Fixed
Error messages to the user are now more consistent.
Under The Hood
The plugin package was renamed from org.deltik.mc.SignEdit to org.deltik.mc.signedit.
The handling of "clicking" mode is now standardized for all sign editing methods.
Somewhat improved variable naming
SignSubcommand is the abstract for /sign subcommands.
plugin.yml is now much more descriptive
Tests were reorganized, but they're still not that great.
clicking: auto mode, which combines the best of the clicking: false and clicking: true modes. Now, the player can edit a sign if the player is looking at a sign or SignEdit will prompt for a right-click on a sign if the player is not looking at a sign. (Fixes #2)
clicking: auto is now the default mode. Before v1.7.0, the default was clicking: false.
The "set" or "clear" part of /sign {set,clear} <line> [<text>] is now optional because behavior can be inferred from <line>. (Fixes #1)
Fixed
Removed ambiguity from right-click instruction to player in clicking: true mode Before:§cNow right-click a block to set the line After:§cNow right-click a sign to set the line
Before a configuration file is written, it is now checked for sanity.
Possible crash if clicking config option is not properly set
Plugin errors out when running /sign {set,clear} <line> [<text>] and <line> is not an integer