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 fun getSize(variant: Int): Vector fun validate(location: Location): Boolean fun create(location: Location, variant: Int): Building }