From 3dc73aa7d4c5de6cc26a9fe9417b033840063797 Mon Sep 17 00:00:00 2001 From: Ren Date: Thu, 2 Feb 2023 02:30:45 +0000 Subject: [PATCH] Make dynmap region rendering run asynchronously, closes #1628 (#1684) This PR improves the dynmap performance by: * Making updates run everything they can asynchronously * Waiting for 5 seconds before beginning rendering a faction, and cancelling the update and rescheduling if something that would update the dynmap for the faction happens during that time. If something happens while an update is running, all remaining tasks are cancelled and the render is scheduled to begin again 5 seconds later. Also included is a fix to autoclaim and a command to generate faction testing data (which is disabled by default but can be enabled with a config setting) --- .../factionsystem/MedievalFactions.kt | 2 +- .../factionsystem/claim/MfClaimService.kt | 4 +- .../command/faction/MfFactionCommand.kt | 6 + .../faction/dev/MfFactionDevCommand.kt | 41 + .../dev/MfFactionDevGenerateCommand.kt | 109 + .../factionsystem/dynmap/MfDynmapService.kt | 210 +- .../factionsystem/faction/MfFactionService.kt | 2 +- .../factionsystem/player/MfPlayerService.kt | 4 +- .../dansplugins/factionsystem/word/Words.kt | 1961 +++++++++++++++++ src/main/resources/config.yml | 4 +- 10 files changed, 2266 insertions(+), 77 deletions(-) create mode 100644 src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevCommand.kt create mode 100644 src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevGenerateCommand.kt create mode 100644 src/main/kotlin/com/dansplugins/factionsystem/word/Words.kt diff --git a/src/main/kotlin/com/dansplugins/factionsystem/MedievalFactions.kt b/src/main/kotlin/com/dansplugins/factionsystem/MedievalFactions.kt index 14224a1e..23db6d26 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/MedievalFactions.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/MedievalFactions.kt @@ -250,7 +250,7 @@ class MedievalFactions : JavaPlugin() { if (dynmapService != null) { factionService.factions.forEach { faction -> - dynmapService.updateClaims(faction) + dynmapService.scheduleUpdateClaims(faction) } } diff --git a/src/main/kotlin/com/dansplugins/factionsystem/claim/MfClaimService.kt b/src/main/kotlin/com/dansplugins/factionsystem/claim/MfClaimService.kt index 6b64133b..bc628a22 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/claim/MfClaimService.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/claim/MfClaimService.kt @@ -111,7 +111,7 @@ class MfClaimService(private val plugin: MedievalFactions, private val repositor plugin.server.scheduler.runTask( plugin, Runnable { - dynmapService.updateClaims(faction) + dynmapService.scheduleUpdateClaims(faction) } ) } @@ -156,7 +156,7 @@ class MfClaimService(private val plugin: MedievalFactions, private val repositor plugin.server.scheduler.runTask( plugin, Runnable { - dynmapService.updateClaims(faction) + dynmapService.scheduleUpdateClaims(faction) } ) } diff --git a/src/main/kotlin/com/dansplugins/factionsystem/command/faction/MfFactionCommand.kt b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/MfFactionCommand.kt index 3f6a965f..8d95ba37 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/command/faction/MfFactionCommand.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/MfFactionCommand.kt @@ -14,6 +14,7 @@ import com.dansplugins.factionsystem.command.faction.claim.MfFactionClaimFillCom import com.dansplugins.factionsystem.command.faction.create.MfFactionCreateCommand import com.dansplugins.factionsystem.command.faction.declareindependence.MfFactionDeclareIndependenceCommand import com.dansplugins.factionsystem.command.faction.declarewar.MfFactionDeclareWarCommand +import com.dansplugins.factionsystem.command.faction.dev.MfFactionDevCommand import com.dansplugins.factionsystem.command.faction.disband.MfFactionDisbandCommand import com.dansplugins.factionsystem.command.faction.flag.MfFactionFlagCommand import com.dansplugins.factionsystem.command.faction.grantindependence.MfFactionGrantIndependenceCommand @@ -89,6 +90,7 @@ class MfFactionCommand(private val plugin: MedievalFactions) : CommandExecutor, private val factionBonusPowerCommand = MfFactionBonusPowerCommand(plugin) private val factionRelationshipCommand = MfFactionRelationshipCommand(plugin) private val factionAddMemberCommand = MfFactionAddMemberCommand(plugin) + private val factionDevCommand = MfFactionDevCommand(plugin) // Backwards compatibility: private val factionClaimAutoCommand = MfFactionClaimAutoCommand(plugin) @@ -132,6 +134,7 @@ class MfFactionCommand(private val plugin: MedievalFactions) : CommandExecutor, private val bonusPowerAliases = listOf("bonuspower", plugin.language["CmdFactionBonusPower"]) private val relationshipAliases = listOf("relationship", plugin.language["CmdFactionRelationship"]) private val addMemberAliases = listOf("addmember", plugin.language["CmdFactionAddMember"]) + private val devAliases = if (plugin.config.getBoolean("dev.enableDevCommands")) listOf("dev") else emptyList() // Backwards compatibility: private val claimAutoAliases = listOf("autoclaim") @@ -175,6 +178,7 @@ class MfFactionCommand(private val plugin: MedievalFactions) : CommandExecutor, bonusPowerAliases + relationshipAliases + addMemberAliases + + devAliases + // Backwards compatibility aliases: claimAutoAliases + claimFillAliases + @@ -219,6 +223,7 @@ class MfFactionCommand(private val plugin: MedievalFactions) : CommandExecutor, in bonusPowerAliases -> factionBonusPowerCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) in relationshipAliases -> factionRelationshipCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) in addMemberAliases -> factionAddMemberCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) + in devAliases -> factionDevCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) // Backwards compatibility: in claimAutoAliases -> { sender.sendMessage("${RED}Command deprecated, use \"/mf claim auto\" instead") @@ -289,6 +294,7 @@ class MfFactionCommand(private val plugin: MedievalFactions) : CommandExecutor, in bonusPowerAliases -> factionBonusPowerCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) in relationshipAliases -> factionRelationshipCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) in addMemberAliases -> factionAddMemberCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) + in devAliases -> factionDevCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) // Backwards compatibility: in claimAutoAliases -> factionClaimAutoCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) in claimFillAliases -> factionClaimFillCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) diff --git a/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevCommand.kt b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevCommand.kt new file mode 100644 index 00000000..1a510cf4 --- /dev/null +++ b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevCommand.kt @@ -0,0 +1,41 @@ +package com.dansplugins.factionsystem.command.faction.dev + +import com.dansplugins.factionsystem.MedievalFactions +import org.bukkit.ChatColor.RED +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter + +class MfFactionDevCommand(private val plugin: MedievalFactions) : CommandExecutor, TabCompleter { + + private val factionDevGenerateCommand = MfFactionDevGenerateCommand(plugin) + + private val generateAliases = listOf("generate") + + private val subcommands = generateAliases + + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + return when (args.firstOrNull()?.lowercase()) { + in generateAliases -> factionDevGenerateCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) + else -> { + sender.sendMessage("${RED}Usage: /faction dev [generate]") + true + } + } + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + label: String, + args: Array + ) = when { + args.isEmpty() -> subcommands + args.size == 1 -> subcommands.filter { it.startsWith(args[0].lowercase()) } + else -> when (args.first().lowercase()) { + in generateAliases -> factionDevGenerateCommand.onTabComplete(sender, command, label, args.drop(1).toTypedArray()) + else -> emptyList() + } + } +} diff --git a/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevGenerateCommand.kt b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevGenerateCommand.kt new file mode 100644 index 00000000..ccc5e43f --- /dev/null +++ b/src/main/kotlin/com/dansplugins/factionsystem/command/faction/dev/MfFactionDevGenerateCommand.kt @@ -0,0 +1,109 @@ +package com.dansplugins.factionsystem.command.faction.dev + +import com.dansplugins.factionsystem.MedievalFactions +import com.dansplugins.factionsystem.claim.MfClaimedChunk +import com.dansplugins.factionsystem.faction.MfFaction +import com.dansplugins.factionsystem.faction.MfFactionId +import com.dansplugins.factionsystem.faction.role.MfFactionRoles +import com.dansplugins.factionsystem.faction.withRole +import com.dansplugins.factionsystem.player.MfPlayer +import com.dansplugins.factionsystem.word.adjectives +import com.dansplugins.factionsystem.word.nouns +import dev.forkhandles.result4k.onFailure +import org.bukkit.ChatColor.GREEN +import org.bukkit.ChatColor.RED +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import java.util.* +import java.util.logging.Level.SEVERE +import kotlin.random.Random + +class MfFactionDevGenerateCommand(private val plugin: MedievalFactions) : CommandExecutor, TabCompleter { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + val players = listOf( + UUID.fromString("0a9fa342-3139-49d7-8acb-fcf4d9c1f0ef"), + UUID.fromString("3fcad669-b828-4d6d-be88-1c28b067c5d8"), + UUID.fromString("128ba8e4-7ba9-44c2-9968-cab2897f758f"), + UUID.fromString("ef26130a-44c6-4c44-ab56-d35f11fb516e"), + UUID.fromString("9d44baf4-e390-4d2e-8ba4-d0ffa722e53f"), + UUID.fromString("3e45785c-2520-46ba-a34d-be448c7fdf82"), + UUID.fromString("b3637649-0ddb-46a0-9c1f-84bf9225ad91"), + UUID.fromString("3de2323f-8295-48cf-b46e-156c276b0246"), + UUID.fromString("880d5589-3bdf-425a-9f0e-a758ce766b5d"), + UUID.fromString("77ae6081-6495-420e-94e3-042918c11746"), + UUID.fromString("13039937-663c-43c6-9c85-42c552d96740"), + UUID.fromString("f2011fd5-d734-4d12-8748-e1a839c1c3a2"), + UUID.fromString("5469d055-0edd-4c2c-bb4e-64b1dc04295a"), + UUID.fromString("037fb8ce-8db6-4976-9af3-898ca547e4aa"), + UUID.fromString("030d9655-b403-441a-8766-adba39881452"), + UUID.fromString("1cb24001-21f3-411a-afe8-c4629c97436a"), + UUID.fromString("12f7e421-57bc-4897-a866-131b405bf676"), + UUID.fromString("be9ee451-7453-4887-9919-cf2db6c9862d"), + UUID.fromString("697b8978-a214-438e-b313-849a4bcdc743"), + UUID.fromString("7dab0167-4689-4bd6-9724-132b23e644fc"), + UUID.fromString("8c1ac1d3-be4d-45ec-8047-e008719a8296") + ).map { uuid -> plugin.server.getOfflinePlayer(uuid) } + val spawnLocation = plugin.server.worlds.first().spawnLocation + val worldId = spawnLocation.world!!.uid + val chunkX = spawnLocation.chunk.x + val chunkZ = spawnLocation.chunk.z + val playerService = plugin.services.playerService + val factionService = plugin.services.factionService + val claimService = plugin.services.claimService + plugin.server.scheduler.runTaskAsynchronously( + plugin, + Runnable { + players.forEach { bukkitPlayer -> + val mfPlayer = playerService.getPlayer(bukkitPlayer) + ?: playerService.save(MfPlayer(plugin, bukkitPlayer)).onFailure { + sender.sendMessage("${RED}Failed to save player while generating data") + plugin.logger.log(SEVERE, "Failed to save player: ${it.reason.message}", it.reason.cause) + return@forEach + } + val factionId = MfFactionId.generate() + val roles = MfFactionRoles.defaults(plugin, factionId) + val owner = roles.single { it.name == "Owner" } + val faction = MfFaction(plugin, id = factionId, name = "${adjectives.random()} ${adjectives.random()} ${nouns.random()}", roles = roles, members = listOf(mfPlayer.withRole(owner))) + val createdFaction = factionService.save(faction).onFailure { + sender.sendMessage("${RED}Failed to save faction while generating data") + plugin.logger.log(SEVERE, "Failed to save faction: ${it.reason.message}", it.reason.cause) + return@forEach + } + sender.sendMessage("${GREEN}Generated faction ${createdFaction.name}") + val startX = chunkX + Random.nextInt(1000) - 500 + val startZ = chunkZ + Random.nextInt(1000) - 500 + var x = startX + var z = startZ + for (j in 0..1500) { + val direction = Random.nextInt(4) + while (claimService.getClaim(worldId, x, z) != null) { + when (direction) { + 0 -> z-- + 1 -> x++ + 2 -> z++ + 3 -> x-- + } + } + claimService.save(MfClaimedChunk(worldId, x, z, createdFaction.id)).onFailure { + sender.sendMessage("${RED}Failed to save claimed chunk while generating data") + plugin.logger.log(SEVERE, "Failed to save claimed chunk: ${it.reason.message}", it.reason.cause) + return@forEach + } + } + sender.sendMessage("${GREEN}Claimed chunks for ${createdFaction.name}") + } + sender.sendMessage("${GREEN}Completed data generation.") + } + ) + return true + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + label: String, + args: Array + ) = emptyList() +} diff --git a/src/main/kotlin/com/dansplugins/factionsystem/dynmap/MfDynmapService.kt b/src/main/kotlin/com/dansplugins/factionsystem/dynmap/MfDynmapService.kt index dacc5ee3..956ebb2b 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/dynmap/MfDynmapService.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/dynmap/MfDynmapService.kt @@ -4,10 +4,13 @@ import com.dansplugins.factionsystem.MedievalFactions import com.dansplugins.factionsystem.claim.MfClaimedChunk import com.dansplugins.factionsystem.faction.MfFaction import com.dansplugins.factionsystem.faction.MfFactionId +import org.bukkit.scheduler.BukkitRunnable +import org.bukkit.scheduler.BukkitTask import org.dynmap.DynmapAPI import org.dynmap.markers.AreaMarker import java.text.DecimalFormat import java.text.DecimalFormatSymbols +import java.util.* import java.util.concurrent.ConcurrentHashMap import kotlin.math.floor import kotlin.math.roundToInt @@ -21,6 +24,32 @@ class MfDynmapService(private val plugin: MedievalFactions) { private val dynmap = plugin.server.pluginManager.getPlugin("dynmap") as DynmapAPI private val factionMarkersByFactionId = ConcurrentHashMap>() private val decimalFormat = DecimalFormat("0", DecimalFormatSymbols.getInstance(plugin.language.locale)) + private val updateTasks: MutableMap> = Collections.synchronizedMap(mutableMapOf>()) + + fun scheduleUpdateClaims(faction: MfFaction) { + val factionUpdateTasks = updateTasks[faction.id] + if (!factionUpdateTasks.isNullOrEmpty()) { + factionUpdateTasks.forEach(BukkitTask::cancel) + factionUpdateTasks.clear() + } + createUpdateTask(faction.id, { updateClaims(faction) }) { runTaskLater(plugin, 100L) } + } + + private fun createUpdateTask(factionId: MfFactionId, runnable: Runnable, schedule: BukkitRunnable.() -> BukkitTask) { + val updateTask = object : BukkitRunnable() { + override fun run() { + runnable.run() + val factionUpdateTasks = updateTasks[factionId] + factionUpdateTasks?.removeAll(plugin.server.scheduler.pendingTasks.filter { it.taskId == taskId }) + } + }.schedule() + val factionUpdateTasks = updateTasks[factionId] + if (factionUpdateTasks == null) { + updateTasks[factionId] = Collections.synchronizedList(mutableListOf(updateTask)) + } else { + factionUpdateTasks.add(updateTask) + } + } fun updateClaims(faction: MfFaction) { val markerApi = dynmap.markerAPI @@ -30,80 +59,121 @@ class MfDynmapService(private val plugin: MedievalFactions) { } val claimsMarkerSet = markerApi.getMarkerSet("claims") ?: markerApi.createMarkerSet("claims", "Claims", null, false) + val realmMarkerSet = markerApi.getMarkerSet("realms") + ?: markerApi.createMarkerSet("realms", "Realms", null, false) factionMarkersByFactionId[faction.id]?.forEach { marker -> marker.deleteMarker() } val claimService = plugin.services.claimService - val claims = claimService.getClaims(faction.id) - val factionInfo = buildFactionInfo(faction) - claims.groupBy { it.worldId }.forEach { (worldId, worldClaims) -> - val world = plugin.server.getWorld(worldId) - if (world != null) { - val paths = getPaths(worldClaims) - paths.forEachIndexed { index, path -> - val corners = getCorners(path) - val areaMarker = claimsMarkerSet.createAreaMarker( - "claim_border_${faction.id.value}_${worldId}_$index", - faction.name, - false, - world.name, - corners.map { (x, _) -> x * 16.0 }.toDoubleArray(), - corners.map { (_, z) -> z * 16.0 }.toDoubleArray(), - false - ) - val color = Integer.decode(faction.flags[plugin.flags.color]) - areaMarker.setFillStyle(0.0, color) - areaMarker.setLineStyle(1, 1.0, color) - areaMarker.description = factionInfo - val factionMarkers = factionMarkersByFactionId[faction.id] ?: listOf() - factionMarkersByFactionId[faction.id] = factionMarkers + areaMarker - } - worldClaims.forEachIndexed { index, claim -> - val areaMarker = claimsMarkerSet.createAreaMarker( - "claim_${faction.id.value}_${worldId}_$index", - faction.name, - false, - world.name, - doubleArrayOf(claim.x * 16.0, (claim.x + 1) * 16.0, (claim.x + 1) * 16.0, claim.x * 16.0), - doubleArrayOf(claim.z * 16.0, claim.z * 16.0, (claim.z + 1) * 16.0, (claim.z + 1) * 16.0), - false - ) - val color = Integer.decode(faction.flags[plugin.flags.color]) - areaMarker.setFillStyle(0.3, color) - areaMarker.setLineStyle(0, 0.0, color) - areaMarker.description = factionInfo - val factionMarkers = factionMarkersByFactionId[faction.id] ?: listOf() - factionMarkersByFactionId[faction.id] = factionMarkers + areaMarker - } + createUpdateTask(faction.id, { + val claims = claimService.getClaims(faction.id) + val factionInfo = buildFactionInfo(faction) + claims.groupBy { it.worldId }.forEach { (worldId, worldClaims) -> + createUpdateTask( + faction.id, + { + val world = plugin.server.getWorld(worldId) + if (world != null) { + createUpdateTask( + faction.id, + { + val paths = getPaths(worldClaims) + paths.forEachIndexed { index, path -> + val corners = getCorners(path) + createUpdateTask( + faction.id, + { + val areaMarker = claimsMarkerSet.createAreaMarker( + "claim_border_${faction.id.value}_${worldId}_$index", + faction.name, + false, + world.name, + corners.map { (x, _) -> x * 16.0 }.toDoubleArray(), + corners.map { (_, z) -> z * 16.0 }.toDoubleArray(), + false + ) + if (areaMarker != null) { + val color = Integer.decode(faction.flags[plugin.flags.color]) + areaMarker.setFillStyle(0.0, color) + areaMarker.setLineStyle(1, 1.0, color) + areaMarker.description = factionInfo + val factionMarkers = + factionMarkersByFactionId[faction.id] ?: listOf() + factionMarkersByFactionId[faction.id] = + factionMarkers + areaMarker + } + } + ) { runTask(plugin) } + } + worldClaims.forEachIndexed { index, claim -> + plugin.server.scheduler.runTask( + plugin, + Runnable { + val areaMarker = claimsMarkerSet.createAreaMarker( + "claim_${faction.id.value}_${worldId}_$index", + faction.name, + false, + world.name, + doubleArrayOf(claim.x * 16.0, (claim.x + 1) * 16.0, (claim.x + 1) * 16.0, claim.x * 16.0), + doubleArrayOf(claim.z * 16.0, claim.z * 16.0, (claim.z + 1) * 16.0, (claim.z + 1) * 16.0), + false + ) + val color = Integer.decode(faction.flags[plugin.flags.color]) + areaMarker.setFillStyle(0.3, color) + areaMarker.setLineStyle(0, 0.0, color) + areaMarker.description = factionInfo + val factionMarkers = factionMarkersByFactionId[faction.id] ?: listOf() + factionMarkersByFactionId[faction.id] = factionMarkers + areaMarker + } + ) + } + } + ) { runTaskAsynchronously(plugin) } + } + } + ) { runTask(plugin) } } - } - val realmMarkerSet = markerApi.getMarkerSet("realms") - ?: markerApi.createMarkerSet("realms", "Realms", null, false) - val relationshipService = plugin.services.factionRelationshipService - val realm = claims + relationshipService.getVassalTree(faction.id).flatMap(claimService::getClaims) - realm.groupBy { it.worldId }.forEach { (worldId, worldClaims) -> - val world = plugin.server.getWorld(worldId) - if (world != null) { - val paths = getPaths(worldClaims) - paths.forEachIndexed { index, path -> - val corners = getCorners(path) - val areaMarker = realmMarkerSet.createAreaMarker( - "realm_${faction.id.value}_${worldId}_$index", - faction.name, - false, - world.name, - corners.map { (x, _) -> x * 16.0 }.toDoubleArray(), - corners.map { (_, z) -> z * 16.0 }.toDoubleArray(), - false - ) - areaMarker.label = faction.name - val color = Integer.decode(faction.flags[plugin.flags.color]) - areaMarker.setFillStyle(0.0, color) - areaMarker.setLineStyle(4, 1.0, color) - areaMarker.description = factionInfo - val factionMarkers = factionMarkersByFactionId[faction.id] ?: listOf() - factionMarkersByFactionId[faction.id] = factionMarkers + areaMarker - } + val relationshipService = plugin.services.factionRelationshipService + val realm = claims + relationshipService.getVassalTree(faction.id).flatMap(claimService::getClaims) + realm.groupBy { it.worldId }.forEach { (worldId, worldClaims) -> + createUpdateTask( + faction.id, + { + val world = plugin.server.getWorld(worldId) + if (world != null) { + createUpdateTask( + faction.id, + { + val paths = getPaths(worldClaims) + paths.forEachIndexed { index, path -> + val corners = getCorners(path) + createUpdateTask( + faction.id, + { + val areaMarker = realmMarkerSet.createAreaMarker( + "realm_${faction.id.value}_${worldId}_$index", + faction.name, + false, + world.name, + corners.map { (x, _) -> x * 16.0 }.toDoubleArray(), + corners.map { (_, z) -> z * 16.0 }.toDoubleArray(), + false + ) + areaMarker.label = faction.name + val color = Integer.decode(faction.flags[plugin.flags.color]) + areaMarker.setFillStyle(0.0, color) + areaMarker.setLineStyle(4, 1.0, color) + areaMarker.description = factionInfo + val factionMarkers = factionMarkersByFactionId[faction.id] ?: listOf() + factionMarkersByFactionId[faction.id] = factionMarkers + areaMarker + } + ) { runTask(plugin) } + } + } + ) { runTaskAsynchronously(plugin) } + } + } + ) { runTask(plugin) } } - } + }) { runTaskAsynchronously(plugin) } } private fun getCorners(points: List): List { diff --git a/src/main/kotlin/com/dansplugins/factionsystem/faction/MfFactionService.kt b/src/main/kotlin/com/dansplugins/factionsystem/faction/MfFactionService.kt index 22dc4549..9d5b912f 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/faction/MfFactionService.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/faction/MfFactionService.kt @@ -127,7 +127,7 @@ class MfFactionService(private val plugin: MedievalFactions, private val reposit plugin.server.scheduler.runTask( plugin, Runnable { - dynmapService.updateClaims(result) + dynmapService.scheduleUpdateClaims(result) } ) } diff --git a/src/main/kotlin/com/dansplugins/factionsystem/player/MfPlayerService.kt b/src/main/kotlin/com/dansplugins/factionsystem/player/MfPlayerService.kt index fb2869f1..ef1ac707 100644 --- a/src/main/kotlin/com/dansplugins/factionsystem/player/MfPlayerService.kt +++ b/src/main/kotlin/com/dansplugins/factionsystem/player/MfPlayerService.kt @@ -57,7 +57,7 @@ class MfPlayerService(private val plugin: MedievalFactions, private val playerRe plugin.server.scheduler.runTask( plugin, Runnable { - dynmapService.updateClaims(faction) + dynmapService.scheduleUpdateClaims(faction) } ) } @@ -80,7 +80,7 @@ class MfPlayerService(private val plugin: MedievalFactions, private val playerRe plugin.server.scheduler.runTask( plugin, Runnable { - dynmapService.updateClaims(faction) + dynmapService.scheduleUpdateClaims(faction) } ) } diff --git a/src/main/kotlin/com/dansplugins/factionsystem/word/Words.kt b/src/main/kotlin/com/dansplugins/factionsystem/word/Words.kt new file mode 100644 index 00000000..e2da7e0e --- /dev/null +++ b/src/main/kotlin/com/dansplugins/factionsystem/word/Words.kt @@ -0,0 +1,1961 @@ +package com.dansplugins.factionsystem.word + +val adjectives = listOf( + "Aristotelian", + "Arthurian", + "Bohemian", + "Brethren", + "Mosaic", + "Oceanic", + "Proctor", + "Terran", + "Tudor", + "abroad", + "absorbing", + "abstract", + "academic", + "accelerated", + "accented", + "accountant", + "acquainted", + "acute", + "addicting", + "addictive", + "adjustable", + "admired", + "adult", + "adverse", + "advised", + "aerosol", + "afraid", + "aggravated", + "aggressive", + "agreeable", + "alienate", + "aligned", + "all-round", + "alleged", + "almond", + "alright", + "altruistic", + "ambient", + "ambivalent", + "amiable", + "amino", + "amorphous", + "amused", + "anatomical", + "ancestral", + "angelic", + "angrier", + "answerable", + "antiquarian", + "antiretroviral", + "appellate", + "applicable", + "apportioned", + "approachable", + "appropriated", + "archer", + "aroused", + "arrested", + "assertive", + "assigned", + "athletic", + "atrocious", + "attained", + "authoritarian", + "autobiographical", + "avaricious", + "avocado", + "awake", + "awesome", + "backstage", + "backwoods", + "balding", + "bandaged", + "banded", + "banned", + "barreled", + "battle", + "beaten", + "begotten", + "beguiled", + "bellied", + "belted", + "beneficent", + "besieged", + "betting", + "big-money", + "biggest", + "biochemical", + "bipolar", + "blackened", + "blame", + "blessed", + "blindfolded", + "bloat", + "blocked", + "blooded", + "blue-collar", + "blushing", + "boastful", + "bolder", + "bolstered", + "bonnie", + "bored", + "boundary", + "bounded", + "bounding", + "branched", + "brawling", + "brazen", + "breeding", + "bridged", + "brimming", + "brimstone", + "broadest", + "broiled", + "broker", + "bronze", + "bruising", + "buffy", + "bullied", + "bungling", + "burial", + "buttery", + "candied", + "canonical", + "cantankerous", + "cardinal", + "carefree", + "caretaker", + "casual", + "cathartic", + "causal", + "chapel", + "characterized", + "charcoal", + "cheeky", + "cherished", + "chipotle", + "chirping", + "chivalrous", + "circumstantial", + "civic", + "civil", + "civilised", + "clanking", + "clapping", + "claptrap", + "classless", + "cleansed", + "cleric", + "cloistered", + "codified", + "colloquial", + "colour", + "combat", + "combined", + "comely", + "commissioned", + "commonplace", + "commuter", + "commuting", + "comparable", + "complementary", + "compromising", + "conceding", + "concentrated", + "conceptual", + "conditioned", + "confederate", + "confident", + "confidential", + "confining", + "confuse", + "congressional", + "consequential", + "conservative", + "constituent", + "contaminated", + "contemporaneous", + "contraceptive", + "convertible", + "convex", + "cooked", + "coronary", + "corporatist", + "correlated", + "corroborated", + "cosmic", + "cover", + "crash", + "crypto", + "culminate", + "cushioned", + "dandy", + "dashing", + "dazzled", + "decreased", + "decrepit", + "dedicated", + "defaced", + "defective", + "defenseless", + "deluded", + "deodorant", + "departed", + "depress", + "designing", + "despairing", + "destitute", + "detective", + "determined", + "devastating", + "deviant", + "devilish", + "devoted", + "diagonal", + "dictated", + "didactic", + "differentiated", + "diffused", + "dirtier", + "disabling", + "disconnected", + "discovered", + "disdainful", + "diseased", + "disfigured", + "disheartened", + "disheveled", + "disillusioned", + "disparate", + "dissident", + "doable", + "doctrinal", + "doing", + "dotted", + "double-blind", + "downbeat", + "dozen", + "draining", + "draught", + "dread", + "dried", + "dropped", + "dulled", + "duplicate", + "eaten", + "echoing", + "economical", + "elaborated", + "elastic", + "elective", + "electoral", + "elven", + "embryo", + "emerald", + "emergency", + "emissary", + "emotional", + "employed", + "enamel", + "encased", + "encrusted", + "endangered", + "engraved", + "engrossing", + "enlarged", + "enlisted", + "enlivened", + "ensconced", + "entangled", + "enthralling", + "entire", + "envious", + "eradicated", + "eroded", + "esoteric", + "essential", + "evaporated", + "ever-present", + "evergreen", + "everlasting", + "exacting", + "exasperated", + "excess", + "exciting", + "executable", + "existent", + "exonerated", + "exorbitant", + "exponential", + "export", + "extraordinary", + "exultant", + "exulting", + "facsimile", + "fading", + "fainter", + "faith-based", + "fallacious", + "faltering", + "famous", + "fancier", + "fast-growing", + "fated", + "favourable", + "fearless", + "feathered", + "fellow", + "fermented", + "ferocious", + "fiddling", + "filling", + "firmer", + "fitted", + "flammable", + "flawed", + "fledgling", + "fleshy", + "flexible", + "flickering", + "floral", + "flowering", + "flowing", + "foggy", + "folic", + "foolhardy", + "foolish", + "footy", + "forehand", + "forked", + "formative", + "formulaic", + "foul-mouthed", + "fractional", + "fragrant", + "fraudulent", + "freakish", + "freckled", + "freelance", + "freight", + "fresh", + "fretted", + "frugal", + "fulfilling", + "fuming", + "funded", + "funny", + "garbled", + "gathered", + "geologic", + "geometric", + "gibberish", + "gilded", + "ginger", + "glare", + "glaring", + "gleaming", + "glorified", + "glorious", + "goalless", + "gold-plated", + "goody", + "grammatical", + "grande", + "grateful", + "gratuitous", + "graven", + "greener", + "grinding", + "grizzly", + "groaning", + "grudging", + "guaranteed", + "gusty", + "half-breed", + "hand-held", + "handheld", + "hands-off", + "hard-pressed", + "harlot", + "healing", + "healthier", + "healthiest", + "heart", + "heart-shaped", + "heathen", + "hedonistic", + "heralded", + "herbal", + "high-density", + "high-performance", + "high-res", + "high-yield", + "hissy", + "hitless", + "holiness", + "homesick", + "honorable", + "hooded", + "hopeless", + "horrendous", + "horrible", + "hot-button", + "huddled", + "human", + "humbling", + "humid", + "humiliating", + "hypnotized", + "idealistic", + "idiosyncratic", + "ignited", + "illustrated", + "illustrative", + "imitated", + "immense", + "immersive", + "immigrant", + "immoral", + "impassive", + "impressionable", + "improbable", + "impulsive", + "in-between", + "in-flight", + "inattentive", + "inbound", + "inbounds", + "incalculable", + "incomprehensible", + "indefatigable", + "indigo", + "indiscriminate", + "indomitable", + "inert", + "inflate", + "inform", + "inheriting", + "injured", + "injurious", + "inking", + "inoffensive", + "insane", + "insensible", + "insidious", + "insincere", + "insistent", + "insolent", + "insufferable", + "intemperate", + "interdependent", + "interesting", + "interfering", + "intern", + "interpreted", + "intersecting", + "intolerable", + "intolerant", + "intuitive", + "irresolute", + "irritate", + "jealous", + "jerking", + "joining", + "joint", + "journalistic", + "joyful", + "keyed", + "knowing", + "lacklustre", + "laden", + "lagging", + "lamented", + "laughable", + "layered", + "leather", + "leathern", + "leery", + "left-footed", + "legible", + "leisure", + "lessening", + "liberating", + "life-size", + "lifted", + "lightest", + "limitless", + "listening", + "literary", + "liver", + "livid", + "lobster", + "locked", + "long-held", + "long-lasting", + "long-running", + "long-suffering", + "loudest", + "loveliest", + "low-budget", + "low-carb", + "lowering", + "lucid", + "luckless", + "lusty", + "luxurious", + "magazine", + "maniac", + "manmade", + "maroon", + "mastered", + "mated", + "material", + "materialistic", + "meaningful", + "measuring", + "mediaeval", + "medical", + "meditated", + "medley", + "melodic", + "memorable", + "memorial", + "metabolic", + "metallic", + "metallurgical", + "metering", + "midair", + "midterm", + "midway", + "mighty", + "migrating", + "mind-blowing", + "mind-boggling", + "minor", + "mirrored", + "misguided", + "misshapen", + "mitigated", + "mixed", + "modernized", + "molecular", + "monarch", + "monastic", + "morbid", + "motley", + "motorized", + "mounted", + "multi-million", + "multidisciplinary", + "muscled", + "muscular", + "muted", + "mysterious", + "mythic", + "nail-biting", + "natural", + "nauseous", + "negative", + "networked", + "neurological", + "neutered", + "newest", + "night", + "nitrous", + "no-fly", + "noncommercial", + "nonsense", + "north", + "nuanced", + "occurring", + "offensive", + "oldest", + "oncoming", + "one-eyed", + "one-year", + "onstage", + "onward", + "opaque", + "open-ended", + "operating", + "opportunist", + "opposing", + "opt-in", + "ordinate", + "outdone", + "outlaw", + "outsized", + "overboard", + "overheated", + "oversize", + "overworked", + "oyster", + "paced", + "panting", + "paralyzed", + "paramount", + "parental", + "parted", + "partisan", + "passive", + "pastel", + "patriot", + "peacekeeping", + "pedestrian", + "peevish", + "penal", + "penned", + "pensive", + "perceptual", + "perky", + "permissible", + "pernicious", + "perpetuate", + "perplexed", + "pervasive", + "petrochemical", + "philosophical", + "picturesque", + "pillaged", + "piped", + "piquant", + "pitching", + "plausible", + "pliable", + "plumb", + "politician", + "polygamous", + "poorest", + "portmanteau", + "posed", + "positive", + "possible", + "postpartum", + "prank", + "pre-emptive", + "precocious", + "predicted", + "premium", + "preparatory", + "prerequisite", + "prescient", + "preserved", + "presidential", + "pressed", + "pressurized", + "presumed", + "prewar", + "priced", + "pricier", + "primal", + "primer", + "primetime", + "printed", + "private", + "problem", + "procedural", + "process", + "prodigious", + "professional", + "programmed", + "progressive", + "prolific", + "promising", + "promulgated", + "pronged", + "proportionate", + "protracted", + "pulled", + "pulsed", + "purgatory", + "quick", + "rapid-fire", + "raunchy", + "razed", + "reactive", + "readable", + "realizing", + "recognised", + "recovering", + "recurrent", + "recycled", + "redeemable", + "reflecting", + "regal", + "registering", + "reliable", + "reminiscent", + "remorseless", + "removable", + "renewable", + "repeating", + "repellent", + "reserve", + "resigned", + "respectful", + "rested", + "restrict", + "resultant", + "retaliatory", + "retiring", + "revelatory", + "reverend", + "reversing", + "revolving", + "ridiculous", + "right-hand", + "ringed", + "risque", + "robust", + "roomful", + "rotating", + "roused", + "rubber", + "run-down", + "running", + "runtime", + "rustling", + "safest", + "salient", + "sanctioned", + "saute", + "saved", + "scandalized", + "scarlet", + "scattering", + "sceptical", + "scheming", + "scoundrel", + "scratched", + "scratchy", + "scrolled", + "seated", + "second-best", + "segregated", + "self-taught", + "semiautomatic", + "senior", + "sensed", + "sentient", + "sexier", + "shadowy", + "shaken", + "shaker", + "shameless", + "shaped", + "shiny", + "shipped", + "shivering", + "shoestring", + "short", + "short-lived", + "signed", + "simplest", + "simplistic", + "sizable", + "skeleton", + "skinny", + "skirting", + "skyrocketed", + "slamming", + "slanting", + "slapstick", + "sleek", + "sleepless", + "sleepy", + "slender", + "slimmer", + "smacking", + "smokeless", + "smothered", + "smouldering", + "snuff", + "socialized", + "solid-state", + "sometime", + "sought", + "spanking", + "sparing", + "spattered", + "specialized", + "specific", + "speedy", + "spherical", + "spiky", + "spineless", + "sprung", + "squint", + "stainless", + "standing", + "starlight", + "startled", + "stately", + "statewide", + "stereoscopic", + "sticky", + "stimulant", + "stinky", + "stoked", + "stolen", + "storied", + "strained", + "strapping", + "strengthened", + "stubborn", + "stylized", + "suave", + "subjective", + "subjugated", + "subordinate", + "succeeding", + "suffering", + "summary", + "sunset", + "sunshine", + "supernatural", + "supervisory", + "supply-side", + "surrogate", + "suspended", + "suspenseful", + "swarthy", + "sweating", + "sweeping", + "swinging", + "swooning", + "sympathize", + "synchronized", + "synonymous", + "synthetic", + "tailed", + "tallest", + "tangible", + "tanked", + "tarry", + "technical", + "tectonic", + "telepathic", + "tenderest", + "territorial", + "testimonial", + "theistic", + "thicker", + "threatening", + "tight-lipped", + "timed", + "timely", + "timid", + "torrent", + "totalled", + "tougher", + "traditional", + "transformed", + "trapped", + "traveled", + "traverse", + "treated", + "trial", + "trunk", + "trusting", + "trying", + "twisted", + "two-lane", + "tyrannical", + "unaided", + "unassisted", + "unassuming", + "unattractive", + "uncapped", + "uncomfortable", + "uncontrolled", + "uncooked", + "uncooperative", + "underground", + "undersea", + "undisturbed", + "unearthly", + "uneasy", + "unequal", + "unfazed", + "unfinished", + "unforeseen", + "unforgivable", + "unidentified", + "unimaginative", + "uninspired", + "unintended", + "uninvited", + "universal", + "unmasked", + "unorthodox", + "unparalleled", + "unpleasant", + "unprincipled", + "unread", + "unreasonable", + "unregulated", + "unreliable", + "unremitting", + "unsafe", + "unsanitary", + "unsealed", + "unsuccessful", + "unsupervised", + "untimely", + "unwary", + "unwrapped", + "uppity", + "upstart", + "useless", + "utter", + "valiant", + "valid", + "valued", + "vanilla", + "vaulting", + "vaunted", + "veering", + "vegetative", + "vented", + "verbal", + "verifying", + "veritable", + "versed", + "vinyl", + "virgin", + "visceral", + "visual", + "voluptuous", + "walk-on", + "wanton", + "warlike", + "washed", + "waterproof", + "waved", + "weakest", + "well-bred", + "well-chosen", + "well-informed", + "wetting", + "wheeled", + "whirlwind", + "widen", + "widening", + "willful", + "willing", + "winnable", + "winningest", + "wireless", + "wistful", + "woeful", + "wooded", + "woodland", + "wordless", + "workable", + "worldly", + "worldwide", + "worst-case", + "worsted", + "worthless" +) + +val nouns = listOf( + "Armour", + "Barrymore", + "Cabot", + "Catholicism", + "Chihuahua", + "Christianity", + "Easter", + "Frenchman", + "Lowry", + "Mayer", + "Orientalism", + "Pharaoh", + "Pueblo", + "Pullman", + "Rodeo", + "Saturday", + "Sister", + "Snead", + "Syrah", + "Tuesday", + "Woodward", + "abbey", + "absence", + "absorption", + "abstinence", + "absurdity", + "abundance", + "acceptance", + "accessibility", + "accommodation", + "accomplice", + "accountability", + "accounting", + "accreditation", + "accuracy", + "acquiescence", + "acreage", + "actress", + "actuality", + "adage", + "adaptation", + "adherence", + "adjustment", + "adoption", + "adultery", + "advancement", + "advert", + "advertisement", + "advertising", + "advice", + "aesthetics", + "affinity", + "aggression", + "agriculture", + "aircraft", + "airtime", + "allegation", + "allegiance", + "allegory", + "allergy", + "allies", + "alligator", + "allocation", + "allotment", + "altercation", + "ambulance", + "ammonia", + "anatomy", + "anemia", + "ankle", + "announcement", + "annoyance", + "annuity", + "anomaly", + "anthropology", + "anxiety", + "apartheid", + "apologise", + "apostle", + "apparatus", + "appeasement", + "appellation", + "appendix", + "applause", + "appointment", + "appraisal", + "archery", + "archipelago", + "architecture", + "ardor", + "arrears", + "arrow", + "artisan", + "artistry", + "ascent", + "assembly", + "assignment", + "association", + "asthma", + "atheism", + "attacker", + "attraction", + "attractiveness", + "auspices", + "authority", + "avarice", + "aversion", + "aviation", + "babbling", + "backlash", + "baker", + "ballet", + "balls", + "banjo", + "baron", + "barrier", + "barrister", + "bases", + "basin", + "basis", + "battery", + "battling", + "bedtime", + "beginner", + "begun", + "bending", + "bicycle", + "billing", + "bingo", + "biography", + "biology", + "birthplace", + "blackberry", + "blather", + "blossom", + "boardroom", + "boasting", + "bodyguard", + "boldness", + "bomber", + "bondage", + "bonding", + "bones", + "bonus", + "bookmark", + "boomer", + "booty", + "bounds", + "bowling", + "brainstorming", + "breadth", + "breaker", + "brewer", + "brightness", + "broccoli", + "broth", + "brotherhood", + "browsing", + "brunch", + "brunt", + "building", + "bullion", + "bureaucracy", + "burglary", + "buyout", + "by-election", + "cabal", + "cabbage", + "calamity", + "campaign", + "canonization", + "captaincy", + "carcass", + "carrier", + "cartridge", + "cassette", + "catfish", + "caught", + "celebrity", + "cemetery", + "certainty", + "certification", + "charade", + "chasm", + "check-in", + "cheerleader", + "cheesecake", + "chemotherapy", + "chili", + "china", + "chivalry", + "cholera", + "cilantro", + "circus", + "civilisation", + "civility", + "clearance", + "clearing", + "clerk", + "climber", + "closeness", + "clothing", + "clutches", + "coaster", + "coconut", + "coding", + "collaborator", + "colleague", + "college", + "collision", + "colors", + "combustion", + "comedian", + "comer", + "commander", + "commemoration", + "commenter", + "commissioner", + "commune", + "competition", + "completeness", + "complexity", + "computing", + "comrade", + "concur", + "condominium", + "conduit", + "confidant", + "configuration", + "confiscation", + "conflagration", + "conflict", + "consist", + "consistency", + "consolidation", + "conspiracy", + "constable", + "consul", + "consultancy", + "contentment", + "contents", + "contractor", + "conversation", + "cornerstone", + "corpus", + "correlation", + "councilman", + "counselor", + "countdown", + "countryman", + "coverage", + "covering", + "coyote", + "cracker", + "creator", + "criminality", + "crocodile", + "cropping", + "cross-examination", + "crossover", + "crossroads", + "culprit", + "cumin", + "curator", + "curfew", + "cursor", + "custard", + "cutter", + "cyclist", + "cyclone", + "cylinder", + "cynicism", + "daddy", + "damsel", + "darkness", + "dawning", + "daybreak", + "dealing", + "dedication", + "deduction", + "defection", + "deference", + "deficiency", + "definition", + "deflation", + "degeneration", + "delegation", + "delicacy", + "delirium", + "deliverance", + "demeanor", + "demon", + "demonstration", + "denomination", + "dentist", + "departure", + "depletion", + "depression", + "designation", + "despotism", + "detention", + "developer", + "devolution", + "dexterity", + "diagnosis", + "dialect", + "differentiation", + "digger", + "digress", + "dioxide", + "diploma", + "disability", + "disarmament", + "discord", + "discovery", + "dishonesty", + "dismissal", + "disobedience", + "dispatcher", + "disservice", + "distribution", + "distributor", + "diver", + "diversity", + "docking", + "dollar", + "dominance", + "domination", + "dominion", + "donkey", + "doorstep", + "doorway", + "dossier", + "downside", + "drafting", + "drank", + "drilling", + "driver", + "drumming", + "drunkenness", + "duchess", + "ducking", + "dugout", + "dumps", + "dwelling", + "dynamics", + "eagerness", + "earnestness", + "earnings", + "eater", + "editor", + "effectiveness", + "electricity", + "elements", + "eloquence", + "emancipation", + "embodiment", + "embroidery", + "emperor", + "employment", + "encampment", + "enclosure", + "encouragement", + "endangerment", + "enlightenment", + "enthusiasm", + "environment", + "environs", + "envoy", + "epilepsy", + "equation", + "equator", + "error", + "espionage", + "estimation", + "evacuation", + "exaggeration", + "examination", + "exclamation", + "expediency", + "exploitation", + "extinction", + "eyewitness", + "falls", + "fascism", + "fastball", + "feces", + "feedback", + "ferocity", + "fertilization", + "fetish", + "finale", + "firing", + "fixing", + "flashing", + "flask", + "flora", + "fluke", + "folklore", + "follower", + "foothold", + "footing", + "forefinger", + "forefront", + "forgiveness", + "formality", + "formation", + "formula", + "foyer", + "fragmentation", + "framework", + "fraud", + "freestyle", + "frequency", + "friendliness", + "fries", + "frigate", + "fulfillment", + "function", + "functionality", + "fundraiser", + "fusion", + "futility", + "gallantry", + "gallery", + "genesis", + "genitals", + "girlfriend", + "glamour", + "glitter", + "glucose", + "google", + "grandeur", + "grappling", + "greens", + "gridlock", + "grocer", + "groundwork", + "grouping", + "gunman", + "gusto", + "habitation", + "hacker", + "hallway", + "hamburger", + "hammock", + "handling", + "hands", + "handshake", + "happiness", + "hardship", + "headcount", + "header", + "headquarters", + "heads", + "headset", + "hearth", + "hearts", + "heath", + "hegemony", + "height", + "hello", + "helper", + "helping", + "helplessness", + "hierarchy", + "hoarding", + "hockey", + "homeland", + "homer", + "honesty", + "horror", + "horseman", + "hostility", + "housing", + "humility", + "hurricane", + "iceberg", + "ignition", + "illness", + "illustration", + "illustrator", + "immunity", + "immunization", + "imperialism", + "imprisonment", + "inaccuracy", + "inaction", + "inactivity", + "inauguration", + "indecency", + "indicator", + "inevitability", + "infamy", + "infiltration", + "influx", + "iniquity", + "innocence", + "innovation", + "insanity", + "inspiration", + "instruction", + "instructor", + "insurer", + "interact", + "intercession", + "intercourse", + "intermission", + "interpretation", + "intersection", + "interval", + "intolerance", + "intruder", + "invasion", + "investment", + "involvement", + "irrigation", + "iteration", + "jenny", + "jogging", + "jones", + "joseph", + "juggernaut", + "juncture", + "jurisprudence", + "juror", + "kangaroo", + "kingdom", + "knocking", + "laborer", + "larceny", + "laurels", + "layout", + "leadership", + "leasing", + "legislation", + "leopard", + "liberation", + "licence", + "lifeblood", + "lifeline", + "ligament", + "lighting", + "likeness", + "line-up", + "lineage", + "liner", + "lineup", + "liquidation", + "listener", + "literature", + "litigation", + "litre", + "loathing", + "locality", + "lodging", + "logic", + "longevity", + "lookout", + "lordship", + "lustre", + "ma'am", + "machinery", + "madness", + "magnificence", + "mahogany", + "mailing", + "mainframe", + "maintenance", + "majority", + "manga", + "mango", + "manifesto", + "mantra", + "manufacturer", + "maple", + "martin", + "martyrdom", + "mathematician", + "matrix", + "matron", + "mayhem", + "mayor", + "means", + "meantime", + "measurement", + "mechanics", + "mediator", + "medics", + "melodrama", + "memory", + "mentality", + "metaphysics", + "method", + "metre", + "miner", + "mirth", + "misconception", + "misery", + "mishap", + "misunderstanding", + "mobility", + "molasses", + "momentum", + "monarchy", + "monument", + "morale", + "mortality", + "motto", + "mouthful", + "mouthpiece", + "mover", + "movie", + "mowing", + "murderer", + "musician", + "mutation", + "mythology", + "narration", + "narrator", + "nationality", + "negligence", + "neighborhood", + "neighbour", + "nervousness", + "networking", + "nexus", + "nightmare", + "nobility", + "nobody", + "noodle", + "normalcy", + "notification", + "nourishment", + "novella", + "nucleus", + "nuisance", + "nursery", + "nutrition", + "nylon", + "oasis", + "obscenity", + "obscurity", + "observer", + "offense", + "onslaught", + "operation", + "opportunity", + "opposition", + "oracle", + "orchestra", + "organisation", + "organizer", + "orientation", + "originality", + "ounce", + "outage", + "outcome", + "outdoors", + "outfield", + "outing", + "outpost", + "outset", + "overseer", + "owner", + "oxygen", + "pairing", + "panther", + "paradox", + "parliament", + "parsley", + "parson", + "passenger", + "pasta", + "patchwork", + "pathos", + "patriotism", + "pendulum", + "penguin", + "permission", + "persona", + "perusal", + "pessimism", + "peter", + "philosopher", + "phosphorus", + "phrasing", + "physique", + "piles", + "plateau", + "playing", + "plaza", + "plethora", + "plurality", + "pneumonia", + "pointer", + "poker", + "policeman", + "polling", + "poster", + "posterity", + "posting", + "postponement", + "potassium", + "pottery", + "poultry", + "pounding", + "pragmatism", + "precedence", + "precinct", + "preoccupation", + "pretense", + "priesthood", + "prisoner", + "privacy", + "probation", + "proceeding", + "proceedings", + "processing", + "processor", + "progression", + "projection", + "prominence", + "propensity", + "prophecy", + "prorogation", + "prospectus", + "protein", + "prototype", + "providence", + "provider", + "provocation", + "proximity", + "puberty", + "publicist", + "publicity", + "publisher", + "pundit", + "putting", + "quantity", + "quart", + "quilting", + "quorum", + "racism", + "radiance", + "ralph", + "rancher", + "ranger", + "rapidity", + "rapport", + "ratification", + "rationality", + "reaction", + "reader", + "reassurance", + "rebirth", + "receptor", + "recipe", + "recognition", + "recourse", + "recreation", + "rector", + "recurrence", + "redemption", + "redistribution", + "redundancy", + "refinery", + "reformer", + "refrigerator", + "regularity", + "regulator", + "reinforcement", + "reins", + "reinstatement", + "relativism", + "relaxation", + "rendition", + "repayment", + "repentance", + "repertoire", + "repository", + "republic", + "reputation", + "resentment", + "residency", + "resignation", + "restaurant", + "resurgence", + "retailer", + "retention", + "retirement", + "reviewer", + "riches", + "righteousness", + "roadblock", + "robber", + "rocks", + "rubbing", + "runoff", + "saloon", + "salvation", + "sarcasm", + "saucer", + "savior", + "scarcity", + "scenario", + "scenery", + "schism", + "scholarship", + "schoolboy", + "schooner", + "scissors", + "scolding", + "scooter", + "scouring", + "scrimmage", + "scrum", + "seating", + "sediment", + "seduction", + "seeder", + "seizure", + "self-confidence", + "self-control", + "self-respect", + "semicolon", + "semiconductor", + "semifinal", + "senator", + "sending", + "serenity", + "seriousness", + "servitude", + "sesame", + "setup", + "sewing", + "sharpness", + "shaving", + "shoplifting", + "shopping", + "siding", + "simplicity", + "simulation", + "sinking", + "skate", + "sloth", + "slugger", + "snack", + "snail", + "snapshot", + "snark", + "soccer", + "solemnity", + "solicitation", + "solitude", + "somewhere", + "sophistication", + "sorcery", + "souvenir", + "spaghetti", + "specification", + "specimen", + "specs", + "spectacle", + "spectre", + "speculation", + "sperm", + "spoiler", + "squad", + "squid", + "staging", + "stagnation", + "staircase", + "stairway", + "stamina", + "standpoint", + "standstill", + "stanza", + "statement", + "stillness", + "stimulus", + "stocks", + "stole", + "stoppage", + "storey", + "storyteller", + "stylus", + "subcommittee", + "subscription", + "subsidy", + "suburb", + "success", + "sufferer", + "supposition", + "suspension", + "sweater", + "sweepstakes", + "swimmer", + "syndrome", + "synopsis", + "syntax", + "system", + "tablespoon", + "taker", + "tavern", + "technology", + "telephony", + "template", + "tempo", + "tendency", + "tendon", + "terrier", + "terror", + "terry", + "theater", + "theology", + "therapy", + "thicket", + "thoroughfare", + "threshold", + "thriller", + "thunderstorm", + "ticker", + "tiger", + "tights", + "to-day", + "tossing", + "touchdown", + "tourist", + "tourney", + "toxicity", + "tracing", + "tractor", + "translation", + "transmission", + "transmitter", + "trauma", + "traveler", + "treadmill", + "trilogy", + "trout", + "tuning", + "twenties", + "tycoon", + "tyrant", + "ultimatum", + "underdog", + "underwear", + "unhappiness", + "unification", + "university", + "uprising", + "vaccination", + "validity", + "vampire", + "vanguard", + "variation", + "vegetation", + "verification", + "viability", + "vicinity", + "victory", + "viewpoint", + "villa", + "vindication", + "violation", + "vista", + "vocalist", + "vogue", + "volcano", + "voltage", + "vomiting", + "vulnerability", + "waistcoat", + "waitress", + "wardrobe", + "warmth", + "watchdog", + "wealth", + "weariness", + "whereabouts", + "whisky", + "whiteness", + "widget", + "width", + "windfall", + "wiring", + "witchcraft", + "withholding", + "womanhood", + "words", + "workman", + "youngster" +) diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ea771b43..0d21ca5e 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -83,4 +83,6 @@ chat: format: '&7[allies] [${factionColor}${faction}&7] [${role}] &f${displayName}: ${message}' duels: duration: PT2M - notificationDistance: 64 \ No newline at end of file + notificationDistance: 64 +dev: + enableDevCommands: false \ No newline at end of file