diff --git a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java index 3432c2e..7e96e61 100644 --- a/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java +++ b/src/main/java/net/knarcraft/stargate/portal/PortalSignDrawer.java @@ -13,6 +13,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; +import org.bukkit.block.sign.Side; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -119,8 +120,7 @@ public class PortalSignDrawer { return; } - SignData signData = new SignData(sign, getMainColor(sign.getType()), getHighlightColor(sign.getType())); - drawSign(signData); + drawSign(new SignData(sign, getMainColor(sign.getType()), getHighlightColor(sign.getType()))); } /** @@ -152,38 +152,52 @@ public class PortalSignDrawer { Sign sign = signData.getSign(); ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); - //Clear sign - clearSign(sign); + + String[] lines = new String[4]; setLine(signData, 0, highlightColor + "-" + mainColor + translateAllColorCodes(portal.getName()) + - highlightColor + "-"); + highlightColor + "-", lines); if (!portal.getPortalActivator().isActive()) { //Default sign text - drawInactiveSign(signData); + drawInactiveSign(signData, lines); } else { if (portal.getOptions().isBungee()) { //Bungee sign - drawBungeeSign(signData); + drawBungeeSign(signData, lines); } else if (portal.getOptions().isFixed()) { //Sign pointing at one other portal - drawFixedSign(signData); + drawFixedSign(signData, lines); } else { //Networking stuff - drawNetworkSign(signData); + drawNetworkSign(signData, lines); } } - sign.update(); + updateSign(sign, lines); } /** - * Clears all lines of a sign, but does not update the sign + * Updates a sign, if necessary * - * @param sign
The sign to clear
+ * @param signThe sign to update
+ * @param linesThe sign's new lines
*/ - private void clearSign(@NotNull Sign sign) { - for (int index = 0; index <= 3; index++) { - SignHelper.setSignLine(sign, index, ""); + private void updateSign(@NotNull Sign sign, @NotNull String[] lines) { + boolean updateNecessary = false; + String[] oldLines = sign.getSide(Side.FRONT).getLines(); + for (int i = 0; i < 4; i++) { + if (!oldLines[i].equals(lines[i])) { + updateNecessary = true; + break; + } + } + + if (updateNecessary) { + for (int i = 0; i < 4; i++) { + SignHelper.setSignLine(sign, i, lines[i]); + } + + sign.update(); } } @@ -195,7 +209,11 @@ public class PortalSignDrawer { if (sign == null) { return; } - clearSign(sign); + + for (int index = 0; index <= 3; index++) { + SignHelper.setSignLine(sign, index, ""); + } + SignHelper.setSignLine(sign, 0, translateAllColorCodes(portal.getName())); sign.update(); } @@ -204,8 +222,9 @@ public class PortalSignDrawer { * Draws a sign with choose-able network locations * * @param signDataAll necessary sign information
+ * @param outputThe output list to write to
*/ - private void drawNetworkSign(@NotNull SignData signData) { + private void drawNetworkSign(@NotNull SignData signData, @NotNull String[] output) { PortalActivator destinations = portal.getPortalActivator(); int maxIndex = destinations.getDestinations().size() - 1; int signLineIndex = 0; @@ -215,21 +234,21 @@ public class PortalSignDrawer { //Last, and not only entry. Draw the entry two back if ((destinationIndex == maxIndex) && (maxIndex > 1)) { - drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 2); + drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 2, output); } //Not first entry. Draw the previous entry if (destinationIndex > 0) { - drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 1); + drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex - 1, output); } //Draw the chosen entry (line 2 or 3) - drawNetworkSignChosenLine(signData, freeGatesColored, ++signLineIndex); + drawNetworkSignChosenLine(signData, freeGatesColored, ++signLineIndex, output); //Has another entry and space on the sign if ((maxIndex >= destinationIndex + 1)) { - drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex + 1); + drawNetworkSignLine(signData, freeGatesColored, ++signLineIndex, destinationIndex + 1, output); } //Has another entry and space on the sign if ((maxIndex >= destinationIndex + 2) && (++signLineIndex <= 3)) { - drawNetworkSignLine(signData, freeGatesColored, signLineIndex, destinationIndex + 2); + drawNetworkSignLine(signData, freeGatesColored, signLineIndex, destinationIndex + 2, output); } } @@ -239,8 +258,10 @@ public class PortalSignDrawer { * @param signDataAll necessary sign information
* @param freeGatesColoredWhether to display free gates in a different color
* @param signLineIndexThe line to draw on
+ * @param outputThe output list to write to
*/ - private void drawNetworkSignChosenLine(@NotNull SignData signData, boolean freeGatesColored, int signLineIndex) { + private void drawNetworkSignChosenLine(@NotNull SignData signData, boolean freeGatesColored, int signLineIndex, + @NotNull String[] output) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); if (freeGatesColored) { @@ -248,10 +269,10 @@ public class PortalSignDrawer { boolean free = PermissionHelper.isFree(Objects.requireNonNull(portal.getActivePlayer()), portal, destination); ChatColor nameColor = (free ? freeColor : highlightColor); setLine(signData, signLineIndex, nameColor + ">" + (free ? freeColor : mainColor) + - translateAllColorCodes(portal.getDestinationName()) + nameColor + "<"); + translateAllColorCodes(portal.getDestinationName()) + nameColor + "<", output); } else { setLine(signData, signLineIndex, highlightColor + ">" + mainColor + - translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<"); + translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<", output); } } @@ -261,10 +282,11 @@ public class PortalSignDrawer { * @param signDataAll necessary sign information
* @param indexThe index of the sign line to change
* @param textThe new text on the sign
+ * @param outputThe output list to write to
*/ - public void setLine(@NotNull SignData signData, int index, @NotNull String text) { + public void setLine(@NotNull SignData signData, int index, @NotNull String text, @NotNull String[] output) { ChatColor mainColor = signData.getMainSignColor(); - SignHelper.setSignLine(signData.getSign(), index, mainColor + text); + output[index] = mainColor + text; } /** @@ -274,18 +296,19 @@ public class PortalSignDrawer { * @param freeGatesColoredWhether to display free gates in a different color
* @param signLineIndexThe line to draw on
* @param destinationIndexThe index of the destination to draw
+ * @param outputThe output list to write to
*/ private void drawNetworkSignLine(@NotNull SignData signData, boolean freeGatesColored, int signLineIndex, - int destinationIndex) { + int destinationIndex, @NotNull String[] output) { ChatColor mainColor = signData.getMainSignColor(); PortalActivator destinations = portal.getPortalActivator(); String destinationName = destinations.getDestinations().get(destinationIndex); if (freeGatesColored) { Portal destination = PortalHandler.getByName(destinationName, portal.getNetwork()); boolean free = PermissionHelper.isFree(Objects.requireNonNull(portal.getActivePlayer()), portal, destination); - setLine(signData, signLineIndex, (free ? freeColor : mainColor) + translateAllColorCodes(destinationName)); + setLine(signData, signLineIndex, (free ? freeColor : mainColor) + translateAllColorCodes(destinationName), output); } else { - setLine(signData, signLineIndex, mainColor + translateAllColorCodes(destinationName)); + setLine(signData, signLineIndex, mainColor + translateAllColorCodes(destinationName), output); } } @@ -293,15 +316,16 @@ public class PortalSignDrawer { * Draws the sign of a BungeeCord portal * * @param signDataAll necessary sign information
+ * @param outputThe output list to write to
*/ - private void drawBungeeSign(@NotNull SignData signData) { + private void drawBungeeSign(@NotNull SignData signData, @NotNull String[] output) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); - setLine(signData, 1, Stargate.getString(Message.BUNGEE_SIGN)); + setLine(signData, 1, Stargate.getString(Message.BUNGEE_SIGN), output); setLine(signData, 2, highlightColor + ">" + mainColor + - translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<"); + translateAllColorCodes(portal.getDestinationName()) + highlightColor + "<", output); setLine(signData, 3, highlightColor + "[" + mainColor + translateAllColorCodes(portal.getNetwork()) + - highlightColor + "]"); + highlightColor + "]", output); } /** @@ -310,17 +334,18 @@ public class PortalSignDrawer { *The sign for an in-active portal should display the right-click prompt and the network.
* * @param signDataAll necessary sign information
+ * @param outputThe output list to write to
*/ - private void drawInactiveSign(@NotNull SignData signData) { + private void drawInactiveSign(@NotNull SignData signData, @NotNull String[] output) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); - setLine(signData, 1, Stargate.getString(Message.SIGN_RIGHT_CLICK)); - setLine(signData, 2, Stargate.getString(Message.SIGN_TO_USE)); + setLine(signData, 1, Stargate.getString(Message.SIGN_RIGHT_CLICK), output); + setLine(signData, 2, Stargate.getString(Message.SIGN_TO_USE), output); if (!portal.getOptions().isNoNetwork()) { setLine(signData, 3, highlightColor + "(" + mainColor + translateAllColorCodes(portal.getNetwork()) + - highlightColor + ")"); + highlightColor + ")", output); } else { - setLine(signData, 3, ""); + setLine(signData, 3, "", output); } } @@ -328,8 +353,9 @@ public class PortalSignDrawer { * Draws a sign pointing to a fixed location * * @param signDataAll necessary sign information
+ * @param outputThe output list to write to
*/ - private void drawFixedSign(@NotNull SignData signData) { + private void drawFixedSign(@NotNull SignData signData, @NotNull String[] output) { ChatColor highlightColor = signData.getHighlightSignColor(); ChatColor mainColor = signData.getMainSignColor(); Portal destinationPortal = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()), @@ -337,20 +363,20 @@ public class PortalSignDrawer { String destinationName = portal.getOptions().isRandom() ? Stargate.getString(Message.SIGN_RANDOM) : (destinationPortal != null ? destinationPortal.getName() : portal.getDestinationName()); setLine(signData, 1, highlightColor + ">" + mainColor + translateAllColorCodes(destinationName) + - highlightColor + "<"); + highlightColor + "<", output); if (portal.getOptions().isNoNetwork()) { - setLine(signData, 2, ""); + setLine(signData, 2, "", output); } else { setLine(signData, 2, highlightColor + "(" + mainColor + - translateAllColorCodes(portal.getNetwork()) + highlightColor + ")"); + translateAllColorCodes(portal.getNetwork()) + highlightColor + ")", output); } Portal destination = PortalHandler.getByName(Portal.cleanString(portal.getDestinationName()), portal.getNetwork()); if (destination == null && !portal.getOptions().isRandom()) { - setLine(signData, 3, errorColor + Stargate.getString(Message.SIGN_DISCONNECTED)); + setLine(signData, 3, errorColor + Stargate.getString(Message.SIGN_DISCONNECTED), output); } else { - setLine(signData, 3, ""); + setLine(signData, 3, "", output); } }