Optimizes sign updating

This commit is contained in:
2024-04-20 18:35:31 +02:00
parent 58373f7d0f
commit 420e4fc185

View File

@@ -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 <p>The sign to clear</p>
* @param sign <p>The sign to update</p>
* @param lines <p>The sign's new lines</p>
*/
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 signData <p>All necessary sign information</p>
* @param output <p>The output list to write to</p>
*/
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 signData <p>All necessary sign information</p>
* @param freeGatesColored <p>Whether to display free gates in a different color</p>
* @param signLineIndex <p>The line to draw on</p>
* @param output <p>The output list to write to</p>
*/
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 signData <p>All necessary sign information</p>
* @param index <p>The index of the sign line to change</p>
* @param text <p>The new text on the sign</p>
* @param output <p>The output list to write to</p>
*/
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 freeGatesColored <p>Whether to display free gates in a different color</p>
* @param signLineIndex <p>The line to draw on</p>
* @param destinationIndex <p>The index of the destination to draw</p>
* @param output <p>The output list to write to</p>
*/
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 signData <p>All necessary sign information</p>
* @param output <p>The output list to write to</p>
*/
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 {
* <p>The sign for an in-active portal should display the right-click prompt and the network.</p>
*
* @param signData <p>All necessary sign information</p>
* @param output <p>The output list to write to</p>
*/
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 signData <p>All necessary sign information</p>
* @param output <p>The output list to write to</p>
*/
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);
}
}