ZoneGuard.kt

Branches > main > be9c7ea > files / src / main / kotlin / net / bowmap / handlers / ZoneGuard.kt

package net.bowmap.handlers

import net.bowmap.stormbow.handler
import net.bowmap.stormbow.fact.*
import net.bowmap.stormbow.effect.*

import org.bukkit.event.Listener
import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.EventHandler
import org.bukkit.block.Block
import org.bukkit.Bukkit
import org.bukkit.Location

data class Region(val from: Location, val to: Location) {
  init {
    require(from.world == to.world) {
      "Regions can only exist in a single world"
    }
  }
}

// TODO hmm...
// Would prefer if I didn't have to just rely on this
val spawnWorld = Bukkit.getWorld("world")!!
val spawn = Region(Location(spawnWorld, 5.0, spawnWorld.minHeight.toDouble(), -5.0), Location(spawnWorld, -5.0, spawnWorld.maxHeight - 1.0, 5.0))

fun isInsideRegion(region: Region, location: Location): Boolean {
    if (location.world != region.from.world) return false

    val minX = minOf(region.from.blockX, region.to.blockX)
    val maxX = maxOf(region.from.blockX, region.to.blockX)

    val minY = minOf(region.from.blockY, region.to.blockY)
    val maxY = maxOf(region.from.blockY, region.to.blockY)

    val minZ = minOf(region.from.blockZ, region.to.blockZ)
    val maxZ = maxOf(region.from.blockZ, region.to.blockZ)

    return location.blockX in minX..maxX &&
           location.blockY in minY..maxY &&
           location.blockZ in minZ..maxZ
}

fun isBlockInSpawn(b: Block): Boolean {
  return isInsideRegion(spawn, b.location)
}

object ZoneGuard {
  fun register() {
    handler<PlayerBrokeBlock> {
      if (isBlockInSpawn(block)) {
        effects(Cancel())
      } else {
        effects()
      }
    }
  }
}