PlotSquared/Core/src/main/java/com/plotsquared/core/configuration/Settings.java

823 lines
39 KiB
Java

/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.configuration;
import com.plotsquared.core.configuration.file.YamlConfiguration;
import net.kyori.adventure.text.event.ClickEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class Settings extends Config {
/*
START OF CONFIGURATION SECTION:
NOTE: Fields are saved in declaration order, classes in reverse order
*/
@Comment("This value is not configurable. It shows the platform you are using.") // This is a comment
@Final
public static String PLATFORM; // These values are set from PlotSquared before loading
@Comment({"Show additional information in console. It helps us at IntellectualSites to find out more about an issue.",
"Leave it off if you don't need it, it can spam your console."})
public static boolean DEBUG = true;
@Create // This value will be generated automatically
public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null;
// A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks
public static void save(File file) {
save(file, Settings.class);
}
public static void load(File file) {
load(file, Settings.class);
}
public static boolean convertLegacy(File file) {
if (!file.exists()) {
return false;
}
YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
// Protection
Redstone.DISABLE_OFFLINE = config.getBoolean("protection.redstone.disable-offline");
Redstone.DISABLE_UNOCCUPIED = config
.getBoolean("protection.redstone.disable-unoccupied", Redstone.DISABLE_UNOCCUPIED);
// UUID
UUID.OFFLINE = config.getBoolean("UUID.offline", UUID.OFFLINE);
UUID.FORCE_LOWERCASE = config.getBoolean("UUID.force-lowercase", UUID.FORCE_LOWERCASE);
// Mob stuff
Enabled_Components.KILL_ROAD_MOBS =
config.getBoolean("kill_road_mobs", Enabled_Components.KILL_ROAD_MOBS);
Enabled_Components.KILL_ROAD_VEHICLES =
config.getBoolean("kill_road_vehicles", Enabled_Components.KILL_ROAD_VEHICLES);
// Clearing + Expiry
//FAST_CLEAR = config.getBoolean("clear.fastmode");
Enabled_Components.PLOT_EXPIRY =
config.getBoolean("clear.auto.enabled", Enabled_Components.PLOT_EXPIRY);
if (Enabled_Components.PLOT_EXPIRY) {
Enabled_Components.BAN_DELETER = config.getBoolean("clear.on.ban");
AUTO_CLEAR = new ConfigBlock<>();
AUTO_CLEAR.put("task1", new Auto_Clear());
Auto_Clear task = AUTO_CLEAR.get("task1");
task.CALIBRATION = new Auto_Clear.CALIBRATION();
task.DAYS = config.getInt("clear.auto.days", task.DAYS);
task.THRESHOLD = config.getInt("clear.auto.threshold", task.THRESHOLD);
task.CONFIRMATION = config.getBoolean("clear.auto.confirmation", task.CONFIRMATION);
task.CALIBRATION.CHANGES =
config.getInt("clear.auto.calibration.changes", task.CALIBRATION.CHANGES);
task.CALIBRATION.FACES =
config.getInt("clear.auto.calibration.faces", task.CALIBRATION.FACES);
task.CALIBRATION.DATA =
config.getInt("clear.auto.calibration.data", task.CALIBRATION.DATA);
task.CALIBRATION.AIR =
config.getInt("clear.auto.calibration.air", task.CALIBRATION.AIR);
task.CALIBRATION.VARIETY =
config.getInt("clear.auto.calibration.variety", task.CALIBRATION.VARIETY);
task.CALIBRATION.CHANGES_SD =
config.getInt("clear.auto.calibration.changes_sd", task.CALIBRATION.CHANGES_SD);
task.CALIBRATION.FACES_SD =
config.getInt("clear.auto.calibration.faces_sd", task.CALIBRATION.FACES_SD);
task.CALIBRATION.DATA_SD =
config.getInt("clear.auto.calibration.data_sd", task.CALIBRATION.DATA_SD);
task.CALIBRATION.AIR_SD =
config.getInt("clear.auto.calibration.air_sd", task.CALIBRATION.AIR_SD);
task.CALIBRATION.VARIETY_SD =
config.getInt("clear.auto.calibration.variety_sd", task.CALIBRATION.VARIETY_SD);
}
// Done
Done.REQUIRED_FOR_RATINGS =
config.getBoolean("approval.ratings.check-done", Done.REQUIRED_FOR_RATINGS);
Done.COUNTS_TOWARDS_LIMIT =
config.getBoolean("approval.done.counts-towards-limit", Done.COUNTS_TOWARDS_LIMIT);
Done.RESTRICT_BUILDING =
config.getBoolean("approval.done.restrict-building", Done.RESTRICT_BUILDING);
Done.REQUIRED_FOR_DOWNLOAD =
config.getBoolean("approval.done.required-for-download", Done.REQUIRED_FOR_DOWNLOAD);
// Schematics
Paths.SCHEMATICS = config.getString("schematics.save_path", Paths.SCHEMATICS);
// Web
Web.URL = config.getString("web.url", Web.URL);
// Caching
Enabled_Components.RATING_CACHE =
config.getBoolean("cache.ratings", Enabled_Components.RATING_CACHE);
// Rating system
Ratings.CATEGORIES = config.contains("ratings.categories") ?
config.getStringList("ratings.categories") :
Ratings.CATEGORIES;
// Update Notifications
Enabled_Components.UPDATE_NOTIFICATIONS =
config.getBoolean("update-notifications", Enabled_Components.UPDATE_NOTIFICATIONS);
// Teleportation
Teleport.DELAY = config.getInt("teleport.delay", Teleport.DELAY);
Teleport.ON_LOGIN = config.getBoolean("teleport.on_login", Teleport.ON_LOGIN);
Teleport.ON_DEATH = config.getBoolean("teleport.on_death", Teleport.ON_DEATH);
Teleport.ON_CLEAR = config.getBoolean("teleport.on_clear", Teleport.ON_CLEAR);
Teleport.ON_DELETE = config.getBoolean("teleport.on_delete", Teleport.ON_DELETE);
// Chunk processor
Enabled_Components.CHUNK_PROCESSOR =
config.getBoolean("chunk-processor.enabled", Enabled_Components.CHUNK_PROCESSOR);
Chunk_Processor.AUTO_TRIM =
config.getBoolean("chunk-processor.auto-unload", Chunk_Processor.AUTO_TRIM);
Chunk_Processor.MAX_TILES =
config.getInt("chunk-processor.max-blockstates", Chunk_Processor.MAX_TILES);
Chunk_Processor.MAX_ENTITIES =
config.getInt("chunk-processor.max-entities", Chunk_Processor.MAX_ENTITIES);
Chunk_Processor.DISABLE_PHYSICS =
config.getBoolean("chunk-processor.disable-physics", Chunk_Processor.DISABLE_PHYSICS);
// Comments
Enabled_Components.COMMENT_NOTIFIER = config
.getBoolean("comments.notifications.enabled", Enabled_Components.COMMENT_NOTIFIER);
// Plot limits
Claim.MAX_AUTO_AREA = config.getInt("claim.max-auto-area", Claim.MAX_AUTO_AREA);
Limit.MAX_PLOTS = config.getInt("max_plots", Limit.MAX_PLOTS);
Limit.GLOBAL = config.getBoolean("global_limit", Limit.GLOBAL);
// Miscellaneous
DEBUG = config.getBoolean("debug", DEBUG);
Enabled_Components.DATABASE_PURGER =
config.getBoolean("auto-purge", Enabled_Components.DATABASE_PURGER);
return true;
}
@Comment("This is an auto clearing task called `task1`")
@BlockName("task1")
// The name for the default block
public static final class Auto_Clear extends ConfigBlock {
@Create // This value has to be generated since an instance isn't static
public CALIBRATION CALIBRATION = null;
public int THRESHOLD = -1;
public int REQUIRED_PLOTS = -1;
public boolean CONFIRMATION = true;
public int DAYS = 90;
public int SKIP_ACCOUNT_AGE_DAYS = -1;
@Comment("True, if a plot should be deleted if the plot owner is unknown to the server")
public boolean DELETE_IF_OWNER_IS_UNKNOWN = false;
public List<String> WORLDS = new ArrayList<>(Collections.singletonList("*"));
@Comment("See: https://intellectualsites.gitbook.io/plotsquared/optimization/plot-analysis for a description of each value.")
public static final class CALIBRATION {
public int VARIETY = 0;
public int VARIETY_SD = 0;
public int CHANGES = 0;
public int CHANGES_SD = 1;
public int FACES = 0;
public int FACES_SD = 0;
public int DATA_SD = 0;
public int AIR = 0;
public int AIR_SD = 0;
public int DATA = 0;
}
}
@Comment({"Chunk processor related settings",
"See https://intellectualsites.gitbook.io/plotsquared/optimization/chunk-processor for more information."})
public static class Chunk_Processor {
@Comment("Auto trim will not save chunks which aren't claimed")
public static boolean
AUTO_TRIM = false;
@Comment("Max tile entities per chunk")
public static int MAX_TILES = 4096;
@Comment("Max entities per chunk")
public static int MAX_ENTITIES = 512;
@Comment("Disable block physics")
public static boolean DISABLE_PHYSICS = false;
}
@Comment({"UUID settings",
"DO NOT EDIT them unless you know what you are doing."})
public static class UUID {
@Comment("Force using offline UUIDs (it usually detects the right mode)")
public static boolean OFFLINE = false;
@Comment("Force using lowercase UUIDs")
public static boolean FORCE_LOWERCASE = false;
@Comment("How many UUIDs that may be stored in the cache")
public static int UUID_CACHE_SIZE = 100000;
@Comment("Rate limit (per 10 minutes) for background UUID fetching from the Mojang API")
public static int BACKGROUND_LIMIT = 200;
@Comment("Whether the Mojang API service is enabled for impromptu api calls. If false only the Background task will use" +
" http requests to fill the UUID cache (requires restart)")
public static boolean IMPROMPTU_SERVICE_MOJANG_API = true;
@Comment("Rate limit (per 10 minutes) for random UUID fetching from the Mojang API")
public static int IMPROMPTU_LIMIT = 300;
@Comment("Timeout (in milliseconds) for non-blocking UUID requests (mostly commands)")
public static long NON_BLOCKING_TIMEOUT = 3000L;
@Comment("Timeout (in milliseconds) for blocking UUID requests (events)")
public static long BLOCKING_TIMEOUT = 10L;
@Comment("Whether or not PlotSquared should read from the legacy database")
public static boolean LEGACY_DATABASE_SUPPORT = true;
@Comment("Whether or not PlotSquared should return Unknown if it fails to fulfill a request")
public static boolean UNKNOWN_AS_DEFAULT = true;
@Comment("Whether or not automatic background caching should be enabled. It is HIGHLY recommended to keep this turned on."
+ " This should only be disabled if the server has a very large number of plots (>100k)")
public static boolean BACKGROUND_CACHING_ENABLED = true;
@Comment("Whether the PaperMC service is enabled")
public static boolean SERVICE_PAPER = true;
@Comment("Whether the LuckPerms service is enabled")
public static boolean SERVICE_LUCKPERMS = true;
@Comment("Whether the Bukkit service is enabled")
public static boolean SERVICE_BUKKIT = true;
@Comment("Whether the EssentialsX service is enabled")
public static boolean SERVICE_ESSENTIALSX = true;
}
@Comment("General settings")
public static final class General {
@Comment("Display scientific numbers (4.2E8)")
public static boolean SCIENTIFIC = false;
@Comment("Replace wall when merging")
public static boolean MERGE_REPLACE_WALL = true;
@Comment("Always show explosion Particles, even if explosion flag is set to false")
public static boolean ALWAYS_SHOW_EXPLOSIONS = false;
@Comment({"Blocks that may not be used in plot components",
"Checkout the wiki article regarding plot components before modifying: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
public static List<String>
INVALID_BLOCKS = Arrays.asList(
// Acacia Stuff
"acacia_button", "acacia_fence_gate", "acacia_door", "acacia_pressure_plate",
"acacia_trapdoor", "acacia_sapling", "acacia_sign", "acacia_wall_sign", "acacia_leaves",
// Birch Stuff
"birch_button", "birch_fence_gate", "birch_door", "birch_pressure_plate",
"birch_trapdoor", "birch_sapling", "birch_sign", "birch_wall_sign", "birch_leaves",
// Dark Oak Stuff
"dark_oak_button", "dark_oak_fence_gate", "dark_oak_door", "dark_oak_pressure_plate",
"dark_oak_trapdoor", "dark_oak_sapling", "dark_oak_sign", "dark_oak_wall_sign",
"dark_oak_leaves",
// Jungle Stuff
"jungle_button", "jungle_fence_gate", "jungle_door", "jungle_pressure_plate",
"jungle_trapdoor", "jungle_sapling", "jungle_sign", "jungle_wall_sign", "jungle_leaves",
// Oak Stuff
"oak_button", "oak_fence_gate", "oak_door", "oak_pressure_plate", "oak_trapdoor",
"oak_sapling", "oak_sign", "oak_wall_sign", "oak_leaves",
// Spruce Stuff
"spruce_button", "spruce_fence_gate", "spruce_door", "spruce_pressure_plate",
"spruce_trapdoor", "spruce_sapling", "spruce_sign", "spruce_wall_sign", "spruce_leaves",
// Rails
"activator_rail", "detector_rail", "rail",
// Flowers
"allium", "azure_bluet", "blue_orchid", "dandelion", "lilac", "orange_tulip",
"oxeye_daisy", "peony", "pink_tulip", "poppy", "potted_allium", "potted_azure_bluet",
"potted_birch_sapling", "potted_blue_orchid", "potted_brown_mushroom", "potted_cactus",
"potted_fern", "potted_jungle_sapling", "potted_oak_sapling", "potted_orange_tulip",
"potted_oxeye_daisy", "potted_pink_tulip", "potted_red_mushroom", "potted_red_tulip",
"red_mushroom", "red_tulip", "potted_spruce_sapling", "potted_white_tulip", "rose_bush",
"sunflower", "white_tulip", "cornflower", "wither_rose",
// Stems
"attached_melon_stem", "attached_pumpkin_stem", "melon_stem", "pumpkin_stem",
"mushroom_stem",
// Plants
"beetroots", "brown_mushroom", "cactus", "carrots", "chorus_flower", "chorus_plant",
"cocoa", "dead_bush", "fern", "kelp_plant", "large_fern", "lily_pad", "potatoes",
"sea_pickle", "seagrass", "sugar_cane", "tall_grass", "tall_seagrass", "vine", "wheat",
"bamboo",
// Misc
"anvil", "barrier", "beacon", "brewing_stand", "bubble_column", "cake", "cobweb",
"comparator", "creeper_head", "creeper_wall_header", "damaged_anvil",
"daylight_detector", "dragon_egg", "dragon_head", "dragon_wall_head",
"enchanting_table", "end_gateway", "end_portal", "end_rod", "ender_chest", "chest",
"flower_pot", "grass", "heavy_weighted_pressure_plate", "lever",
"light_weighted_pressure_plate", "player_head", "redstone_wire", "repeater",
"comparator", "redstone_torch", "torch", "redstone_wall_torch", "wall_torch", "sign",
"skeleton_skull", "skeleton_wall_skull", "snow", "stone_pressure_plate",
"trapped_chest", "tripwire", "tripwire_hook", "turtle_egg", "wall_sign", "zombie_head",
"zombie_wall_head", "bell",
// Black Stuff
"black_bed", "black_banner", "black_carpet", "black_concrete_powder",
"black_wall_banner",
// Blue Stuff
"blue_bed", "blue_banner", "blue_carpet", "blue_concrete_powder", "blue_wall_banner",
// Brown Stuff
"brown_bed", "brown_banner", "brown_carpet", "brown_concrete_powder",
"brown_wall_banner",
// Cyan Stuff
"cyan_bed", "cyan_banner", "cyan_concrete_powder", "cyan_carpet", "cyan_wall_banner",
// Gray Stuff
"gray_bed", "gray_banner", "gray_concrete_powder", "gray_carpet", "gray_wall_banner",
// Green Stuff
"green_bed", "green_banner", "green_concrete_powder", "green_carpet",
"green_wall_banner",
// Light blue Stuff
"light_blue_bed", "light_blue_banner", "light_blue_concrete_powder",
"light_blue_carpet", "light_blue_wall_banner",
// Light Gray Stuff
"light_gray_bed", "light_gray_banner", "light_gray_concrete_powder",
"light_gray_carpet", "light_gray_wall_banner",
// Lime Stuff
"lime_bed", "lime_banner", "lime_concrete_powder", "lime_carpet", "lime_wall_banner",
// Magenta Stuff
"magenta_bed", "magenta_banner", "magenta_concrete_powder", "magenta_carpet",
"magenta_wall_banner",
// Orange Stuff
"orange_bed", "orange_banner", "orange_concrete_powder", "orange_carpet",
"orange_wall_banner",
// Pink Stuff
"pink_bed", "pink_banner", "pink_concrete_powder", "pink_carpet", "pink_wall_banner",
// Purple Stuff
"purple_bed", "purple_banner", "purple_concrete_powder", "purple_carpet",
"purple_wall_banner",
// Red Stuff
"red_bed", "red_banner", "red_concrete_powder", "red_carpet", "red_wall_banner",
// White Stuff
"white_bed", "white_banner", "white_concrete_powder", "white_carpet",
"white_wall_banner",
// Yellow Stuff
"yellow_bed", "yellow_banner", "yellow_concrete_powder", "yellow_carpet",
"yellow_wall_banner",
// Corals
"brain_coral", "brain_coral_fan", "brain_coral_wall_fan", "bubble_coral",
"bubble_coral_block", "bubble_coral_fan", "bubble_coral_wall_fan", "dead_brain_coral",
"dead_brain_coral_block", "dead_brain_coral_fan", "dead_brain_coral_wall_fan",
"dead_bubble_coral", "dead_bubble_coral_fan", "dead_bubble_coral_wall_fan",
"dead_fire_coral", "dead_fire_coral_block", "dead_fire_coral_fan",
"dead_fire_coral_wall_fan", "dead_horn_coral", "dead_horn_coral_block",
"dead_horn_coral_fan", "dead_tube_coral", "dead_tube_coral_wall_fan",
"dried_kelp_block", "horn_coral", "horn_coral_block", "horn_coral_fan",
"horn_coral_wall_fan", "tube_coral", "tube_coral_block", "tube_coral_fan",
"tube_coral_wall_fan"
);
}
@Comment("Update checker settings")
public static final class UpdateChecker {
@Comment("How often to poll for updates (in minutes)")
public static int POLL_RATE = 360;
@Comment("Only notify console once after an update is found")
public static boolean
NOTIFY_ONCE = true;
}
@Comment({"Schematic Settings",
"See https://intellectualsites.gitbook.io/plotsquared/schematics/schematic-on-claim for more information."})
public static final class Schematics {
@Comment(
"Whether schematic based generation should paste schematic on top of plots, or from Y=1")
public static boolean PASTE_ON_TOP = true;
@Comment(
"Whether schematic based road generation should paste schematic on top of roads, or from Y=1")
public static boolean PASTE_ROAD_ON_TOP = true;
@Comment({"If schematics that do not match a plot's size should be pasted anyway",
" - This will still only paste a schematic with a plot's bounds.",
" - If a schematic is too big, it will cut off, and if too small, will not full the plot."})
public static boolean PASTE_MISMATCHES = true;
@Comment({"If the wall height should be taken into account when calculating the road schematic paste height",
" - If true, will use the lower of wall and road height.",
" - If true, will ensure correct schematic behaviour (no parts are cut off).",
" - Set to false if you experience the road being set one block too low",
" (only for road schematics created pre 6.1.4)."})
public static boolean USE_WALL_IN_ROAD_SCHEM_HEIGHT = true;
}
@Comment("Configure the paths that will be used")
public static final class Paths {
public static String SCHEMATICS = "schematics";
public static String TEMPLATES = "templates";
}
@Deprecated(forRemoval = true, since = "6.0.0")
@Comment("Schematic interface related settings")
public static class Web {
@Comment({"The web interface for schematics", " - All schematics are anonymous and private",
" - Downloads can be deleted by the user",
" - Supports plot uploads, downloads and saves",})
public static String URL =
"https://schem.intellectualsites.com/plots/";
@Comment({"Whether or not the legacy web interface will be used for /plot download and /plot save",
"Note that this will be removed in future versions. Updating to Arkitektonika is highly suggested"})
public static boolean LEGACY_WEBINTERFACE = false;
}
@Comment("Schematic web interface related settings")
public static class Arkitektonika {
@Comment("The url of the backend server (Arkitektonika)")
public static String BACKEND_URL = "https://api.schematic.cloud/";
@Comment({"The url used to generate a download link from.",
"{key} will be replaced with the generated key"})
public static String DOWNLOAD_URL = "https://api.schematic.cloud/download/{key}";
@Comment({"The url used to generate a deletion link from.",
"{key} will be replaced with the generated key"})
public static String DELETE_URL = "https://api.schematic.cloud/delete/{key}";
}
@Comment("Used to format the plot creation date placeholder. Modifying the format does not affect the storage time.")
public static class Timeformat {
@Comment("The date used formatted in ISO 8601")
public static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss z";
@Comment("The time zone used")
public static String TIME_ZONE = "GMT";
}
@Comment("Miscellaneous settings")
public static final class Done {
@Comment("Require a plot marked as done to download (/plot download)")
public static boolean
REQUIRED_FOR_DOWNLOAD = false;
@Comment("Only plots marked as done can be rated")
public static boolean
REQUIRED_FOR_RATINGS = false;
@Comment("Restrict building when a plot is marked as done")
public static boolean
RESTRICT_BUILDING = false;
@Comment("The limit being how many plots a player can claim")
public static boolean
COUNTS_TOWARDS_LIMIT = true;
}
@Comment("Chat related settings")
public static final class Chat {
@Comment("Should the plot chat be logged to console?")
public static boolean LOG_PLOTCHAT_TO_CONSOLE = true;
@Comment({"Whether an action bar message should be send over a chat message for notification purposes such for the ",
"notify-enter, notify-leave, greeting or farewell flag."})
public static boolean NOTIFICATION_AS_ACTIONBAR = false;
@Comment({"The click event actions that should be removed from user input in e.g. plot flags like 'greeting'.",
"Actions like 'RUN_COMMAND' may be used maliciously as players could trick staff into clicking on messages",
"triggering destructive commands."})
public static List<String> CLICK_EVENT_ACTIONS_TO_REMOVE = Arrays.stream(ClickEvent.Action.values())
.map(Enum::name)
.collect(Collectors.toList());
}
@Comment("Relating to how many plots someone can claim")
public static final class Limit {
@Comment("Should the limit be global (over multiple worlds)")
public static boolean GLOBAL =
false;
@Comment({"The max range of integer permissions to check for, e.g. 'plots.plot.127' or 'plots.set.flag.mob-cap.127'",
"The value covers the permission range to check, you need to assign the permission to players/groups still",
"Modifying the value does NOT change the amount of plots players can claim"})
public static int MAX_PLOTS = 127;
}
@Comment({"Backup related settings",
"See https://intellectualsites.gitbook.io/plotsquared/plot-backups for more information."})
public static final class Backup {
@Comment("Automatically backup plots when destructive commands are performed, e.g. /plot clear")
public static boolean AUTOMATIC_BACKUPS = true;
@Comment("Maximum amount of backups associated with a plot")
public static int
BACKUP_LIMIT = 3;
@Comment("Whether or not backups should be deleted when the plot is unclaimed")
public static boolean DELETE_ON_UNCLAIM = true;
}
@Comment("Confirmation timeout related settings")
public static final class Confirmation {
@Comment("Timeout before a confirmation prompt expires")
public static int
CONFIRMATION_TIMEOUT_SECONDS = 20;
}
@Comment("Teleportation related settings")
public static final class Teleport {
@Comment("Teleport to your plot on death")
public static boolean ON_DEATH = false;
@Comment("Teleport to your plot on login")
public static boolean ON_LOGIN = false;
@Comment("Teleport to your plot on claim (/plot claim)")
public static boolean ON_CLAIM = true;
@Comment("Teleport to your plot on auto (/plot auto)")
public static boolean ON_AUTO = true;
@Comment({"Add a delay to all teleport commands (in seconds)",
"Assign `plots.teleport.delay.bypass` to bypass the cooldown"})
public static int DELAY = 0;
@Comment("Teleport outside of the plot before clearing")
public static boolean ON_CLEAR = false;
@Comment("Teleport outside of the plot before deleting")
public static boolean ON_DELETE = false;
@Comment("The visit command is ordered by world instead of globally")
public static boolean PER_WORLD_VISIT = false;
@Comment("Search merged plots for having multiple owners when using the visit command")
public static boolean VISIT_MERGED_OWNERS = true;
}
@Comment("Redstone related settings")
public static final class Redstone {
@Comment("Disable redstone in unoccupied plots")
public static boolean DISABLE_UNOCCUPIED =
false;
@Comment("Disable redstone when all owners/trusted/members are offline")
public static boolean DISABLE_OFFLINE = false;
@Comment(
"Detect and cancel invalid pistons on the edge of plots (e.g. placed with WorldEdit)")
public static boolean DETECT_INVALID_EDGE_PISTONS = false;
}
@Comment("Claim related settings")
public static final class Claim {
@Comment("The max plots claimed in a single `/plot auto <size>` command")
public static int
MAX_AUTO_AREA = 4;
}
@Comment("Rating related settings")
public static final class Ratings {
@Comment("Replace the rating system with a like system. Will add /plot like/dislike,"
+ " and remove the rating command")
public static boolean USE_LIKES = false;
@Comment("Rating categories")
public static List<String> CATEGORIES = new ArrayList<>();
@Comment("The blocks to use for the rating GUI if categories are set above")
public static String BLOCK_0 = "brown_wool";
public static String BLOCK_1 = "red_wool";
public static String BLOCK_2 = "orange_wool";
public static String BLOCK_3 = "yellow_wool";
public static String BLOCK_4 = "lime_wool";
public static String BLOCK_5 = "cyan_wool";
public static String BLOCK_6 = "blue_wool";
public static String BLOCK_7 = "purple_wool";
public static String BLOCK_8 = "magenta_wool";
}
@Comment("Enable or disable all of or parts of the FastAsyncWorldEdit-PlotSquared hook")
public static final class FAWE_Components {
@Comment("Use FastAsyncWorldEdit for queue handling.")
public static boolean FAWE_HOOK = true;
public static boolean CUBOIDS = true;
public static boolean CLEAR = true;
public static boolean COPY_AND_SWAP = true;
public static boolean SET_BIOME = true;
}
@Comment("Enable or disable parts of the plugin specific to using Paper")
public static final class Paper_Components {
@Comment("Enable Paper's listeners.")
public static boolean PAPER_LISTENERS = true;
@Comment("Prevent entities from leaving plots")
public static boolean ENTITY_PATHING = true;
@Comment(
"Cancel entity spawns when the chunk is loaded if the PlotArea's mob spawning is off")
public static boolean CANCEL_CHUNK_SPAWN = true;
@Comment("Use paper's PlayerLaunchProjectileEvent to cancel projectiles")
public static boolean PLAYER_PROJECTILE = true;
@Comment("Cancel entity spawns from spawners before they happen (performance buff)")
public static boolean SPAWNER_SPAWN = true;
@Comment("Cancel entity spawns from tick spawn rates before they happen (performance buff)")
public static boolean CREATURE_SPAWN = true;
@Comment("Check the tile entity limit on block placement")
public static boolean TILE_ENTITY_CHECK = true;
@Comment("Use Paper's async tab completion")
public static boolean ASYNC_TAB_COMPLETION;
}
@Comment("Settings relating to PlotSquared's GlobalBlockQueue")
public static final class QUEUE {
@Comment({"Average time per tick spent completing chunk tasks in ms.",
"Queue will adjust the batch size to match this."})
public static int MAX_ITERATION_TIME = 30;
@Comment({"Initial number of chunks to process by the queue. This can be increased or",
"decreased by the queue based on the actual iteration time compared to above."})
public static int INITIAL_BATCH_SIZE = 5;
@Comment("Notify progress of the queue to the player or console.")
public static boolean NOTIFY_PROGRESS = true;
@Comment("Interval in ms to notify player or console of progress.")
public static int NOTIFY_INTERVAL = 5000;
@Comment({"Time to wait in ms before beginning to notify player or console of progress.",
"Prevent needless notification of progress for short queues."})
public static int NOTIFY_WAIT = 5000;
@Comment({"How lighting should be handled by the queue. Modes:",
" - 0 - Do not do any lighting (fastest)",
" - 1 - Only execute lighting where blocks with light values are placed",
" - 2 - Only execute lighting where blocks with light values are placed or removed/replaced",
" - 3 - Always execute lighting (slowest)"})
public static int LIGHTING_MODE = 1;
@Comment({"If blocks at the edges of queued operations should be set causing updates",
" - Slightly slower, but prevents issues such as fences left connected to nothing"})
public static boolean UPDATE_EDGES = true;
}
@Comment("Settings related to tab completion")
public static final class Tab_Completions {
@Comment({"The time in seconds how long tab completions should remain in cache.",
"0 will disable caching. Lower values may be less performant."})
public static int CACHE_EXPIRATION = 15;
}
@Comment("Settings related to plot titles")
public static final class Titles {
@Comment({"The big text that appears when you enter a plot.",
"For a single plot set `/plot flag set titles false` to disable it.", "For just you run `/plot toggle titles` to disable it.",
"For all plots: Add `titles: false` in the worlds.yml flags block to disable it."})
public static boolean DISPLAY_TITLES = true;
@Comment("Plot titles fading in (duration in ticks)")
public static int TITLES_FADE_IN = 10;
@Comment("Plot titles being shown (duration in ticks)")
public static int TITLES_STAY = 50;
@Comment("Plot titles fading out (duration in ticks)")
public static int TITLES_FADE_OUT = 20;
@Comment({"Changes the notification method on plot entry from Title + SubTitle -> ActionBar.",
"The message still sent to the player is pulled from the lang key \"titles.title_entered_plot\".",
"If you would like to still show the owner of the plot, append the contents of \"titles.title_entered_plot_sub\" onto the " +
"former lang key."})
public static boolean TITLES_AS_ACTIONBAR = false;
@Comment({"If the default title should be displayed on plots with server-plot flag set.",
"Titles will still be sent if the plot-title flag is set."})
public static boolean DISPLAY_DEFAULT_ON_SERVER_PLOT = false;
}
@Comment({"Enable or disable parts of the plugin",
"Note: A cache will use some memory if enabled"})
public static final class Enabled_Components { // Group the following values into a new config section
@Comment("The database stores all the plots")
public static boolean DATABASE = true;
@Comment("Events are needed to track a lot of things")
public static boolean EVENTS = true;
@Comment("Commands are used to interact with the plugin")
public static boolean COMMANDS =
true;
@Comment("Whether we should notify you about updates or not.")
public static boolean
UPDATE_NOTIFICATIONS = true;
@Comment("Stores user metadata in a database")
public static boolean PERSISTENT_META = true;
@Comment("Getting a rating won't need the database")
public static boolean RATING_CACHE =
true;
@Comment("Allow WorldEdit to be restricted to plots")
public static boolean
WORLDEDIT_RESTRICTIONS = true;
@Comment("Allow economy to be used to sell, claim or buy plots.")
public static boolean ECONOMY = false;
@Comment("Expiry will clear old or simplistic plots")
public static boolean PLOT_EXPIRY =
false;
@Comment("Processes chunks (trimming, or entity/tile limits) ")
public static boolean
CHUNK_PROCESSOR = false;
@Comment("Kill mobs on roads (Chicken, Cow, etc.)")
public static boolean KILL_ROAD_MOBS = false;
@Comment("Also kill any road mobs that are being ridden, or are leashed")
public static boolean
KILL_OWNED_ROAD_MOBS = false;
@Comment("Also kill any road mobs that are named")
public static boolean KILL_NAMED_ROAD_MOBS = false;
@Comment("Kill items on roads (Stick, Paper, etc.)")
public static boolean KILL_ROAD_ITEMS = false;
@Comment("Kill vehicles on roads (Boat, Minecart, etc.)")
public static boolean KILL_ROAD_VEHICLES = false;
@Comment("Notify a player of any missed plot comments upon plot entry")
public static boolean
COMMENT_NOTIFIER = true;
@Comment("Let players claim entire worlds with PlotSquared")
public static boolean WORLDS =
false;
@Comment("Actively purge invalid database entries")
public static boolean DATABASE_PURGER =
false;
@Comment({"Delete plots when a player is banned.",
"Note: This only works with the /minecraft:ban command. Any punishment plugin is not supported."})
public static boolean BAN_DELETER = false;
@Comment("Allows PlaceholderAPI placeholders to be used in captions, flags, etc.")
public static boolean EXTERNAL_PLACEHOLDERS = true;
@Comment("Make road regeneration persistent across restarts")
public static boolean
PERSISTENT_ROAD_REGEN = true;
@Comment({"Enable the `/plot component` preset GUI",
"Read more about components here: https://intellectualsites.gitbook.io/plotsquared/customization/plot-components"})
public static boolean COMPONENT_PRESETS = true;
@Comment("Enable per user locale")
public static boolean PER_USER_LOCALE = false;
@Comment({"The default locale. Before changing the language, make sure you downloaded the appropriate file and put it " +
"in the 'lang' folder.",
"You can find additional translations here: https://intellectualsites.crowdin.com/plotsquared"
})
public static String DEFAULT_LOCALE = "en";
@Comment("Use UUID cache to complete usernames")
public static boolean EXTENDED_USERNAME_COMPLETION = true;
@Comment("Command aliases that will be tab completed")
public static List<String> TAB_COMPLETED_ALIASES = Arrays.asList(
"plot",
"plots",
"p",
"plotsquared",
"plot2",
"p2",
"ps",
"2",
"plotme",
"plotz",
"ap"
);
@Comment("Whether PlotSquared should hook into MvDWPlaceholderAPI or not")
public static boolean USE_MVDWAPI = true;
@Comment("Whether PlotSquared should hook into MiniPlaceholders")
public static boolean USE_MINIPLACEHOLDERS = true;
@Comment("Prevent cross plot beacon effects")
public static boolean DISABLE_BEACON_EFFECT_OVERFLOW = true;
}
}