93 lines
3.4 KiB
Kotlin
93 lines
3.4 KiB
Kotlin
package io.dico.parcels2.command
|
|
|
|
import io.dico.dicore.command.CommandException
|
|
import io.dico.dicore.command.ExecutionContext
|
|
import io.dico.dicore.command.annotation.Cmd
|
|
import io.dico.dicore.command.annotation.Desc
|
|
import io.dico.dicore.command.annotation.RequireParameters
|
|
import io.dico.parcels2.ParcelOwner
|
|
import io.dico.parcels2.ParcelsPlugin
|
|
import io.dico.parcels2.storage.getParcelBySerializedValue
|
|
import io.dico.parcels2.util.hasParcelHomeOthers
|
|
import io.dico.parcels2.util.parcelLimit
|
|
import io.dico.parcels2.util.uuid
|
|
import org.bukkit.entity.Player
|
|
|
|
@Suppress("unused")
|
|
class ParcelCommands(override val plugin: ParcelsPlugin) : HasWorlds, HasPlugin {
|
|
override val worlds = plugin.worlds
|
|
|
|
private fun error(message: String): Nothing {
|
|
throw CommandException(message)
|
|
}
|
|
|
|
@Cmd("auto")
|
|
@Desc("Finds the unclaimed parcel nearest to origin,",
|
|
"and gives it to you",
|
|
shortVersion = "sets you up with a fresh, unclaimed parcel")
|
|
fun cmdAuto(player: Player, context: ExecutionContext) = requireInWorld(player) {
|
|
delegateCommandAsync(context) {
|
|
val numOwnedParcels = plugin.storage.getNumParcels(ParcelOwner(uuid = player.uuid)).await()
|
|
|
|
awaitSynchronousTask {
|
|
val limit = player.parcelLimit
|
|
|
|
if (numOwnedParcels >= limit) {
|
|
error("You have enough plots for now")
|
|
}
|
|
|
|
val parcel = world.nextEmptyParcel()
|
|
?: error("This world is full, please ask an admin to upsize it")
|
|
parcel.owner = ParcelOwner(uuid = player.uuid)
|
|
player.teleport(parcel.homeLocation)
|
|
"Enjoy your new parcel!"
|
|
}
|
|
}
|
|
}
|
|
|
|
@Cmd("info", aliases = ["i"])
|
|
@Desc("Displays general information",
|
|
"about the parcel you're on",
|
|
shortVersion = "displays information about this parcel")
|
|
fun cmdInfo(player: Player) = requireInParcel(player) { parcel.infoString }
|
|
|
|
@Cmd("home", aliases = ["h"])
|
|
@Desc("Teleports you to your parcels,",
|
|
"unless another player was specified.",
|
|
"You can specify an index number if you have",
|
|
"more than one parcel",
|
|
shortVersion = "teleports you to parcels")
|
|
@RequireParameters(0)
|
|
fun cmdHome(player: Player, context: ExecutionContext, target: NamedParcelTarget) {
|
|
if (player !== target.player && !player.hasParcelHomeOthers) {
|
|
error("You do not have permission to teleport to other people's parcels")
|
|
}
|
|
|
|
return delegateCommandAsync(context) {
|
|
val ownedParcelsResult = plugin.storage.getOwnedParcels(ParcelOwner(uuid = target.player.uuid)).await()
|
|
awaitSynchronousTask {
|
|
val uuid = target.player.uuid
|
|
val ownedParcels = ownedParcelsResult
|
|
.map { worlds.getParcelBySerializedValue(it) }
|
|
.filter { it != null && it.world == target.world && it.owner?.uuid == uuid }
|
|
|
|
val targetMatch = ownedParcels.getOrNull(target.index)
|
|
?: error("The specified parcel could not be matched")
|
|
|
|
player.teleport(targetMatch.homeLocation)
|
|
""
|
|
}
|
|
}
|
|
}
|
|
|
|
@Cmd("claim")
|
|
@Desc("If this parcel is unowned, makes you the owner",
|
|
shortVersion = "claims this parcel")
|
|
fun cmdClaim(player: Player) {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} |