diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7a8be859..d421e73b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -gearyPaper = "0.30.0" +gearyPaper = "0.30.1-dev.5" [libraries] geary-papermc = { module = "com.mineinabyss:geary-papermc", version.ref = "gearyPaper" } diff --git a/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/SpawnRegistry.kt b/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/SpawnRegistry.kt index db280c0c..23fba7a9 100644 --- a/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/SpawnRegistry.kt +++ b/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/SpawnRegistry.kt @@ -4,9 +4,8 @@ import com.mineinabyss.geary.datatypes.GearyEntity import com.mineinabyss.geary.modules.geary import com.mineinabyss.geary.prefabs.prefabs import com.mineinabyss.geary.systems.builders.cachedQuery -import com.mineinabyss.geary.systems.builders.listener import com.mineinabyss.geary.systems.query.GearyQuery -import com.mineinabyss.geary.systems.query.ListenerQuery +import com.mineinabyss.geary.systems.query.Query import com.sk89q.worldguard.WorldGuard import com.sk89q.worldguard.protection.regions.ProtectedRegion @@ -18,33 +17,42 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion class SpawnRegistry { private val prefabLoader get() = prefabs.loader + private val spawnsWithWGRegion = geary.cachedQuery(object : Query() { + val parentRegions by get() + val spawn by get() + }) + private val regionContainer = WorldGuard.getInstance().platform.regionContainer - private val regionSpawns: MutableMap> = HashMap() + private var regionSpawns: Map> = mapOf() val spawnConfigsQuery = geary.cachedQuery(SpawnConfigs()) /** Clears [regionSpawns] */ - fun unregisterSpawns() = regionSpawns.clear() + fun unregisterSpawns() { regionSpawns = mapOf() } fun reloadSpawns() { unregisterSpawns() spawnConfigsQuery.entities().forEach { - prefabLoader.reload(it) + runCatching { + prefabLoader.reload(it) + }.onFailure { + it.printStackTrace() + } + } + val map = mutableMapOf>() + spawnsWithWGRegion.mapWithEntity { + parentRegions.keys + }.forEach { + it.data.forEach { regionName -> + map.getOrPut(regionName) { mutableSetOf() }.add(it.entity) + } } + regionSpawns = map } /** Takes a list of spawn region names and converts to a list of [SpawnDefinition]s from those regions */ fun List.getMobSpawnsForRegions(): List = flatMap { regionSpawns[it.id] ?: setOf() } - val spawnTracker = geary.listener(object : ListenerQuery() { - val parentRegions by get() - val spawn by get() - override fun ensure() = event.anySet(::parentRegions, ::spawn) - }).exec { - parentRegions.keys.forEach { - regionSpawns.getOrPut(it) { mutableSetOf() } += entity - } - } class SpawnConfigs : GearyQuery() { val config by get() diff --git a/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/conditions/components/SpawnGapCondition.kt b/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/conditions/components/SpawnGapCondition.kt index 82c39647..cb259782 100644 --- a/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/conditions/components/SpawnGapCondition.kt +++ b/mobzy-spawning/src/main/kotlin/com/mineinabyss/mobzy/spawning/conditions/components/SpawnGapCondition.kt @@ -2,6 +2,7 @@ package com.mineinabyss.mobzy.spawning.conditions.components import com.mineinabyss.geary.autoscan.AutoScan import com.mineinabyss.geary.modules.GearyModule +import com.mineinabyss.geary.serialization.serializers.InnerSerializer import com.mineinabyss.geary.systems.builders.listener import com.mineinabyss.geary.systems.query.ListenerQuery import com.mineinabyss.idofront.serialization.IntRangeSerializer @@ -14,12 +15,18 @@ import kotlinx.serialization.Serializable * * Ensures that when a mob spawn happens, the gap of air blocks is within a [range] of heights. */ -@Serializable -@SerialName("mobzy:check.spawn.gap") +@Serializable(with = SpawnGap.Serializer::class) class SpawnGap( @Serializable(with = IntRangeSerializer::class) val range: IntRange -) +) { + class Serializer : InnerSerializer( + "mobzy:check.spawn.gap", + IntRangeSerializer, + { SpawnGap(it) }, + { it.range }, + ) +} @AutoScan fun GearyModule.spawnGroupChecker() = listener(object : ListenerQuery() {