64 lines
2.4 KiB
Kotlin
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
|
|
} |