diff --git a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt index 2d63c0d..cf85f5e 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/commands/CmdGenerate.kt @@ -55,30 +55,28 @@ class CmdGenerate(private val chunkmaster: Chunkmaster): Subcommand { if (args.size > 1) { if (args[1].toIntOrNull() != null) { stopAfter = args[1].toInt() - } else if (args[1] in units) { - when (args[1]) { - "radius" -> { - stopAfter = ((stopAfter * 2)+1).toDouble().pow(2.0).toInt() - } - "diameter" -> { - stopAfter = stopAfter.toDouble().pow(2.0).toInt() - } - "blockradius" -> { - stopAfter = ((stopAfter*32)+1).toDouble().pow(2.0).toInt() - } - } + } else if (args[1] in units && args[0].toIntOrNull() != null) { + stopAfter = getStopAfter(stopAfter, args[1]) } else { worldName = args[1] } } + if (args.size > 2 && args[2] in units && args[1].toIntOrNull() != null) { + stopAfter = getStopAfter(stopAfter, args[2]) + } } else { worldName = sender.world.name } } else { if (args.isNotEmpty()) { worldName = args[0] - if (args.size > 1 && args[1].toIntOrNull() != null) { - stopAfter = args[1].toInt() + if (args.size > 1) { + if (args[1].toIntOrNull() != null) { + stopAfter = args[1].toInt() + } + } + if (args.size > 2 && args[2] in units) { + stopAfter = getStopAfter(stopAfter, args[2]) } } else { sender.spigot().sendMessage( @@ -89,6 +87,27 @@ class CmdGenerate(private val chunkmaster: Chunkmaster): Subcommand { return createTask(sender, worldName, stopAfter) } + /** + * Returns stopAfter for a given unit + */ + private fun getStopAfter(number: Int, unit: String): Int { + if (unit in units) { + return when (unit) { + "radius" -> { + ((number * 2)+1).toDouble().pow(2.0).toInt() + } + "diameter" -> { + number.toDouble().pow(2.0).toInt() + } + "blockradius" -> { + ((number*32)+1).toDouble().pow(2.0).toInt() + } + else -> number + } + } + return number + } + /** * Creates the task with the given arguments. */ 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 27c9057..48d61ce 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationManager.kt @@ -226,8 +226,9 @@ class GenerationManager(private val chunkmaster: Chunkmaster, private val server chunkmaster.logger.info( """Task #${task.id} running for "${genTask.world.name}". |Progress ${task.generationTask.count} chunks - |${if (task.generationTask.stopAfter > 0) "(${(task.generationTask.count.toDouble() / - task.generationTask.stopAfter.toDouble()) * 100}%)" else ""}. + |${if (task.generationTask.stopAfter > 0) "(${"%.2f".format((task.generationTask.count.toDouble() / + task.generationTask.stopAfter.toDouble()) * 100)}%)" else ""}. + | Speed: ${"%.1f".format(task.generationSpeed)} chunks/sec, |Last Chunk: ${genTask.lastChunk.x}, ${genTask.lastChunk.z}""".trimMargin("|").replace('\n', ' ') ) val updateStatement = chunkmaster.sqliteConnection.prepareStatement( 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 34a1d92..6aa5e63 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTask.kt @@ -20,7 +20,7 @@ abstract class GenerationTask(plugin: Chunkmaster, centerChunk: ChunkCoordinates Spiral(Pair(centerChunk.x, centerChunk.z), Pair(startChunk.x, startChunk.z)) protected val loadedChunks: HashSet = HashSet() protected var lastChunkCoords = ChunkCoordinates(startChunk.x, startChunk.z) - protected val chunkSkips = plugin.config.getInt("generation.chunks-skips-per-step") + protected val chunkSkips = plugin.config.getInt("generation.chunk-skips-per-step") protected val msptThreshold = plugin.config.getLong("generation.mspt-pause-threshold") protected val maxLoadedChunks = plugin.config.getInt("generation.max-loaded-chunks") protected val chunksPerStep = plugin.config.getInt("generation.chunks-per-step") diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt index cab9a02..6ef2dab 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/GenerationTaskSpigot.kt @@ -37,15 +37,18 @@ class GenerationTaskSpigot( return } - var chunk = lastChunkCoords + var chunk = nextChunkCoordinates if (!world.isChunkGenerated(chunk.x, chunk.z)) { - for (i in 0 until minOf(chunksPerStep, (stopAfter - count) - 1)) { - chunk = nextChunkCoordinates + for (i in 0 until minOf(chunksPerStep, stopAfter - count)) { val chunkInstance = world.getChunkAt(chunk.x, chunk.z) chunkInstance.load(true) loadedChunks.add(chunkInstance) + chunk = nextChunkCoordinates } + val chunkInstance = world.getChunkAt(chunk.x, chunk.z) + chunkInstance.load(true) + loadedChunks.add(chunkInstance) } lastChunkCoords = chunk count = spiral.count // set the count to the more accurate spiral count diff --git a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/RunningTaskEntry.kt b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/RunningTaskEntry.kt index a53d89a..cc4c294 100644 --- a/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/RunningTaskEntry.kt +++ b/src/main/kotlin/net/trivernis/chunkmaster/lib/generation/RunningTaskEntry.kt @@ -7,6 +7,29 @@ class RunningTaskEntry( val task: BukkitTask, override val generationTask: GenerationTask ) : TaskEntry { + + private var lastProgress: Pair? = null + + /** + * Returns the generation Speed + */ + val generationSpeed: Double? + get() { + var generationSpeed: Double? = null + if (lastProgress != null) { + val chunkDiff = generationTask.count - lastProgress!!.second + val timeDiff = (System.currentTimeMillis() - lastProgress!!.first).toDouble()/1000 + generationSpeed = chunkDiff.toDouble()/timeDiff + } + lastProgress = Pair(System.currentTimeMillis(), generationTask.count) + return generationSpeed + } + + init { + lastProgress = Pair(System.currentTimeMillis(), generationTask.count) + } + + override fun cancel() { task.cancel() generationTask.cancel()