You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spigot-chunkmaster/src/main/kotlin/net/trivernis/chunkmaster/Chunkmaster.kt

119 lines
4.2 KiB
Kotlin

package net.trivernis.chunkmaster
import io.papermc.lib.PaperLib
import net.trivernis.chunkmaster.commands.CommandChunkmaster
import net.trivernis.chunkmaster.lib.LanguageManager
import net.trivernis.chunkmaster.lib.database.SqliteManager
import net.trivernis.chunkmaster.lib.generation.GenerationManager
import org.bstats.bukkit.Metrics
import org.bukkit.plugin.java.JavaPlugin
import org.bukkit.scheduler.BukkitTask
import org.dynmap.DynmapAPI
import java.lang.IllegalStateException
open class Chunkmaster : JavaPlugin() {
lateinit var sqliteManager: SqliteManager
lateinit var generationManager: GenerationManager
lateinit var langManager: LanguageManager
private lateinit var tpsTask: BukkitTask
var dynmapApi: DynmapAPI? = null
private set
var mspt = 20 // keep track of the milliseconds per tick
private set
/**
* On enable of the plugin
*/
override fun onEnable() {
PaperLib.suggestPaper(this)
logger.fine("LogLevel: FINE")
logger.finer("LogLevel: FINER")
logger.finest("LogLevel: FINEST")
configure()
Metrics(this)
langManager = LanguageManager(this)
langManager.loadProperties()
this.dynmapApi = getDynmap()
initDatabase()
generationManager = GenerationManager(this, server)
generationManager.init()
getCommand("chunkmaster")?.aliases = mutableListOf("chm", "chunkm", "cmaster")
getCommand("chunkmaster")?.setExecutor(CommandChunkmaster(this, server))
server.pluginManager.registerEvents(ChunkmasterEvents(this, server), this)
if (PaperLib.isPaper() && PaperLib.getMinecraftPatchVersion() >= 225) {
tpsTask = server.scheduler.runTaskTimer(this, Runnable {
mspt = 1000 / server.currentTick // use papers exposed tick rather than calculating it
}, 1, 300)
} else {
tpsTask = server.scheduler.runTaskTimer(this, Runnable {
val start = System.currentTimeMillis()
server.scheduler.runTaskLater(this, Runnable {
mspt = (System.currentTimeMillis() - start).toInt()
}, 1)
}, 1, 300)
}
}
/**
* Stop all tasks and close database connection on disable
*/
override fun onDisable() {
logger.info(langManager.getLocalized("STOPPING_ALL_TASKS"))
generationManager.stopAll()
server.scheduler.cancelTasks(this)
}
/**
* Cofigure the config file
*/
private fun configure() {
dataFolder.mkdir()
config.addDefault("generation.mspt-pause-threshold", 500L)
config.addDefault("generation.pause-on-player-count", 1)
config.addDefault("generation.max-pending-chunks", 500)
config.addDefault("generation.max-loaded-chunks", 1000)
config.addDefault("generation.unloading-period", 50L)
config.addDefault("generation.ignore-worldborder", false)
config.addDefault("generation.autostart", true)
config.addDefault("database.filename", "chunkmaster.db")
config.addDefault("language", "en")
config.addDefault("dynmap", true)
config.options().copyDefaults(true)
saveConfig()
}
/**
* Initializes the database
*/
private fun initDatabase() {
logger.info(langManager.getLocalized("DB_INIT"))
try {
this.sqliteManager = SqliteManager(this)
sqliteManager.init()
logger.info(langManager.getLocalized("DB_INIT_FINISHED"))
} catch (e: Exception) {
logger.warning(langManager.getLocalized("DB_INIT_EROR", e.message!!))
}
}
private fun getDynmap(): DynmapAPI? {
return try {
val dynmap = server.pluginManager.getPlugin("dynmap")
if (dynmap != null && dynmap is DynmapAPI) {
logger.info(langManager.getLocalized("PLUGIN_DETECTED", "dynmap", dynmap.dynmapVersion))
dynmap
} else {
null
}
} catch (e: IllegalStateException) {
null
}
}
}