From 370e7383aa645e5c06005cfefd587eab4e815d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=98=BF=E9=B9=B0?= Date: Thu, 12 Dec 2024 00:11:24 +0800 Subject: [PATCH] 1.1.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 传入 from 坐标和 Event 于Kether 使用 --- build.gradle.kts | 21 ++- gradle.properties | 2 +- .../kim/hhhhhy/regions/data/AreaSettings.kt | 65 +++++--- .../kim/hhhhhy/regions/data/ConfigSettings.kt | 4 +- .../hhhhhy/regions/listeners/AreaListener.kt | 12 +- .../kim/hhhhhy/regions/utils/KetherUtils.kt | 153 +++++++++++++++--- src/main/resources/config.yml | 2 +- 7 files changed, 203 insertions(+), 56 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 5395686..38a433b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,18 +3,32 @@ import io.izzel.taboolib.gradle.* plugins { `java-library` `maven-publish` - id("io.izzel.taboolib") version "2.0.11" + id("io.izzel.taboolib") version "2.0.20" id("org.jetbrains.kotlin.jvm") version "1.8.22" } taboolib { env { - install(UNIVERSAL, BUKKIT_ALL, KETHER, NMS_UTIL, NAVIGATION, EXPANSION_JAVASCRIPT) + install( + Bukkit, + Kether, + Basic, + BukkitHook, + BukkitNMS, + BukkitNMSUtil, + BukkitUtil, + BukkitNavigation, + I18n, + JavaScript, + Jexl, + MinecraftChat, + MinecraftEffect + ) } version { - taboolib = "6.1.2-beta11" + taboolib = "6.2.0" } } @@ -23,7 +37,6 @@ repositories { } dependencies { - compileOnly("ink.ptms:nms-all:1.0.0") compileOnly("ink.ptms.core:v11902:11902-minimize:mapped") compileOnly("ink.ptms.core:v11902:11902-minimize:universal") compileOnly(kotlin("stdlib")) diff --git a/gradle.properties b/gradle.properties index bb9678f..339b998 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group=kim.hhhhhy.regions -version=1.0.9 \ No newline at end of file +version=1.1.4 \ No newline at end of file diff --git a/src/main/kotlin/kim/hhhhhy/regions/data/AreaSettings.kt b/src/main/kotlin/kim/hhhhhy/regions/data/AreaSettings.kt index e23bc3c..1c5bc8c 100644 --- a/src/main/kotlin/kim/hhhhhy/regions/data/AreaSettings.kt +++ b/src/main/kotlin/kim/hhhhhy/regions/data/AreaSettings.kt @@ -8,13 +8,15 @@ import kim.hhhhhy.regions.listeners.AreaListener import kim.hhhhhy.regions.utils.evalKether import org.bukkit.Location import org.bukkit.entity.Player +import org.bukkit.event.Cancellable +import org.bukkit.event.Event import taboolib.module.navigation.BoundingBox import taboolib.common.platform.function.console -import taboolib.common.platform.function.info import taboolib.common.platform.function.submit import taboolib.common.platform.service.PlatformExecutor import taboolib.module.configuration.Config import taboolib.module.configuration.Configuration +import taboolib.module.kether.* import taboolib.module.lang.sendInfo import taboolib.platform.util.onlinePlayers import java.util.concurrent.ConcurrentHashMap @@ -52,11 +54,15 @@ data class AreaSettings( playerAreas.clear() onlinePlayers.forEach { stopTick(it) - check(it, it.location) + check(it, it.location, it.location) } console().sendInfo("plugin-areas-reload") } + fun ScriptFrame.getEvent(): Event { + return variables().get("@RegionEvent").orElse(null) as? Event ?: error("No event selected.") + } + private fun getAreas(location: Location): List { val x = location.blockX val y = location.blockY @@ -76,33 +82,33 @@ data class AreaSettings( .map { (key, _) -> key } } - private fun runEnterAction(player: Player, id: String) { + private fun runEnterAction(player: Player, id: String, from: Location, event: Event?) { val actions = areasData[id]?.actions?.enter - if (ConfigSettings.baffleCache.hasNext("${player.name}-Enter-$id").not()) { + if (ConfigSettings.cooldown > 0 && ConfigSettings.baffleCache.hasNext("${player.name}-Enter-$id").not()) { return } - actions?.evalKether(player) - startTick(player, id) + actions?.evalKether(player, mapOf("frX" to from.x, "frY" to from.y, "frZ" to from.z, "frW" to from.world?.name), listOf("@RegionEvent" to event)) + startTick(player, id, from, event) } - private fun runLeaveAction(player: Player, id: String) { + private fun runLeaveAction(player: Player, id: String, from: Location, event: Event?) { stopTick(player, id) val actions = areasData[id]?.actions?.leave - if (ConfigSettings.baffleCache.hasNext("${player.name}-Leave-$id").not()) { + if (ConfigSettings.cooldown > 0 && ConfigSettings.baffleCache.hasNext("${player.name}-Leave-$id").not()) { return } - actions?.evalKether(player) + actions?.evalKether(player, mapOf("frX" to from.x, "frY" to from.y, "frZ" to from.z, "frW" to from.world?.name), listOf("@RegionEvent" to event)) } - private fun runTickAction(player: Player, id: String) { + private fun runTickAction(player: Player, id: String, from: Location, event: Event?) { val actions = areasData[id]?.actions?.tick - actions?.evalKether(player) + actions?.evalKether(player, mapOf("frX" to from.x, "frY" to from.y, "frZ" to from.z, "frW" to from.world?.name), listOf("@RegionEvent" to event)) } - private fun startTick(player: Player, id: String) { + private fun startTick(player: Player, id: String, from: Location, event: Event?) { val period = areasData[id]!!.tickPeriod val tasks = playerAreas.computeIfAbsent(player.name) { ConcurrentHashMap() } tasks[id] = submit(period = period) { if (playerAreas[player.name]?.contains(id) == true) { - runTickAction(player, id) + runTickAction(player, id, from, event) } else { return@submit } @@ -124,26 +130,26 @@ data class AreaSettings( /** * 执行一次区域类型动作 */ - private fun runActions(player: Player, id: String, type: AreaType) { + private fun runActions(player: Player, id: String, type: AreaType, from: Location, event: Event? = null) { when (type) { ENTER -> { - runEnterAction(player, id) + runEnterAction(player, id, from, event) } LEAVE -> { - runLeaveAction(player, id) + runLeaveAction(player, id, from, event) } TICK -> { - runTickAction(player, id) + runTickAction(player, id, from, event) } ALL -> { - runEnterAction(player, id) - runLeaveAction(player, id) - runTickAction(player, id) + runEnterAction(player, id, from, event) + runLeaveAction(player, id, from, event) + runTickAction(player, id, from, event) } } } - fun check(player: Player, location: Location) { + fun check(player: Player, location: Location, from: Location, event: Event? = null) { val areas = getAreas(location) if (areas.isNotEmpty()) { @@ -153,7 +159,7 @@ data class AreaSettings( if (filter.isNotEmpty()) { filter.forEach { (name, id) -> if (AreaListener.playerSet.remove(name to id)) { - runActions(player, id, LEAVE) + runActions(player, id, LEAVE, from, event) } } } @@ -161,7 +167,7 @@ data class AreaSettings( // 进入区域 areas.forEach { if (AreaListener.playerSet.add(player.name to it)) { - runActions(player, it, ENTER) + runActions(player, it, ENTER, from, event) } } } else { @@ -172,11 +178,22 @@ data class AreaSettings( if (filter.isNotEmpty()) { filter.forEach { (name, id) -> if (AreaListener.playerSet.remove(name to id)) { - runActions(player, id, LEAVE) + runActions(player, id, LEAVE, from, event) } } } } } + + + @KetherParser(["region-event-cancel"], shared = true) + fun parserCancel() = scriptParser { + actionNow { + val e = getEvent() + if (e is Cancellable) { + e.isCancelled = true + } + } + } } } diff --git a/src/main/kotlin/kim/hhhhhy/regions/data/ConfigSettings.kt b/src/main/kotlin/kim/hhhhhy/regions/data/ConfigSettings.kt index 8b8375c..bf36a80 100644 --- a/src/main/kotlin/kim/hhhhhy/regions/data/ConfigSettings.kt +++ b/src/main/kotlin/kim/hhhhhy/regions/data/ConfigSettings.kt @@ -14,7 +14,7 @@ object ConfigSettings { lateinit var config: Configuration private set - private var cooldown: Long = 3000 + var cooldown: Long = 3000 var baffleCache = Baffle.of(cooldown, TimeUnit.MILLISECONDS) @@ -23,8 +23,8 @@ object ConfigSettings { fun reloadConfig() { cooldown = config.getLong("CommandBaffle.time", 3000) actionTick = config.getLong("AreaSettings.TickAction", 20) + baffleCache = Baffle.of(cooldown, TimeUnit.MILLISECONDS) console().sendInfo("plugin-config-reload") - } } diff --git a/src/main/kotlin/kim/hhhhhy/regions/listeners/AreaListener.kt b/src/main/kotlin/kim/hhhhhy/regions/listeners/AreaListener.kt index 292cea1..41dfd54 100644 --- a/src/main/kotlin/kim/hhhhhy/regions/listeners/AreaListener.kt +++ b/src/main/kotlin/kim/hhhhhy/regions/listeners/AreaListener.kt @@ -16,32 +16,32 @@ object AreaListener { @SubscribeEvent fun onPlayerMove(e: PlayerMoveEvent) { val to = e.to ?: return - if (!e.isBlockMovement()) { + if (!e.isMovement()) { return } val player = e.player - AreaSettings.check(player, to) + AreaSettings.check(player, to, e.from, e) } @SubscribeEvent fun onPlayerChangeWorld(e: PlayerChangedWorldEvent) { AreaSettings.stopTick(e.player) - AreaSettings.check(e.player, e.player.location) + AreaSettings.check(e.player, e.player.location, e.from.spawnLocation, e) } @SubscribeEvent fun onTeleport(e: PlayerTeleportEvent) { val from = e.from val to = e.to ?: return - if (from.world?.name == to.world?.name && from.x == to.x && from.y == to.y && from.z == to.z) return val player = e.player - AreaSettings.check(player, to) + AreaSettings.check(player, to, from, e) } @SubscribeEvent fun onPlayerJoin(e: PlayerJoinEvent) { - AreaSettings.check(e.player, e.player.location) + AreaSettings.check(e.player, e.player.location, e.player.location, e) } + @SubscribeEvent fun onPlayerQuit(e: PlayerQuitEvent) { playerSet.removeAll { it.first == e.player.name } diff --git a/src/main/kotlin/kim/hhhhhy/regions/utils/KetherUtils.kt b/src/main/kotlin/kim/hhhhhy/regions/utils/KetherUtils.kt index 9db6099..9e4672d 100644 --- a/src/main/kotlin/kim/hhhhhy/regions/utils/KetherUtils.kt +++ b/src/main/kotlin/kim/hhhhhy/regions/utils/KetherUtils.kt @@ -3,10 +3,7 @@ package kim.hhhhhy.regions.utils import org.bukkit.entity.Player import taboolib.common.platform.function.console import taboolib.common5.Coerce -import taboolib.module.kether.KetherShell -import taboolib.module.kether.ScriptFrame -import taboolib.module.kether.ScriptOptions -import taboolib.module.kether.script +import taboolib.module.kether.* import java.util.concurrent.CompletableFuture @@ -14,52 +11,172 @@ fun ScriptFrame.getBukkitPlayer(): Player { return script().sender?.castSafely() ?: error("No player selected.") } -fun List.evalKether(player: Player?, vars: Map = mapOf()): CompletableFuture { + +fun List.parseKether( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList() +): List { + if (this.isEmpty()) { + return listOf("") + } + return KetherFunction.parse(this, ScriptOptions.builder().apply { + sender(player ?: console()) + vars(vars) + sets.forEach { + set(it.first, it.second) + } + }.build()) +} + +fun String?.parseKether( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList() +): String { + if (this.isNullOrBlank()) { + return "" + } + return KetherFunction.parse(this, ScriptOptions.builder().apply { + sender(player ?: console()) + vars(vars) + sets.forEach { + set(it.first, it.second) + } + }.build()) +} + +fun List.evalKether( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList() +): CompletableFuture { + if (isEmpty()) { + val future = CompletableFuture() + future.complete(null) + return future + } + if (size == 1) { + return this[0].evalKether(player, vars, sets) + } return KetherShell.eval(this, ScriptOptions.builder().apply { - namespace(listOf("adyeshach", "adyeshach-inner", "chemdah", "taboo-public-work")) sender(player ?: console()) vars(vars) + sets.forEach { + set(it.first, it.second) + } }.build()) } -fun String.evalKether(player: Player?, vars: Map = mapOf()): CompletableFuture { +fun String?.evalKether( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList() +): CompletableFuture { + if (this.isNullOrBlank()) { + val future = CompletableFuture() + future.complete(null) + return future + } return KetherShell.eval(this, ScriptOptions.builder().apply { - namespace(listOf("adyeshach", "adyeshach-inner", "chemdah", "taboo-public-work")) sender(player ?: console()) vars(vars) + sets.forEach { + set(it.first, it.second) + } }.build()) } -fun String.evalKetherBoolean(player: Player?, vars: Map = mapOf()): Boolean { - if (this.isEmpty()) { - return true +fun String?.evalKetherValue( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList() +): Any? { + if (this.isNullOrBlank()) { + val future = CompletableFuture() + future.complete(null) + return future + } + return KetherShell.eval(this, ScriptOptions.builder().apply { + sender(player ?: console()) + vars(vars) + sets.forEach { + set(it.first, it.second) + } + }.build()).getNow("null") +} + +fun String?.evalKetherBoolean( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList(), + def: Boolean = true +): Boolean { + if (this.isNullOrBlank()) { + return def } + + /* + * 预处理 + * 条件写 true / false 将直接绕过 Kether + */ + if (this == "true") return true + if (this == "false") return false + return try { KetherShell.eval(this, ScriptOptions.builder().apply { - namespace(listOf("adyeshach", "adyeshach-inner", "chemdah", "taboo-public-work")) sender(player ?: console()) vars(vars) + sets.forEach { + set(it.first, it.second) + } }.build()).thenApply { Coerce.toBoolean(it) }.get() } catch (_: Exception) { - false + def } } -fun List.evalKetherBoolean(player: Player?, vars: Map = mapOf()): Boolean { +/** + * @param all 是否全部条件通过 + */ +fun List.evalKetherBoolean( + player: Player?, + vars: Map = mapOf(), + sets: List> = emptyList(), + def: Boolean = true, + all: Boolean = true +): Boolean { if (this.isEmpty()) { - return true + return def } + val condition = if (all) { + if (this.all { it == "true" }) { + return true + } + if (this.all { it == "false" }) { + return false + } + "all" + } else { + if (this.any { it == "true" }) { + return true + } + "any" + } + "[ " + this.joinToString("\n") + " ]" return try { - KetherShell.eval(this, ScriptOptions.builder().apply { - namespace(listOf("adyeshach", "adyeshach-inner", "chemdah", "taboo-public-work")) + KetherShell.eval(condition, ScriptOptions.builder().apply { sender(player ?: console()) vars(vars) + sets.forEach { + set(it.first, it.second) + } }.build()).thenApply { Coerce.toBoolean(it) }.get() } catch (_: Exception) { - false + def } } + diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e0290fa..4adfd6d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,7 @@ # 触发冷却 CommandBaffle: # 毫秒 - time: 1000 + time: 10 AreaSettings: # 区域内持续执行