Adds a new configuration option to remove permission signs without a physical sign on startup

This commit is contained in:
Kristian Knarvik 2022-01-22 18:56:56 +01:00
parent b89b993220
commit ee4f4355f5
4 changed files with 28 additions and 4 deletions

View File

@ -34,6 +34,8 @@ permanently by another cause, when they expire.
- language - The language used for the plugin (en, nb-no) - language - The language used for the plugin (en, nb-no)
- perWorldPermissions - Sets permissions for the current world instead of setting them globally - perWorldPermissions - Sets permissions for the current world instead of setting them globally
- removePermissionSignIfMissing - If enabled, permission signs that have lost their physical sign will be removed during
startup. This prevents permission signs from staying in a broken state until the sign is replaced.
- enableIndirectSignProtection - Protects permission signs against indirect sources such as pistons and explosions. Only - enableIndirectSignProtection - Protects permission signs against indirect sources such as pistons and explosions. Only
disable this if your permission signs are protected by another plugin. disable this if your permission signs are protected by another plugin.
- enableExtensiveSignProtection - Whether to protect signs on "unstable" blocks such as sand or anvils. Does not protect - enableExtensiveSignProtection - Whether to protect signs on "unstable" blocks such as sand or anvils. Does not protect

View File

@ -45,6 +45,7 @@ public final class PermissionSigns extends JavaPlugin {
private static boolean perWorldPermissions; private static boolean perWorldPermissions;
private static boolean enableExtensiveSignProtection; private static boolean enableExtensiveSignProtection;
private static boolean enableIndirectSignProtection; private static boolean enableIndirectSignProtection;
private static boolean removePermissionSignIfMissing;
/** /**
* Instantiates the permission signs class * Instantiates the permission signs class
@ -141,6 +142,15 @@ public final class PermissionSigns extends JavaPlugin {
return enableIndirectSignProtection; return enableIndirectSignProtection;
} }
/**
* Gets whether to remove permissions signs if their physical signs are missing
*
* @return <p>Whether tor remove permission signs if their signs are missing</p>
*/
public static boolean removePermissionSignIfMissing() {
return removePermissionSignIfMissing;
}
@Override @Override
public void reloadConfig() { public void reloadConfig() {
super.reloadConfig(); super.reloadConfig();
@ -183,6 +193,7 @@ public final class PermissionSigns extends JavaPlugin {
perWorldPermissions = config.getBoolean("perWorldPermissions", false); perWorldPermissions = config.getBoolean("perWorldPermissions", false);
enableExtensiveSignProtection = config.getBoolean("enableExtensiveSignProtection", false); enableExtensiveSignProtection = config.getBoolean("enableExtensiveSignProtection", false);
enableIndirectSignProtection = config.getBoolean("enableIndirectSignProtection", true); enableIndirectSignProtection = config.getBoolean("enableIndirectSignProtection", true);
removePermissionSignIfMissing = config.getBoolean("removePermissionSignIfMissing", true);
saveConfig(); saveConfig();
return language; return language;
} }

View File

@ -31,7 +31,7 @@ public final class SignManager {
private static final File signsFile = new File(PermissionSigns.getInstance().getDataFolder(), "data.yml"); private static final File signsFile = new File(PermissionSigns.getInstance().getDataFolder(), "data.yml");
private SignManager() { private SignManager() {
} }
/** /**
@ -114,11 +114,15 @@ public final class SignManager {
*/ */
private static void redrawSigns() { private static void redrawSigns() {
Bukkit.getScheduler().scheduleSyncDelayedTask(PermissionSigns.getInstance(), () -> { Bukkit.getScheduler().scheduleSyncDelayedTask(PermissionSigns.getInstance(), () -> {
List<Location> invalidPermissionSigns = new ArrayList<>();
for (Location key : managedSigns.keySet()) { for (Location key : managedSigns.keySet()) {
PermissionSign permissionSign = managedSigns.get(key); PermissionSign permissionSign = managedSigns.get(key);
Block signBlock = key.getBlock(); Block signBlock = key.getBlock();
BlockState state = signBlock.getState(); BlockState state = signBlock.getState();
if (!(state instanceof Sign sign)) { if (!(state instanceof Sign sign)) {
if (PermissionSigns.removePermissionSignIfMissing()) {
invalidPermissionSigns.add(permissionSign.getSignLocation());
}
continue; continue;
} }
String[] newLines = permissionSign.getSignLines(); String[] newLines = permissionSign.getSignLines();
@ -130,6 +134,9 @@ public final class SignManager {
} }
sign.update(); sign.update();
} }
for (Location signLocation : invalidPermissionSigns) {
SignManager.removeSign(signLocation);
}
}); });
} }

View File

@ -1,14 +1,18 @@
# The language to use for the plugin (en, nb-no) # The language to use for the plugin (en, nb-no)
language: en language: en
# Whether to only give permissions for a single world, instead of granting permissions for all worlds # Whether to only give permissions for a single world, instead of granting permissions for all worlds.
perWorldPermissions: false perWorldPermissions: false
# Whether to remove permission signs during loading if the physical sign is missing. This prevents permission signs from
# existing in a strange state until a new sign is placed in the permission sign's defined location.
removePermissionSignIfMissing: true
# Whether to enable protection against indirect damage sources such as explosions and pistons. You can disable this to # Whether to enable protection against indirect damage sources such as explosions and pistons. You can disable this to
# save some resources if permission signs are only placed in a protected area. WARNING: Disabling this and placing # save some resources if permission signs are only placed in a protected area. WARNING: Disabling this and placing
# permission signs in an unprotected area allows unauthorized players to destroy (but not de-register) permission signs # permission signs in an unprotected area allows unauthorized players to destroy (but not de-register) permission signs.
enableIndirectSignProtection: true enableIndirectSignProtection: true
# Whether to protect permission signs on falling blocks (sand, gravel, anvil, drip-stone, signs) by preventing breakage # Whether to protect permission signs on falling blocks (sand, gravel, anvil, drip-stone, signs) by preventing breakage
# of the blocks that would cause a sign to be destroyed # of the blocks that would cause a sign to be destroyed.
enableExtensiveSignProtection: false enableExtensiveSignProtection: false