Files
KSpigot/src/main/kotlin/net/axay/kspigot/structures/Structure.kt
2020-09-12 22:19:29 +02:00

85 lines
2.0 KiB
Kotlin

package net.axay.kspigot.structures
import net.axay.kspigot.annotations.NMS_General
import net.axay.kspigot.data.NBTData
import net.axay.kspigot.data.nbtData
import net.axay.kspigot.extensions.bukkit.spawnCleanEntity
import net.axay.kspigot.extensions.geometry.SimpleLocation3D
import net.axay.kspigot.particles.KSpigotParticle
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.block.Block
import org.bukkit.block.data.BlockData
import org.bukkit.entity.Entity
import org.bukkit.entity.EntityType
interface StructureData {
fun createAt(loc: Location)
}
class SingleStructureData(
val location: SimpleLocation3D,
val structureData: StructureData
)
data class Structure(
val structureData: Set<SingleStructureData>
) {
constructor(vararg structureDataSets: Set<SingleStructureData>)
: this(structureDataSets.flatMapTo(HashSet()) { it })
}
/*
* Structure data implementations.
*/
data class StructureDataMaterial(
val material: Material
) : StructureData {
override fun createAt(loc: Location) {
loc.block.type = material
}
}
data class StructureDataBlock(
val material: Material,
val blockData: BlockData
) : StructureData {
constructor(block: Block) : this(block.type, block.blockData)
override fun createAt(loc: Location) {
loc.block.let {
it.type = material
it.blockData = blockData
}
}
}
@NMS_General
data class StructureDataEntity(
val entityType: EntityType,
val nbtData: NBTData
) : StructureData {
constructor(entity: Entity) : this(entity.type, entity.nbtData)
constructor(entityType: EntityType) : this(entityType, NBTData())
override fun createAt(loc: Location) {
loc.spawnCleanEntity(entityType)?.nbtData = nbtData
}
}
data class StructureDataParticle(
val particle: KSpigotParticle
) : StructureData {
override fun createAt(loc: Location) {
particle.spawnAt(loc)
}
}