DArena/src/main/kotlin/nl/kallestruik/darena/DArena.kt

175 lines
6.3 KiB
Kotlin

package nl.kallestruik.darena
import co.aikar.commands.BukkitCommandExecutionContext
import co.aikar.commands.InvalidCommandArgument
import co.aikar.commands.MessageType
import co.aikar.commands.PaperCommandManager
import nl.kallestruik.darena.arenas.Arena
import nl.kallestruik.darena.commands.CommandDArena
import nl.kallestruik.darena.exceptions.TeamNotFoundException
import nl.kallestruik.darena.listeners.*
import nl.kallestruik.darena.managers.*
import nl.kallestruik.darena.types.Reloadable
import nl.kallestruik.darena.types.Team
import org.bukkit.ChatColor
import org.bukkit.plugin.java.JavaPlugin
import java.io.File
//TODO: Add documentation on a wiki page or something for this whole thing.
class DArena: JavaPlugin() {
private lateinit var commandManager: PaperCommandManager
private lateinit var configManager: ConfigManager
private lateinit var pointsManager: PointsManager
private lateinit var teamManager: TeamManager
private lateinit var arenaManager: ArenaManager
private lateinit var editManager: EditManager
private lateinit var gameManager: GameManager
private lateinit var reloadable: Map<String, Reloadable>
override fun onEnable() {
commandManager = PaperCommandManager(this)
commandManager.enableUnstableAPI("help")
commandManager.enableUnstableAPI("brigadier")
configManager = ConfigManager(File(dataFolder, "config.yml"))
configManager.load()
teamManager = TeamManager(File(dataFolder, "teams.yml"))
teamManager.load()
pointsManager = PointsManager(teamManager, File(dataFolder, "points.yml"))
pointsManager.load()
arenaManager = ArenaManager(teamManager, pointsManager, configManager, this, File(dataFolder, "arenas"), File(dataFolder, "arena.schema.json"))
arenaManager.loadArenas()
editManager = EditManager(arenaManager, this)
arenaManager.editManager = editManager
gameManager = GameManager(arenaManager, File(dataFolder, "games.yml"))
gameManager.load()
reloadable = mapOf(
Pair("arenas", arenaManager),
Pair("config", configManager),
Pair("games", gameManager),
)
setupCommandContexts()
setupCommandCompletions()
setupACFFormatting()
commandManager.registerCommand(CommandDArena(arenaManager, editManager, pointsManager, teamManager, gameManager))
server.pluginManager.registerEvents(CheckpointListener(arenaManager), this)
server.pluginManager.registerEvents(TeamListener(teamManager), this)
server.pluginManager.registerEvents(KillListener(arenaManager), this)
server.pluginManager.registerEvents(FireballListener(arenaManager, configManager), this)
server.pluginManager.registerEvents(FallListener(arenaManager), this)
server.pluginManager.registerEvents(BorderListener(arenaManager), this)
server.pluginManager.registerEvents(BuildRestrictionListener(arenaManager), this)
server.pluginManager.registerEvents(SectionListener(arenaManager), this)
server.pluginManager.registerEvents(CheckpointSoundListener(arenaManager), this)
server.pluginManager.registerEvents(CheckpointMessageListener(arenaManager), this)
server.pluginManager.registerEvents(GrapplingHookListener(arenaManager), this)
server.pluginManager.registerEvents(EditListener(editManager, this), this)
}
override fun onDisable() {
teamManager.save()
pointsManager.save()
}
//TODO: Move this to a more suitable location
private fun setupACFFormatting() {
commandManager.setFormat(
MessageType.INFO,
ChatColor.GRAY,
ChatColor.YELLOW,
ChatColor.RED
)
commandManager.setFormat(
MessageType.SYNTAX,
ChatColor.YELLOW,
ChatColor.GREEN,
ChatColor.WHITE
)
commandManager.setFormat(
MessageType.ERROR,
ChatColor.RED,
ChatColor.DARK_GREEN,
ChatColor.GREEN
)
commandManager.setFormat(
MessageType.HELP,
ChatColor.YELLOW,
ChatColor.AQUA,
ChatColor.GRAY
)
}
//TODO: Move this to a more suitable location
private fun setupCommandContexts() {
commandManager.commandContexts.registerContext(
Arena::class.java
) { context: BukkitCommandExecutionContext ->
return@registerContext arenaManager.getArena(context.popFirstArg())
?: throw InvalidCommandArgument("Arena does not exist!")
}
commandManager.commandContexts.registerContext(
Team::class.java
) { context: BukkitCommandExecutionContext ->
try {
return@registerContext teamManager.getTeamByName(context.popFirstArg())
} catch (e: TeamNotFoundException) {
throw InvalidCommandArgument("Arena does not exist!")
}
}
commandManager.commandContexts.registerContext(
Reloadable::class.java
) { context: BukkitCommandExecutionContext ->
return@registerContext reloadable[context.popFirstArg()]
?: throw InvalidCommandArgument("That is not a reloadable component!")
}
}
//TODO: Move this to a more suitable location
private fun setupCommandCompletions() {
// Arena
commandManager.commandCompletions.registerAsyncCompletion("arena") {
arenaManager.getAllArenaNames()
}
commandManager.commandCompletions.setDefaultCompletion("arena", Arena::class.java)
// Team
commandManager.commandCompletions.registerAsyncCompletion("team") {
teamManager.getAllTeamNames()
}
commandManager.commandCompletions.setDefaultCompletion("team", Team::class.java)
// teamOptions
commandManager.commandCompletions.registerCompletion("teamOptions") {
listOf(
"color",
"prefix"
)
}
// Reloadable
commandManager.commandCompletions.registerAsyncCompletion("reloadable") {
reloadable.keys
}
commandManager.commandCompletions.setDefaultCompletion("reloadable", Reloadable::class.java)
}
}