summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/Interactable.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/io/dico/parcels2/Interactable.kt')
-rw-r--r--src/main/kotlin/io/dico/parcels2/Interactable.kt92
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