Files
AOP/src/main/kotlin/com/pobnellion/aoe/building/Building.kt
2025-01-12 21:32:12 +13:00

64 lines
2.4 KiB
Kotlin

package com.pobnellion.aoe.building
import com.pobnellion.aoe.Aoe
import com.pobnellion.aoe.entity.goals.EntityWorkTarget
import com.sk89q.worldedit.WorldEdit
import com.sk89q.worldedit.bukkit.BukkitAdapter
import com.sk89q.worldedit.extent.clipboard.Clipboard
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats
import com.sk89q.worldedit.function.operation.Operation
import com.sk89q.worldedit.function.operation.Operations
import com.sk89q.worldedit.math.BlockVector3
import com.sk89q.worldedit.session.ClipboardHolder
import org.bukkit.Location
import org.bukkit.util.Vector
import java.io.File
import java.io.FileInputStream
abstract class Building(val location: Location, val variant: Int): EntityWorkTarget {
override var currentProgressPercent: Float = 0f
override fun isComplete(): Boolean = currentProgressPercent >= 1.0f
override fun addProgress(amount: Float) {}
override fun setProgress(amount: Float) {}
override fun removeProgress(amount: Float) {}
override fun onComplete() {}
var sizeX: Int
var sizeZ: Int
fun center(): Location = location.clone().add(sizeX / 2.0, 0.0, sizeZ / 2.0)
private val clipboard: Clipboard
abstract var populationCapacity: Int
abstract fun getSchematicName(variant: Int): String
init {
val file: File = Aoe.getSchematicFile(this.getSchematicName(variant))
val format = ClipboardFormats.findByFile(file)
format!!.getReader(FileInputStream(file)).use { reader ->
clipboard = reader.read()
}
sizeX = clipboard.maximumPoint.x() - clipboard.minimumPoint.x()
sizeZ = clipboard.maximumPoint.z() - clipboard.minimumPoint.z()
}
fun placeFull() {
currentProgressPercent = 1f
val offset = clipboard.region.minimumPoint.subtract(clipboard.origin)
WorldEdit.getInstance().newEditSession(BukkitAdapter.adapt(location.world)).use { editSession ->
val operation: Operation = ClipboardHolder(clipboard)
.createPaste(editSession)
.to(BlockVector3.at(location.x, location.y, location.z).subtract(offset))
.build()
Operations.complete(operation)
}
}
}
interface BuildingInfo {
val buildingType: BuildingType
val schematicNames: List<String>
fun getSize(variant: Int): Vector
fun validate(location: Location): Boolean
fun create(location: Location, variant: Int): Building
}