diff options
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Interactable.kt')
-rw-r--r-- | src/main/kotlin/io/dico/parcels2/Interactable.kt | 92 |
1 files changed, 75 insertions, 17 deletions
diff --git a/src/main/kotlin/io/dico/parcels2/Interactable.kt b/src/main/kotlin/io/dico/parcels2/Interactable.kt index f1beac5..60539aa 100644 --- a/src/main/kotlin/io/dico/parcels2/Interactable.kt +++ b/src/main/kotlin/io/dico/parcels2/Interactable.kt @@ -1,14 +1,17 @@ package io.dico.parcels2 -import io.dico.parcels2.util.ext.findWoodKindPrefixedMaterials +import io.dico.parcels2.util.ext.getMaterialsWithWoodTypePrefix import org.bukkit.Material +import java.lang.IllegalArgumentException import java.util.EnumMap class Interactables -private constructor(val id: Int, - val name: String, - val interactableByDefault: Boolean, - vararg val materials: Material) { +private constructor( + val id: Int, + val name: String, + val interactableByDefault: Boolean, + vararg val materials: Material +) { companion object { val classesById: List<Interactables> @@ -22,35 +25,64 @@ private constructor(val id: Int, listedMaterials = EnumMap(mapOf(*array.flatMap { clazz -> clazz.materials.map { it to clazz.id } }.toTypedArray())) } + operator fun get(material: Material): Interactables? { + val id = listedMaterials[material] ?: return null + return classesById[id] + } + + operator fun get(name: String): Interactables { + return classesByName[name] ?: throw IllegalArgumentException("Interactables class does not exist: $name") + } + + operator fun get(id: Int): Interactables { + return classesById[id] + } + private fun getClassesArray() = run { var id = 0 @Suppress("UNUSED_CHANGED_VALUE") arrayOf( - Interactables(id++, "button", true, + Interactables( + id++, "buttons", true, Material.STONE_BUTTON, - *findWoodKindPrefixedMaterials("BUTTON") + *getMaterialsWithWoodTypePrefix("BUTTON") ), - Interactables(id++, "lever", true, - Material.LEVER), + Interactables( + id++, "levers", true, + Material.LEVER + ), - Interactables(id++, "pressure_plate", true, + Interactables( + id++, "pressure_plates", true, Material.STONE_PRESSURE_PLATE, - *findWoodKindPrefixedMaterials("PRESSURE_PLATE"), + *getMaterialsWithWoodTypePrefix("PRESSURE_PLATE"), Material.HEAVY_WEIGHTED_PRESSURE_PLATE, - Material.LIGHT_WEIGHTED_PRESSURE_PLATE), + Material.LIGHT_WEIGHTED_PRESSURE_PLATE + ), - Interactables(id++, "redstone_components", false, + Interactables( + id++, "redstone", false, Material.COMPARATOR, - Material.REPEATER), + Material.REPEATER + ), - Interactables(id++, "containers", false, + Interactables( + id++, "containers", false, Material.CHEST, Material.TRAPPED_CHEST, Material.DISPENSER, Material.DROPPER, Material.HOPPER, - Material.FURNACE) + Material.FURNACE + ), + + Interactables( + id++, "gates", true, + *getMaterialsWithWoodTypePrefix("DOOR"), + *getMaterialsWithWoodTypePrefix("TRAPDOOR"), + *getMaterialsWithWoodTypePrefix("FENCE_GATE") + ) ) } @@ -58,6 +90,27 @@ private constructor(val id: Int, } +val Parcel?.effectiveInteractableConfig: InteractableConfiguration + get() = this?.interactableConfig ?: pathInteractableConfig + +val pathInteractableConfig: InteractableConfiguration = run { + val data = BitmaskInteractableConfiguration().apply { + Interactables.classesById.forEach { + setInteractable(it, false) + } + } + object : InteractableConfiguration by data { + override fun setInteractable(clazz: Interactables, interactable: Boolean) = + throw IllegalStateException("pathInteractableConfig is immutable") + + override fun clear() = + throw IllegalStateException("pathInteractableConfig is immutable") + + override fun copyFrom(other: InteractableConfiguration) = + throw IllegalStateException("pathInteractableConfig is immutable") + } +} + interface InteractableConfiguration { val interactableClasses: List<Interactables> get() = Interactables.classesById.filter { isInteractable(it) } fun isInteractable(material: Material): Boolean @@ -67,8 +120,13 @@ interface InteractableConfiguration { fun copyFrom(other: InteractableConfiguration) { Interactables.classesById.forEach { setInteractable(it, other.isInteractable(it)) } } + + operator fun invoke(material: Material) = isInteractable(material) + operator fun invoke(className: String) = isInteractable(Interactables[className]) } +fun InteractableConfiguration.isInteractable(clazz: Interactables?) = clazz != null && isInteractable(clazz) + class BitmaskInteractableConfiguration : InteractableConfiguration { val bitmaskArray = IntArray((Interactables.classesById.size + 31) / 32) @@ -98,7 +156,7 @@ class BitmaskInteractableConfiguration : InteractableConfiguration { override fun clear(): Boolean { var change = false for (i in bitmaskArray.indices) { - change = change || bitmaskArray[i] != 0 + if (!change && bitmaskArray[i] != 0) change = true bitmaskArray[i] = 0 } return change |