countdown timer

var countdown = 3
var countdownTaskId = 0

@Katton.command(name = "startcountdown", permission = "admin")
function startCountdown(sender, args) {
    countdown = 3

    countdownTaskId = Katton.every(1.seconds) {
        for (player in Katton.players.all()) {
            player.sendTitle("&e" + countdown, "")
        }

        countdown = countdown - 1

        if (countdown < 0) {
            Katton.cancel(countdownTaskId)
        }
    }
}

showing "3, 2, 1, GO!" instead of "3, 2, 1, ..."

the version above will show 3, 2, 1, 0, and then stop (the cancel happens the tick after 0 is shown, so 0 still gets displayed). if you want a "GO!" message instead of showing 0 then do this:

var countdown = 3
var countdownTaskId = 0

@Katton.command(name = "startcountdown", permission = "admin")
function startCountdown(sender, args) {
    countdown = 3

    countdownTaskId = Katton.every(1.seconds) {
        if (countdown > 0) {
            for (player in Katton.players.all()) {
                player.sendTitle("&e" + countdown, "")
            }
            countdown = countdown - 1
        } else {
            for (player in Katton.players.all()) {
                player.sendTitle("&aGO!", "")
            }
            Katton.cancel(countdownTaskId)
        }
    }
}

adding a "stop early" command

since countdownTaskId is a top level var, any other function in the same script can reach it too so youcan include a manual stop command:

@Katton.command(name = "stopcountdown", permission = "admin")
function stopCountdown(sender, args) {
    Katton.cancel(countdownTaskId)
    sender.sendMessage("&ccountdown stopped early")
}

preventing a second countdown from starting while one is running

just like the colorswitch example, add a running flag:

var countdown = 3
var countdownTaskId = 0
var countdownRunning = false

@Katton.command(name = "startcountdown", permission = "admin")
function startCountdown(sender, args) {
    if (countdownRunning) {
        sender.sendMessage("&ea countdown is already running")
        return
    }

    countdownRunning = true
    countdown = 3

    countdownTaskId = Katton.every(1.seconds) {
        if (countdown > 0) {
            for (player in Katton.players.all()) {
                player.sendTitle("&e" + countdown, "")
            }
            countdown = countdown - 1
        } else {
            for (player in Katton.players.all()) {
                player.sendTitle("&aGO!", "")
            }
            countdownRunning = false
            Katton.cancel(countdownTaskId)
        }
    }
}

@Katton.command(name = "stopcountdown", permission = "admin")
function stopCountdown(sender, args) {
    countdownRunning = false
    Katton.cancel(countdownTaskId)
    sender.sendMessage("&ccountdown stopped early")
}