From 82662bc4d3fad46ff6369173b7f3ef10bc4cdbff Mon Sep 17 00:00:00 2001 From: Trivernis Date: Mon, 27 Jul 2020 21:20:03 +0200 Subject: [PATCH] Develop (#88) Merge develop into master * Update Translation to 1.3.0 (#86) * Update Translation to 1.3.0 * Tweak SQL_ERROR word order Co-authored-by: NPBeta * Update version to 1.3.1 * Remove empty body of PausedTaskEntry Co-authored-by: NPBeta --- build.gradle | 2 +- .../net/trivernis/chunkmaster/Chunkmaster.kt | 6 +- .../chunkmaster/ChunkmasterEvents.kt | 4 +- .../chunkmaster/commands/CmdCancel.kt | 4 +- .../chunkmaster/commands/CmdGenerate.kt | 35 +- .../chunkmaster/commands/CmdGetCenter.kt | 13 +- .../trivernis/chunkmaster/commands/CmdList.kt | 10 +- .../chunkmaster/commands/CmdPause.kt | 2 - .../chunkmaster/commands/CmdReload.kt | 4 +- .../chunkmaster/commands/CmdResume.kt | 4 +- .../chunkmaster/commands/CmdSetCenter.kt | 4 +- .../chunkmaster/commands/CmdStats.kt | 16 +- .../chunkmaster/commands/CmdTpChunk.kt | 4 +- .../commands/CommandChunkmaster.kt | 2 - .../chunkmaster/lib/LanguageManager.kt | 8 +- .../lib/database/GenerationTasks.kt | 3 +- .../chunkmaster/lib/database/SqliteManager.kt | 357 +++++++++--------- .../lib/database/WorldProperties.kt | 9 +- .../lib/dynmap/ExtendedMarkerSet.kt | 19 +- .../chunkmaster/lib/dynmap/MarkerStyle.kt | 7 +- .../lib/generation/ChunkCoordinates.kt | 2 +- .../lib/generation/ChunkUnloader.kt | 5 +- .../lib/generation/DefaultGenerationTask.kt | 2 +- .../lib/generation/GenerationManager.kt | 4 +- .../lib/generation/GenerationTask.kt | 10 +- .../lib/generation/PendingChunkEntry.kt | 1 - .../generation/taskentry/PausedTaskEntry.kt | 3 +- .../generation/taskentry/RunningTaskEntry.kt | 137 ++++--- .../chunkmaster/lib/shapes/Circle.kt | 10 +- .../trivernis/chunkmaster/lib/shapes/Shape.kt | 4 - .../chunkmaster/lib/shapes/Spiral.kt | 16 +- src/main/resources/i18n/zh.i18n.properties | 13 +- src/main/resources/plugin.yml | 2 +- 33 files changed, 383 insertions(+), 339 deletions(-) diff --git a/build.gradle b/build.gradle index eb3994f..592a5c2 100644 --- a/build.gradle +++ b/build.gradle @@ -22,7 +22,7 @@ idea { } group "net.trivernis" -version "1.3.0" +version "1.3.1" sourceCompatibility = 1.8 diff --git a/src/main/kotlin/net/trivernis/chunkmaster/Chunkmaster.kt b/src/main/kotlin/net/trivernis/chunkmaster/Chunkmaster.kt index 6d74308..448b873 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/Chunkmaster.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/Chunkmaster.kt @@ -10,7 +10,7 @@ import org.bukkit.plugin.java.JavaPlugin import org.bukkit.scheduler.BukkitTask import org.dynmap.DynmapAPI -class Chunkmaster: JavaPlugin() { +class Chunkmaster : JavaPlugin() { lateinit var sqliteManager: SqliteManager lateinit var generationManager: GenerationManager lateinit var langManager: LanguageManager @@ -48,7 +48,7 @@ class Chunkmaster: JavaPlugin() { if (PaperLib.isPaper() && PaperLib.getMinecraftPatchVersion() >= 225) { tpsTask = server.scheduler.runTaskTimer(this, Runnable { - mspt = 1000/server.currentTick // use papers exposed tick rather than calculating it + mspt = 1000 / server.currentTick // use papers exposed tick rather than calculating it }, 1, 300) } else { tpsTask = server.scheduler.runTaskTimer(this, Runnable { @@ -97,7 +97,7 @@ class Chunkmaster: JavaPlugin() { this.sqliteManager = SqliteManager(this) sqliteManager.init() logger.info(langManager.getLocalized("DB_INIT_FINISHED")) - } catch(e: Exception) { + } catch (e: Exception) { logger.warning(langManager.getLocalized("DB_INIT_EROR", e.message!!)) } } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/ChunkmasterEvents.kt b/src/main/kotlin/net/trivernis/chunkmaster/ChunkmasterEvents.kt index 650f65c..2ec66fb 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/ChunkmasterEvents.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/ChunkmasterEvents.kt @@ -9,7 +9,7 @@ import org.bukkit.event.player.PlayerQuitEvent class ChunkmasterEvents(private val chunkmaster: Chunkmaster, private val server: Server) : Listener { private val pauseOnPlayerCount: Int - get () { + get() { return chunkmaster.config.getInt("generation.pause-on-player-count") } private var playerPaused = false @@ -25,7 +25,7 @@ class ChunkmasterEvents(private val chunkmaster: Chunkmaster, private val server chunkmaster.logger.info(chunkmaster.langManager.getLocalized("RESUME_PLAYER_LEAVE")) } chunkmaster.generationManager.resumeAll() - } else if (chunkmaster.generationManager.paused){ + } else if (chunkmaster.generationManager.paused) { chunkmaster.logger.info(chunkmaster.langManager.getLocalized("PAUSE_MANUALLY")) playerPaused = chunkmaster.generationManager.paused } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdCancel.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdCancel.kt index ec2bb78..0af6b7c 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdCancel.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdCancel.kt @@ -5,7 +5,7 @@ import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.command.Command import org.bukkit.command.CommandSender -class CmdCancel(private val chunkmaster: Chunkmaster): Subcommand { +class CmdCancel(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "cancel" /** @@ -19,7 +19,7 @@ class CmdCancel(private val chunkmaster: Chunkmaster): Subcommand { ): MutableList { val genManager = chunkmaster.generationManager val allTasks = genManager.allTasks - return allTasks.filter {it.id.toString().indexOf(args[0]) == 0} + return allTasks.filter { it.id.toString().indexOf(args[0]) == 0 } .map { it.id.toString() }.toMutableList() } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt index a9eccae..0eb74b1 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt @@ -6,7 +6,7 @@ import org.bukkit.command.Command import org.bukkit.command.CommandSender import org.bukkit.entity.Player -class CmdGenerate(private val chunkmaster: Chunkmaster): Subcommand { +class CmdGenerate(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "generate" /** @@ -20,14 +20,14 @@ class CmdGenerate(private val chunkmaster: Chunkmaster): Subcommand { ): MutableList { if (args.size == 1) { return sender.server.worlds.filter { it.name.indexOf(args[0]) == 0 } - .map {it.name}.toMutableList() + .map { it.name }.toMutableList() } else if (args.size == 2) { if (args[0].toIntOrNull() != null) { - return shapes.filter {it.indexOf(args[1]) == 0}.toMutableList() + return shapes.filter { it.indexOf(args[1]) == 0 }.toMutableList() } } else if (args.size > 2) { if (args[1].toIntOrNull() != null) { - return shapes.filter {it.indexOf(args[2]) == 0}.toMutableList() + return shapes.filter { it.indexOf(args[2]) == 0 }.toMutableList() } } return emptyList().toMutableList() @@ -97,19 +97,22 @@ class CmdGenerate(private val chunkmaster: Chunkmaster): Subcommand { val world = chunkmaster.server.getWorld(worldName) val allTasks = chunkmaster.generationManager.allTasks return if (world != null && (allTasks.find { it.generationTask.world == world }) == null) { - chunkmaster.generationManager.addTask(world, if (blockRadius > 0) blockRadius/16 else -1 , shape) - sender.sendMessage(chunkmaster.langManager - .getLocalized("TASK_CREATION_SUCCESS", - worldName, - if (blockRadius > 0) { - chunkmaster.langManager.getLocalized("TASK_UNIT_RADIUS", blockRadius) - } else{ - chunkmaster.langManager.getLocalized("TASK_UNIT_WORLDBORDER") - }, - shape - )) + chunkmaster.generationManager.addTask(world, if (blockRadius > 0) blockRadius / 16 else -1, shape) + sender.sendMessage( + chunkmaster.langManager + .getLocalized( + "TASK_CREATION_SUCCESS", + worldName, + if (blockRadius > 0) { + chunkmaster.langManager.getLocalized("TASK_UNIT_RADIUS", blockRadius) + } else { + chunkmaster.langManager.getLocalized("TASK_UNIT_WORLDBORDER") + }, + shape + ) + ) true - } else if (world == null){ + } else if (world == null) { sender.sendMessage(chunkmaster.langManager.getLocalized("WORLD_NOT_FOUND", worldName)); false } else { diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGetCenter.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGetCenter.kt index 316d8e8..a0367dc 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGetCenter.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGetCenter.kt @@ -6,7 +6,7 @@ import org.bukkit.command.Command import org.bukkit.command.CommandSender import org.bukkit.entity.Player -class CmdGetCenter(private val chunkmaster: Chunkmaster): Subcommand { +class CmdGetCenter(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "getCenter"; override fun onTabComplete( @@ -17,7 +17,7 @@ class CmdGetCenter(private val chunkmaster: Chunkmaster): Subcommand { ): MutableList { if (args.size == 1) { return sender.server.worlds.filter { it.name.indexOf(args[0]) == 0 } - .map {it.name}.toMutableList() + .map { it.name }.toMutableList() } return emptyList().toMutableList() } @@ -55,7 +55,14 @@ class CmdGetCenter(private val chunkmaster: Chunkmaster): Subcommand { } center = Pair(world.spawnLocation.chunk.x, world.spawnLocation.chunk.z) } - sender.sendMessage(chunkmaster.langManager.getLocalized("CENTER_INFO", worldName, center.first, center.second)) + sender.sendMessage( + chunkmaster.langManager.getLocalized( + "CENTER_INFO", + worldName, + center.first, + center.second + ) + ) } } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdList.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdList.kt index 54082ce..df5b6ed 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdList.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdList.kt @@ -7,7 +7,7 @@ import org.bukkit.command.Command import org.bukkit.command.CommandSender import kotlin.math.ceil -class CmdList(private val chunkmaster: Chunkmaster): Subcommand { +class CmdList(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "list" override fun onTabComplete( @@ -50,7 +50,7 @@ class CmdList(private val chunkmaster: Chunkmaster): Subcommand { private fun getGenerationEntry(task: TaskEntry): String { val genTask = task.generationTask val percentage = if (genTask.radius > 0) - " (%.1f".format(genTask.shape.progress()*100) + "%)." + " (%.1f".format(genTask.shape.progress() * 100) + "%)." else "" val count = if (genTask.radius > 0) { @@ -58,7 +58,9 @@ class CmdList(private val chunkmaster: Chunkmaster): Subcommand { } else { genTask.count.toString() } - return "\n" + chunkmaster.langManager.getLocalized("TASKS_ENTRY", - task.id, genTask.world.name, genTask.state.toString(), count, percentage) + return "\n" + chunkmaster.langManager.getLocalized( + "TASKS_ENTRY", + task.id, genTask.world.name, genTask.state.toString(), count, percentage + ) } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdPause.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdPause.kt index c49cddc..e5ca5f9 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdPause.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdPause.kt @@ -1,7 +1,5 @@ package net.trivernis.chunkmaster.commands -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ComponentBuilder import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.command.Command diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdReload.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdReload.kt index 1503770..6834708 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdReload.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdReload.kt @@ -1,13 +1,11 @@ package net.trivernis.chunkmaster.commands -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ComponentBuilder import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.command.Command import org.bukkit.command.CommandSender -class CmdReload(private val chunkmaster: Chunkmaster): Subcommand { +class CmdReload(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "reload" override fun onTabComplete( diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdResume.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdResume.kt index 2d143f0..5c6ddde 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdResume.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdResume.kt @@ -1,13 +1,11 @@ package net.trivernis.chunkmaster.commands -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ComponentBuilder import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.command.Command import org.bukkit.command.CommandSender -class CmdResume(private val chunkmaster: Chunkmaster): Subcommand { +class CmdResume(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "resume" override fun onTabComplete( diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdSetCenter.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdSetCenter.kt index 9adee80..863c577 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdSetCenter.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdSetCenter.kt @@ -6,7 +6,7 @@ import org.bukkit.command.Command import org.bukkit.command.CommandSender import org.bukkit.entity.Player -class CmdSetCenter(private val chunkmaster: Chunkmaster): Subcommand { +class CmdSetCenter(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "setCenter"; override fun onTabComplete( @@ -18,7 +18,7 @@ class CmdSetCenter(private val chunkmaster: Chunkmaster): Subcommand { if (args.size == 1) { if (args[0].toIntOrNull() == null) { return sender.server.worlds.filter { it.name.indexOf(args[0]) == 0 } - .map {it.name}.toMutableList() + .map { it.name }.toMutableList() } } return emptyList().toMutableList(); diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdStats.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdStats.kt index bab4b20..9f9adfe 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdStats.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdStats.kt @@ -5,9 +5,8 @@ import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.World import org.bukkit.command.Command import org.bukkit.command.CommandSender -import org.bukkit.entity.Player -class CmdStats(private val chunkmaster: Chunkmaster): Subcommand { +class CmdStats(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "stats" override fun onTabComplete( @@ -23,8 +22,10 @@ class CmdStats(private val chunkmaster: Chunkmaster): Subcommand { if (args.isNotEmpty()) { val world = sender.server.getWorld(args[0]) if (world == null) { - sender.sendMessage(chunkmaster.langManager.getLocalized("STATS_HEADER") + "\n" + - chunkmaster.langManager.getLocalized("WORLD_NOT_FOUND", args[0])) + sender.sendMessage( + chunkmaster.langManager.getLocalized("STATS_HEADER") + "\n" + + chunkmaster.langManager.getLocalized("WORLD_NOT_FOUND", args[0]) + ) return false } sender.sendMessage(getWorldStatsMessage(sender, world)) @@ -53,7 +54,12 @@ class CmdStats(private val chunkmaster: Chunkmaster): Subcommand { ${chunkmaster.langManager.getLocalized("STATS_SERVER")} ${chunkmaster.langManager.getLocalized("STATS_SERVER_VERSION", sender.server.version)} ${chunkmaster.langManager.getLocalized("STATS_PLUGIN_VERSION", chunkmaster.description.version)} - ${chunkmaster.langManager.getLocalized("STATS_MEMORY", memUsed/1000000, runtime.maxMemory()/1000000, (memUsed.toFloat()/runtime.maxMemory().toFloat()) * 100)} + ${chunkmaster.langManager.getLocalized( + "STATS_MEMORY", + memUsed / 1000000, + runtime.maxMemory() / 1000000, + (memUsed.toFloat() / runtime.maxMemory().toFloat()) * 100 + )} ${chunkmaster.langManager.getLocalized("STATS_CORES", runtime.availableProcessors())} ${chunkmaster.langManager.getLocalized("STATS_PLUGIN_LOADED_CHUNKS", chunkmaster.generationManager.loadedChunkCount)} diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdTpChunk.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdTpChunk.kt index 8ffcb6d..3dceb7f 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdTpChunk.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdTpChunk.kt @@ -1,8 +1,6 @@ package net.trivernis.chunkmaster.commands import io.papermc.lib.PaperLib -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ComponentBuilder import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.Material @@ -10,7 +8,7 @@ import org.bukkit.command.Command import org.bukkit.command.CommandSender import org.bukkit.entity.Player -class CmdTpChunk(private val chunkmaster: Chunkmaster): Subcommand { +class CmdTpChunk(private val chunkmaster: Chunkmaster) : Subcommand { override val name = "tpchunk" override fun onTabComplete( diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CommandChunkmaster.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CommandChunkmaster.kt index e33211d..b8870ea 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CommandChunkmaster.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CommandChunkmaster.kt @@ -1,7 +1,5 @@ package net.trivernis.chunkmaster.commands -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ComponentBuilder import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.Subcommand import org.bukkit.Server diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/LanguageManager.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/LanguageManager.kt index 467cdfa..4b19e74 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/LanguageManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/LanguageManager.kt @@ -1,8 +1,8 @@ package net.trivernis.chunkmaster.lib + import net.trivernis.chunkmaster.Chunkmaster -import java.lang.Exception -import java.util.Properties import java.io.* +import java.util.* class LanguageManager(private val plugin: Chunkmaster) { private val langProps = Properties() @@ -20,12 +20,14 @@ class LanguageManager(private val plugin: Chunkmaster) { val file = File(langFile) val loader = Thread.currentThread().contextClassLoader val defaultStream = this.javaClass.getResourceAsStream("/i18n/DEFAULT.i18n.properties") + if (defaultStream != null) { langProps.load(getReaderForProperties(defaultStream)) defaultStream.close() } else { plugin.logger.severe("Couldn't load default language properties.") } + if (file.exists()) { try { val inputStream = loader.getResourceAsStream(langFile) @@ -34,7 +36,7 @@ class LanguageManager(private val plugin: Chunkmaster) { langFileLoaded = true inputStream.close() } - } catch (e: Exception) { + } catch (e: Exception) { plugin.logger.warning("Language file $langFile could not be loaded!") plugin.logger.fine(e.toString()) } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/GenerationTasks.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/GenerationTasks.kt index c8f9948..7f90b21 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/GenerationTasks.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/GenerationTasks.kt @@ -37,7 +37,8 @@ class GenerationTasks(private val sqliteManager: SqliteManager) { */ fun addGenerationTask(world: String, center: ChunkCoordinates, radius: Int, shape: String): CompletableFuture { val completableFuture = CompletableFuture() - sqliteManager.executeStatement(""" + sqliteManager.executeStatement( + """ INSERT INTO generation_tasks (center_x, center_z, last_x, last_z, world, radius, shape) values (?, ?, ?, ?, ?, ?, ?)""", hashMapOf( diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/SqliteManager.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/SqliteManager.kt index c65940a..f2ed67c 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/SqliteManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/SqliteManager.kt @@ -1,170 +1,189 @@ -package net.trivernis.chunkmaster.lib.database - -import net.trivernis.chunkmaster.Chunkmaster -import org.apache.commons.lang.exception.ExceptionUtils -import java.lang.Exception -import java.sql.Connection -import java.sql.DriverManager -import java.sql.ResultSet - -class SqliteManager(private val chunkmaster: Chunkmaster) { - private val tables = listOf( - Pair( - "generation_tasks", - listOf( - Pair("id", "integer PRIMARY KEY AUTOINCREMENT"), - Pair("center_x", "integer NOT NULL DEFAULT 0"), - Pair("center_z", "integer NOT NULL DEFAULT 0"), - Pair("last_x", "integer NOT NULL DEFAULT 0"), - Pair("last_z", "integer NOT NULL DEFAULT 0"), - Pair("world", "text UNIQUE NOT NULL DEFAULT 'world'"), - Pair("radius", "integer DEFAULT -1"), - Pair("shape", "text NOT NULL DEFAULT 'square'"), - Pair("state", "text NOT NULL DEFAULT 'GENERATING'") - ) - ), - Pair( - "world_properties", - listOf( - Pair("name", "text PRIMARY KEY"), - Pair("center_x", "integer NOT NULL DEFAULT 0"), - Pair("center_z", "integer NOT NULL DEFAULT 0") - ) - ), - Pair( - "pending_chunks", - listOf( - Pair("id", "integer PRIMARY KEY AUTOINCREMENT"), - Pair("task_id", "integer NOT NULL"), - Pair("chunk_x", "integer NOT NULL"), - Pair("chunk_z", "integer NOT NULL") - ) - ) - ) - private val needUpdate = HashSet>>() - private val needCreation = HashSet() - private var connection: Connection? = null - private var activeTasks = 0 - - val worldProperties = WorldProperties(this) - val pendingChunks = PendingChunks(this) - val generationTasks = GenerationTasks(this) - - /** - * Returns the connection to the database - */ - fun getConnection(): Connection? { - if (this.connection != null) { - return this.connection - } - try { - Class.forName("org.sqlite.JDBC") - this.connection = DriverManager.getConnection("jdbc:sqlite:${chunkmaster.dataFolder.absolutePath}/" + - "${chunkmaster.config.getString("database.filename")}") - return this.connection - } catch (e: Exception) { - chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("DATABASE_CONNECTION_ERROR")) - chunkmaster.logger.severe(e.message) - } - return null - } - - /** - * Checks for and performs an update - */ - fun init() { - this.checkUpdate() - this.performUpdate() - } - - /** - * Checks which tables need an update or creation. - */ - private fun checkUpdate() { - val meta = getConnection()!!.metaData - - for (table in tables) { - val resTables = meta.getTables(null, null, table.first, null) - - if (resTables.next()) { // table exists - for (column in table.second) { - val resColumn = meta.getColumns(null, null, table.first, column.first) - if (!resColumn.next()) { - needUpdate.add(Pair(table.first, column)) - } - resColumn.close() - } - } else { - needCreation.add(table.first) - } - resTables.close() - } - } - - /** - * Executes a sql statement on the database. - */ - fun executeStatement(sql: String, values: HashMap, callback: ((ResultSet?) -> Unit)?) { - val connection = getConnection() - activeTasks++ - if (connection != null) { - try { - //println("'$sql' with values $values") - val statement = connection.prepareStatement(sql) - for (parameterValue in values) { - statement.setObject(parameterValue.key, parameterValue.value) - } - statement.execute() - val res: ResultSet? = statement.resultSet - if (callback != null) { - callback(res) - } - statement.close() - } catch (e: Exception) { - chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("SQL_ERROR", e.toString())) - chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) - } finally { - activeTasks-- - if (activeTasks == 0) { - connection.close() - this.connection = null - } - } - } else { - chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("NO_DATABASE_CONNECTION")) - } - } - - /** - * Creates or updates tables that needed an update. - */ - private fun performUpdate() { - for (table in needCreation) { - try { - var tableDef = "CREATE TABLE IF NOT EXISTS $table (" - - for (column in tables.find{it.first == table}!!.second) { - tableDef += "${column.first} ${column.second}," - } - tableDef = tableDef.substringBeforeLast(",") + ");" - chunkmaster.logger.finest(chunkmaster.langManager.getLocalized("CREATE_TABLE_DEFINITION", table, tableDef)) - executeStatement(tableDef, HashMap(), null) - } catch (e: Exception) { - chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("TABLE_CREATE_ERROR", table)) - chunkmaster.logger.severe(e.message) - chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) - } - } - for (table in needUpdate) { - val updateSql = "ALTER TABLE ${table.first} ADD COLUMN ${table.second.first} ${table.second.second}" - try { - executeStatement(updateSql, HashMap(), null) - chunkmaster.logger.finest(chunkmaster.langManager.getLocalized("UPDATE_TABLE_DEFINITION", table.first, updateSql)) - } catch (e: Exception) { - chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("UPDATE_TABLE_FAILED", table.first, updateSql)) - chunkmaster.logger.severe(e.message) - chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) - } - } - } +package net.trivernis.chunkmaster.lib.database + +import net.trivernis.chunkmaster.Chunkmaster +import org.apache.commons.lang.exception.ExceptionUtils +import java.sql.Connection +import java.sql.DriverManager +import java.sql.ResultSet + +class SqliteManager(private val chunkmaster: Chunkmaster) { + private val tables = listOf( + Pair( + "generation_tasks", + listOf( + Pair("id", "integer PRIMARY KEY AUTOINCREMENT"), + Pair("center_x", "integer NOT NULL DEFAULT 0"), + Pair("center_z", "integer NOT NULL DEFAULT 0"), + Pair("last_x", "integer NOT NULL DEFAULT 0"), + Pair("last_z", "integer NOT NULL DEFAULT 0"), + Pair("world", "text UNIQUE NOT NULL DEFAULT 'world'"), + Pair("radius", "integer DEFAULT -1"), + Pair("shape", "text NOT NULL DEFAULT 'square'"), + Pair("state", "text NOT NULL DEFAULT 'GENERATING'") + ) + ), + Pair( + "world_properties", + listOf( + Pair("name", "text PRIMARY KEY"), + Pair("center_x", "integer NOT NULL DEFAULT 0"), + Pair("center_z", "integer NOT NULL DEFAULT 0") + ) + ), + Pair( + "pending_chunks", + listOf( + Pair("id", "integer PRIMARY KEY AUTOINCREMENT"), + Pair("task_id", "integer NOT NULL"), + Pair("chunk_x", "integer NOT NULL"), + Pair("chunk_z", "integer NOT NULL") + ) + ) + ) + private val needUpdate = HashSet>>() + private val needCreation = HashSet() + private var connection: Connection? = null + private var activeTasks = 0 + + val worldProperties = WorldProperties(this) + val pendingChunks = PendingChunks(this) + val generationTasks = GenerationTasks(this) + + /** + * Returns the connection to the database + */ + fun getConnection(): Connection? { + if (this.connection != null) { + return this.connection + } + try { + Class.forName("org.sqlite.JDBC") + this.connection = DriverManager.getConnection( + "jdbc:sqlite:${chunkmaster.dataFolder.absolutePath}/" + + "${chunkmaster.config.getString("database.filename")}" + ) + return this.connection + } catch (e: Exception) { + chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("DATABASE_CONNECTION_ERROR")) + chunkmaster.logger.severe(e.message) + } + return null + } + + /** + * Checks for and performs an update + */ + fun init() { + this.checkUpdate() + this.performUpdate() + } + + /** + * Checks which tables need an update or creation. + */ + private fun checkUpdate() { + val meta = getConnection()!!.metaData + + for (table in tables) { + val resTables = meta.getTables(null, null, table.first, null) + + if (resTables.next()) { // table exists + for (column in table.second) { + val resColumn = meta.getColumns(null, null, table.first, column.first) + if (!resColumn.next()) { + needUpdate.add(Pair(table.first, column)) + } + resColumn.close() + } + } else { + needCreation.add(table.first) + } + resTables.close() + } + } + + /** + * Executes a sql statement on the database. + */ + fun executeStatement(sql: String, values: HashMap, callback: ((ResultSet?) -> Unit)?) { + val connection = getConnection() + activeTasks++ + if (connection != null) { + try { + //println("'$sql' with values $values") + val statement = connection.prepareStatement(sql) + for (parameterValue in values) { + statement.setObject(parameterValue.key, parameterValue.value) + } + statement.execute() + val res: ResultSet? = statement.resultSet + if (callback != null) { + callback(res) + } + statement.close() + } catch (e: Exception) { + chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("SQL_ERROR", e.toString())) + chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) + } finally { + activeTasks-- + if (activeTasks == 0) { + connection.close() + this.connection = null + } + } + } else { + chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("NO_DATABASE_CONNECTION")) + } + } + + /** + * Creates or updates tables that needed an update. + */ + private fun performUpdate() { + for (table in needCreation) { + try { + var tableDef = "CREATE TABLE IF NOT EXISTS $table (" + + for (column in tables.find { it.first == table }!!.second) { + tableDef += "${column.first} ${column.second}," + } + tableDef = tableDef.substringBeforeLast(",") + ");" + chunkmaster.logger.finest( + chunkmaster.langManager.getLocalized( + "CREATE_TABLE_DEFINITION", + table, + tableDef + ) + ) + executeStatement(tableDef, HashMap(), null) + } catch (e: Exception) { + chunkmaster.logger.severe(chunkmaster.langManager.getLocalized("TABLE_CREATE_ERROR", table)) + chunkmaster.logger.severe(e.message) + chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) + } + } + for (table in needUpdate) { + val updateSql = "ALTER TABLE ${table.first} ADD COLUMN ${table.second.first} ${table.second.second}" + try { + executeStatement(updateSql, HashMap(), null) + chunkmaster.logger.finest( + chunkmaster.langManager.getLocalized( + "UPDATE_TABLE_DEFINITION", + table.first, + updateSql + ) + ) + } catch (e: Exception) { + chunkmaster.logger.severe( + chunkmaster.langManager.getLocalized( + "UPDATE_TABLE_FAILED", + table.first, + updateSql + ) + ) + chunkmaster.logger.severe(e.message) + chunkmaster.logger.info(ExceptionUtils.getStackTrace(e)) + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/WorldProperties.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/WorldProperties.kt index fe6dab4..9853afe 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/database/WorldProperties.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/database/WorldProperties.kt @@ -1,6 +1,5 @@ package net.trivernis.chunkmaster.lib.database -import net.trivernis.chunkmaster.lib.generation.ChunkCoordinates import java.util.concurrent.CompletableFuture class WorldProperties(private val sqliteManager: SqliteManager) { @@ -36,7 +35,7 @@ class WorldProperties(private val sqliteManager: SqliteManager) { getWorldCenter(worldName).thenAccept { if (it != null) { - updateWorldProperties(worldName, center).thenAccept {completableFuture.complete(null) } + updateWorldProperties(worldName, center).thenAccept { completableFuture.complete(null) } } else { insertWorldProperties(worldName, center).thenAccept { completableFuture.complete(null) } } @@ -49,7 +48,8 @@ class WorldProperties(private val sqliteManager: SqliteManager) { */ private fun updateWorldProperties(worldName: String, center: Pair): CompletableFuture { val completableFuture = CompletableFuture() - sqliteManager.executeStatement("UPDATE world_properties SET center_x = ?, center_z = ? WHERE name = ?", + sqliteManager.executeStatement( + "UPDATE world_properties SET center_x = ?, center_z = ? WHERE name = ?", hashMapOf( 1 to center.first, 2 to center.second, @@ -67,7 +67,8 @@ class WorldProperties(private val sqliteManager: SqliteManager) { */ private fun insertWorldProperties(worldName: String, center: Pair): CompletableFuture { val completableFuture = CompletableFuture() - sqliteManager.executeStatement("INSERT INTO world_properties (name, center_x, center_z) VALUES (?, ?, ?)", + sqliteManager.executeStatement( + "INSERT INTO world_properties (name, center_x, center_z) VALUES (?, ?, ?)", hashMapOf( 1 to worldName, 2 to center.first, diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/ExtendedMarkerSet.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/ExtendedMarkerSet.kt index c5dab40..284f282 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/ExtendedMarkerSet.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/ExtendedMarkerSet.kt @@ -2,7 +2,6 @@ package net.trivernis.chunkmaster.lib.dynmap import org.bukkit.Location import org.dynmap.markers.AreaMarker -import org.dynmap.markers.Marker import org.dynmap.markers.MarkerSet import org.dynmap.markers.PolyLineMarker @@ -46,7 +45,12 @@ class ExtendedMarkerSet(private val markerSet: MarkerSet) { } - fun creUpdatePolyLineMarker(id: String, label: String, edges: List, style: MarkerStyle?): PolyLineMarker? { + fun creUpdatePolyLineMarker( + id: String, + label: String, + edges: List, + style: MarkerStyle? + ): PolyLineMarker? { var marker = markerSet.findPolyLineMarker(id) val xList = edges.map { it.x } val yList = edges.map { it.y } @@ -54,7 +58,16 @@ class ExtendedMarkerSet(private val markerSet: MarkerSet) { if (marker != null) { marker.setCornerLocations(xList.toDoubleArray(), yList.toDoubleArray(), zList.toDoubleArray()) } else { - marker = markerSet.createPolyLineMarker(id, label, false, edges.first().world.name, xList.toDoubleArray(), yList.toDoubleArray(), zList.toDoubleArray(), true) + marker = markerSet.createPolyLineMarker( + id, + label, + false, + edges.first().world.name, + xList.toDoubleArray(), + yList.toDoubleArray(), + zList.toDoubleArray(), + true + ) } if (style != null) { if (style.lineStyle != null) { diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/MarkerStyle.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/MarkerStyle.kt index 4260002..9ceb736 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/MarkerStyle.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/dynmap/MarkerStyle.kt @@ -2,4 +2,9 @@ package net.trivernis.chunkmaster.lib.dynmap import org.dynmap.markers.MarkerIcon -data class MarkerStyle(val icon: MarkerIcon?, val lineStyle: LineStyle?, val fillStyle: FillStyle?, val boostFlag: Boolean = false) \ No newline at end of file +data class MarkerStyle( + val icon: MarkerIcon?, + val lineStyle: LineStyle?, + val fillStyle: FillStyle?, + val boostFlag: Boolean = false +) \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkCoordinates.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkCoordinates.kt index b5c7cbc..0844272 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkCoordinates.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkCoordinates.kt @@ -5,7 +5,7 @@ import org.bukkit.World class ChunkCoordinates(val x: Int, val z: Int) { fun getCenterLocation(world: World): Location { - return Location(world, ((x*16) + 8).toDouble(), 1.0, ((z*16) + 8).toDouble()) + return Location(world, ((x * 16) + 8).toDouble(), 1.0, ((z * 16) + 8).toDouble()) } override fun toString(): String { diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkUnloader.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkUnloader.kt index 50c1ada..044a744 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkUnloader.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/ChunkUnloader.kt @@ -2,13 +2,10 @@ package net.trivernis.chunkmaster.lib.generation import net.trivernis.chunkmaster.Chunkmaster import org.bukkit.Chunk -import java.lang.Exception import java.util.* -import java.util.concurrent.* import java.util.concurrent.locks.ReentrantReadWriteLock -import kotlin.collections.HashSet -class ChunkUnloader(private val plugin: Chunkmaster): Runnable { +class ChunkUnloader(private val plugin: Chunkmaster) : Runnable { private val maxLoadedChunks = plugin.config.getInt("generation.max-loaded-chunks") private val lock = ReentrantReadWriteLock() private var unloadingQueue = Vector(maxLoadedChunks) diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/DefaultGenerationTask.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/DefaultGenerationTask.kt index 8441755..1d650b5 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/DefaultGenerationTask.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/DefaultGenerationTask.kt @@ -4,7 +4,7 @@ import io.papermc.lib.PaperLib import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.shapes.Shape import org.bukkit.World -import java.util.concurrent.* +import java.util.concurrent.ArrayBlockingQueue class DefaultGenerationTask( private val plugin: Chunkmaster, diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt index dbe64a6..fbc4d41 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt @@ -22,11 +22,11 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server return chunkmaster.config.getLong("generation.unloading-period") } private val pauseOnPlayerCount: Int - get () { + get() { return chunkmaster.config.getInt("generation.pause-on-player-count") } private val autostart: Boolean - get () { + get() { return chunkmaster.config.getBoolean("generation.autostart") } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt index efa1005..63344a7 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt @@ -4,7 +4,6 @@ import net.trivernis.chunkmaster.Chunkmaster import net.trivernis.chunkmaster.lib.dynmap.* import net.trivernis.chunkmaster.lib.shapes.Shape import org.bukkit.World -import java.util.concurrent.Semaphore import kotlin.math.ceil /** @@ -75,12 +74,14 @@ abstract class GenerationTask( TaskState.CORRECTING -> { this.generateMissing() } - else -> { } + else -> { + } } if (!cancelRun && this.borderReached()) { this.setEndReached() } - } catch (e: InterruptedException){} + } catch (e: InterruptedException) { + } isRunning = false } @@ -108,7 +109,8 @@ abstract class GenerationTask( markerSet?.creUpdatePolyLineMarker( markerAreaId, markerAreaName, - this.shape.getShapeEdgeLocations().map { ChunkCoordinates(it.first, it.second).getCenterLocation(this.world) }, + this.shape.getShapeEdgeLocations() + .map { ChunkCoordinates(it.first, it.second).getCenterLocation(this.world) }, markerAreaStyle ) } diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/PendingChunkEntry.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/PendingChunkEntry.kt index 6aa5b64..abbe1b1 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/PendingChunkEntry.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/PendingChunkEntry.kt @@ -1,6 +1,5 @@ package net.trivernis.chunkmaster.lib.generation -import net.trivernis.chunkmaster.lib.generation.ChunkCoordinates import org.bukkit.Chunk import java.util.concurrent.CompletableFuture diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/PausedTaskEntry.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/PausedTaskEntry.kt index 57f2405..c1808ed 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/PausedTaskEntry.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/PausedTaskEntry.kt @@ -5,5 +5,4 @@ import net.trivernis.chunkmaster.lib.generation.GenerationTask class PausedTaskEntry( override val id: Int, override val generationTask: GenerationTask -) : TaskEntry { -} \ No newline at end of file +) : TaskEntry \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/RunningTaskEntry.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/RunningTaskEntry.kt index 0aca508..6db86d3 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/RunningTaskEntry.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/taskentry/RunningTaskEntry.kt @@ -1,70 +1,69 @@ -package net.trivernis.chunkmaster.lib.generation.taskentry - -import io.papermc.lib.PaperLib -import net.trivernis.chunkmaster.lib.generation.GenerationTask - -class RunningTaskEntry( - override val id: Int, - override val generationTask: GenerationTask -) : TaskEntry { - - private var lastProgress: Pair? = null - private var lastChunkCount: Pair? = null - private var thread = Thread(generationTask) - - /** - * Returns the generation Speed - */ - val generationSpeed: Pair - get() { - var generationSpeed: Double? = null - var chunkGenerationSpeed: Double? = null - if (lastProgress != null) { - val progressDiff = generationTask.shape.progress() - lastProgress!!.second - val timeDiff = (System.currentTimeMillis() - lastProgress!!.first).toDouble() / 1000 - generationSpeed = progressDiff / timeDiff - } - if (lastChunkCount != null) { - val chunkDiff = generationTask.count - lastChunkCount!!.second - val timeDiff = (System.currentTimeMillis() - lastChunkCount!!.first).toDouble() / 1000 - chunkGenerationSpeed = chunkDiff / timeDiff - } - lastProgress = Pair(System.currentTimeMillis(), generationTask.shape.progress()) - lastChunkCount = Pair(System.currentTimeMillis(), generationTask.count) - return Pair(generationSpeed, chunkGenerationSpeed) - } - - init { - lastProgress = Pair(System.currentTimeMillis(), generationTask.shape.progress()) - lastChunkCount = Pair(System.currentTimeMillis(), generationTask.count) - } - - fun start() { - thread.start() - } - - fun cancel(timeout: Long): Boolean { - if (generationTask.isRunning) { - generationTask.cancel() - thread.interrupt() - } - return try { - joinThread(timeout) - } catch (e: InterruptedException) { - true - } - } - - private fun joinThread(timeout: Long): Boolean { - var threadStopped = false - - for (i in 0..100) { - if (!thread.isAlive || !generationTask.isRunning) { - threadStopped = true - break - } - Thread.sleep(timeout / 100) - } - return threadStopped - } +package net.trivernis.chunkmaster.lib.generation.taskentry + +import net.trivernis.chunkmaster.lib.generation.GenerationTask + +class RunningTaskEntry( + override val id: Int, + override val generationTask: GenerationTask +) : TaskEntry { + + private var lastProgress: Pair? = null + private var lastChunkCount: Pair? = null + private var thread = Thread(generationTask) + + /** + * Returns the generation Speed + */ + val generationSpeed: Pair + get() { + var generationSpeed: Double? = null + var chunkGenerationSpeed: Double? = null + if (lastProgress != null) { + val progressDiff = generationTask.shape.progress() - lastProgress!!.second + val timeDiff = (System.currentTimeMillis() - lastProgress!!.first).toDouble() / 1000 + generationSpeed = progressDiff / timeDiff + } + if (lastChunkCount != null) { + val chunkDiff = generationTask.count - lastChunkCount!!.second + val timeDiff = (System.currentTimeMillis() - lastChunkCount!!.first).toDouble() / 1000 + chunkGenerationSpeed = chunkDiff / timeDiff + } + lastProgress = Pair(System.currentTimeMillis(), generationTask.shape.progress()) + lastChunkCount = Pair(System.currentTimeMillis(), generationTask.count) + return Pair(generationSpeed, chunkGenerationSpeed) + } + + init { + lastProgress = Pair(System.currentTimeMillis(), generationTask.shape.progress()) + lastChunkCount = Pair(System.currentTimeMillis(), generationTask.count) + } + + fun start() { + thread.start() + } + + fun cancel(timeout: Long): Boolean { + if (generationTask.isRunning) { + generationTask.cancel() + thread.interrupt() + } + return try { + joinThread(timeout) + } catch (e: InterruptedException) { + true + } + } + + private fun joinThread(timeout: Long): Boolean { + var threadStopped = false + + for (i in 0..100) { + if (!thread.isAlive || !generationTask.isRunning) { + threadStopped = true + break + } + Thread.sleep(timeout / 100) + } + return threadStopped + } } \ No newline at end of file diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt index 2546b04..4ece528 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Circle.kt @@ -1,14 +1,10 @@ package net.trivernis.chunkmaster.lib.shapes -import net.trivernis.chunkmaster.lib.dynmap.ExtendedMarkerSet -import net.trivernis.chunkmaster.lib.dynmap.MarkerStyle import java.util.* import kotlin.collections.ArrayList import kotlin.collections.HashSet import kotlin.math.PI import kotlin.math.pow -import kotlin.math.sqrt -import kotlin.system.exitProcess class Circle(center: Pair, start: Pair, radius: Int) : Shape(center, start, radius) { private var r = 0 @@ -21,7 +17,7 @@ class Circle(center: Pair, start: Pair, radius: Int) : Shape } override fun total(): Double { - return (PI * radius.toFloat().pow(2)) + return (PI * radius.toFloat().pow(2)) } override fun progress(): Double { @@ -50,16 +46,19 @@ class Circle(center: Pair, start: Pair, radius: Int) : Shape if (endReached()) { return currentPos } + if (count == 0 && currentPos != center) { val tmpCircle = Circle(center, center, radius) while (tmpCircle.next() != currentPos && !tmpCircle.endReached()); this.count = tmpCircle.count this.r = tmpCircle.r } + if (count == 0) { count++ return center } + if (coords.isEmpty()) { r++ val tmpCoords = HashSet>() @@ -70,6 +69,7 @@ class Circle(center: Pair, start: Pair, radius: Int) : Shape coords.addAll(tmpCoords) previousCoords.addAll(tmpCoords) } + count++ val coord = coords.pop() currentPos = Pair(coord.first + center.first, coord.second + center.second) diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt index 298b603..f4071ff 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Shape.kt @@ -1,9 +1,5 @@ package net.trivernis.chunkmaster.lib.shapes -import net.trivernis.chunkmaster.lib.dynmap.ExtendedMarkerSet -import net.trivernis.chunkmaster.lib.dynmap.MarkerStyle -import javax.xml.stream.Location - abstract class Shape(protected val center: Pair, start: Pair, radius: Int) { protected var currentPos = start protected var radius = radius diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt index 9564ca6..931c48d 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/shapes/Spiral.kt @@ -1,11 +1,9 @@ package net.trivernis.chunkmaster.lib.shapes -import kotlin.math.PI import kotlin.math.abs import kotlin.math.pow -import kotlin.math.sqrt -class Spiral(center: Pair, start: Pair, radius: Int): Shape(center, start, radius) { +class Spiral(center: Pair, start: Pair, radius: Int) : Shape(center, start, radius) { private var direction = 0 override fun endReached(): Boolean { @@ -44,20 +42,20 @@ class Spiral(center: Pair, start: Pair, radius: Int): Shape( count = simSpiral.count } if (count == 1) { // because of the center behaviour - count ++ + count++ return currentPos } if (currentPos == center) { // the center has to be handled exclusively currentPos = Pair(center.first, center.second + 1) - count ++ + count++ return center } else { val distances = getDistances(center, currentPos) if (abs(distances.first) == abs(distances.second)) { - direction = (direction + 1)%5 - } + direction = (direction + 1) % 5 } - when(direction) { + } + when (direction) { 0 -> { currentPos = Pair(currentPos.first + 1, currentPos.second) } @@ -75,7 +73,7 @@ class Spiral(center: Pair, start: Pair, radius: Int): Shape( direction = 0 } } - count ++ + count++ return currentPos } diff --git a/src/main/resources/i18n/zh.i18n.properties b/src/main/resources/i18n/zh.i18n.properties index 18a6d97..17fa4a0 100644 --- a/src/main/resources/i18n/zh.i18n.properties +++ b/src/main/resources/i18n/zh.i18n.properties @@ -1,11 +1,12 @@ RESUME_FOR_WORLD = 正在恢复执行 '%s' 世界的区块生成任务... TASK_FINISHED = 任务 #%d 在生成 %d 个区块后完成. -TASK_CANCELED = 已取消任务 #%s. +TASK_CANCELLED = 已取消任务 #%s. TASK_LOAD_FAILED = §c加载任务 #%d 失败. TASK_LOAD_SUCCESS = %d 个已保存的任务加载完成. TASK_NOT_FOUND = §c任务 %s 未找到! CREATE_DELAYED_LOAD = 正在创建延迟执行的区块生成任务... -TASK_PERIODIC_REPORT = 任务 #%d 正在 '%s' 世界执行. 进度: %d 区块 %s %s, 速度: %.1f 区块 / 秒, 最新生成的区块: %d, %d +TASK_PERIODIC_REPORT = 任务 #%d 正在 '%s' 世界执行. 状态: %s. 进度: %d 区块 %s %s, 速度: %.1f 区块 / 秒, 最新生成的区块: %d, %d +TASK_PERIODIC_REPORT_CORRECTING = 任务 #%d 正在为世界 '%s' 生成缺失的区块. 进度: %d 区块 %s TASK_SAVE_FAILED = §c保存任务时发生错误: %s WORLD_NAME_REQUIRED = §c你需要提供世界名称! @@ -18,7 +19,7 @@ TASK_ID_REQUIRED = §c你需要提供任务 ID! INVALID_ARGUMENT = §c在 %s: %s 存在无效的变量! PAUSED_TASKS_HEADER = 当前暂停的区块生成任务 -TASKS_ENTRY = - §9#%d§r - §2%s§r - §2%d 区块 %s§r +TASKS_ENTRY = - §9#%d§r - §2%s§r - §2%s§r - §2%s 区块 %s§r RUNNING_TASKS_HEADER = 当前运行的区块生成任务 NO_GENERATION_TASKS = 无区块生成任务. @@ -44,7 +45,7 @@ DB_INIT_FINISHED = 数据库初始化完成. DB_INIT_EROR = 初始化数据库时发生错误: %s. DATABASE_CONNECTION_ERROR = §c连接数据库失败! -SQL_ERROR = §cSQL %s 发生错误! +SQL_ERROR = §cSQL 发生错误: %s ! NO_DATABASE_CONNECTION = §c无法执行 SQL 语句: 无数据库连接. CREATE_TABLE_DEFINITION = 已创建表 %s ,定义 %s. TABLE_CREATE_ERROR = §c创建表 %s 失败. @@ -73,3 +74,7 @@ STATS_WORLD_NAME = §l%s§r STATS_ENTITY_COUNT = - §2%d§r 实体 STATS_LOADED_CHUNKS = - §2%d§r 已载入区块 STATS_PLUGIN_LOADED_CHUNKS = - §2%d§r 被 Chunk Master 载入的区块 + +SAVING_CHUNKS = 正在保存 %d 已载入的区块... +CANCEL_FAIL = 取消任务 #%d 操作超时! +NO_AUTOSTART = 自动启动被设置为 §2关闭§r. 正在暂停... diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 640c698..32868aa 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ main: net.trivernis.chunkmaster.Chunkmaster name: Chunkmaster -version: '1.3.0' +version: '1.3.1' description: Automated world pregeneration. author: Trivernis website: trivernis.net