From 85db481f73d54aca2b29185d590aa9ebe565ed57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?MC=7E=E8=9B=9F=E9=BE=99?= <1610105206@qq.com> Date: Tue, 13 Aug 2024 14:39:35 +0800 Subject: [PATCH] =?UTF-8?q?Experimental=20|=20=E9=87=8D=E6=9E=84=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=99=A8&=E7=89=A9=E5=93=81=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/item/api/feature/ItemAction.kt | 19 ---- .../module/item/api/feature/ItemTrigger.kt | 17 ---- .../module/item/api/trigger/TriggerAction.kt | 20 ++++ .../module/item/api/trigger/TriggerType.kt | 16 ++++ .../ratziel/module/item/impl/RatzielItem.kt | 2 + .../module/item/impl/action/ActionManager.kt | 50 ++++++++++ .../impl/{feature => }/action/ActionParser.kt | 2 +- .../module/item/impl/action/ScriptedAction.kt | 27 ++++++ .../item/impl/action/TriggerListener.kt | 96 +++++++++++++++++++ .../module/item/impl/action/TriggerMap.kt | 15 +++ .../module/item/impl/action/Triggers.kt | 49 ++++++++++ .../item/impl/feature/action/ActionManager.kt | 64 ------------- .../impl/feature/action/ScriptedAction.kt | 24 ----- .../item/impl/feature/action/TriggerMap.kt | 15 --- .../feature/action/triggers/AttackTrigger.kt | 46 --------- .../feature/action/triggers/BreakTrigger.kt | 32 ------- .../feature/action/triggers/DamageTrigger.kt | 33 ------- .../action/triggers/InteractTrigger.kt | 74 -------------- .../feature/action/triggers/ReleaseTrigger.kt | 33 ------- 19 files changed, 276 insertions(+), 358 deletions(-) delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemAction.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemTrigger.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerAction.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerType.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionManager.kt rename project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/{feature => }/action/ActionParser.kt (97%) create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ScriptedAction.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerListener.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerMap.kt create mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/Triggers.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionManager.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ScriptedAction.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/TriggerMap.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/AttackTrigger.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/BreakTrigger.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/DamageTrigger.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/InteractTrigger.kt delete mode 100644 project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/ReleaseTrigger.kt diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemAction.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemAction.kt deleted file mode 100644 index 5f0fb1f5..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemAction.kt +++ /dev/null @@ -1,19 +0,0 @@ -package cn.fd.ratziel.module.item.api.feature - -import cn.fd.ratziel.script.api.ScriptEnvironment - -/** - * ItemAction - 物品动作 - * - * @author TheFloodDragon - * @since 2024/7/3 15:11 - */ -@Deprecated("需要重构") -interface ItemAction { - - /** - * 执行物品动作 - */ - fun execute(context: ScriptEnvironment) - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemTrigger.kt deleted file mode 100644 index c897e9b7..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/feature/ItemTrigger.kt +++ /dev/null @@ -1,17 +0,0 @@ -package cn.fd.ratziel.module.item.api.feature - -/** - * ItemTrigger - 物品触发器 - * - * @author TheFloodDragon - * @since 2024/7/3 18:41 - */ -@Deprecated("需要重构") -interface ItemTrigger { - - /** - * 触发器名称列表 - */ - val names: Array - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerAction.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerAction.kt new file mode 100644 index 00000000..0fc43d75 --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerAction.kt @@ -0,0 +1,20 @@ +package cn.fd.ratziel.module.item.api.trigger + +import cn.fd.ratziel.function.ArgumentContext + +/** + * TriggerAction - 由触发器触发的动作 + * + * @author TheFloodDragon + * @since 2024/8/13 13:39 + */ +interface TriggerAction { + + /** + * 执行动作 + * @param trigger 触发此动作的触发器 + * @param context 动作参数 + */ + fun execute(trigger: TriggerType, context: ArgumentContext) + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerType.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerType.kt new file mode 100644 index 00000000..2b719a1c --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/api/trigger/TriggerType.kt @@ -0,0 +1,16 @@ +package cn.fd.ratziel.module.item.api.trigger + +/** + * TriggerType - 触发器 + * + * @author TheFloodDragon + * @since 2024/8/13 13:38 + */ +interface TriggerType { + + /** + * 触发器名称 + */ + val names: Array + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/RatzielItem.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/RatzielItem.kt index e5cfb7e5..48a67d12 100644 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/RatzielItem.kt +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/RatzielItem.kt @@ -12,6 +12,7 @@ import cn.fd.ratziel.module.item.nms.RefItemStack import cn.fd.ratziel.module.item.util.handle import cn.fd.ratziel.module.item.util.read import org.bukkit.inventory.ItemStack +import taboolib.platform.util.isAir /** * RatzielItem @@ -63,6 +64,7 @@ open class RatzielItem : NeoItem { */ @JvmStatic fun of(itemStack: ItemStack): RatzielItem? { + if (itemStack.isAir()) return null val itemData = RefItemStack(itemStack).getData() ?: return null return of(itemData) } diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionManager.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionManager.kt new file mode 100644 index 00000000..8a886ef1 --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionManager.kt @@ -0,0 +1,50 @@ +package cn.fd.ratziel.module.item.impl.action + +import cn.fd.ratziel.core.Identifier +import cn.fd.ratziel.function.ArgumentContext +import cn.fd.ratziel.module.item.api.trigger.TriggerType +import cn.fd.ratziel.module.item.impl.service.NativeServiceRegistry +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArraySet + +/** + * ActionManager + * + * @author TheFloodDragon + * @since 2024/7/3 15:20 + */ +object ActionManager { + + /** + * 物品触发器注册表 + */ + val triggers: MutableSet = CopyOnWriteArraySet(Triggers.entries) + + /** + * 物品唯一标识符 - 触发器表 (存有物品触发器和物品动作) + */ + val actionMap: MutableMap = ConcurrentHashMap() + + init { + // 注册服务 + NativeServiceRegistry.register(TriggerMap::class.java, { actionMap[it] }, { i, m -> actionMap[i] = m }) + } + + /** + * 触发指定物品的指定触发器, 并执行物品动作 + */ + @JvmStatic + fun trigger(identifier: Identifier, trigger: TriggerType, context: ArgumentContext) { + // 获取物品动作 (无动作时返回) + val action = actionMap[identifier]?.get(trigger) ?: return + // 执行物品动作 + action.execute(trigger, context) + } + + /** + * 匹配 [TriggerMap] + */ + @JvmStatic + fun matchTrigger(name: String): TriggerType? = triggers.firstOrNull { it.names.contains(name) } + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionParser.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionParser.kt similarity index 97% rename from project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionParser.kt rename to project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionParser.kt index 84c3189b..f4a0c14e 100644 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionParser.kt +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ActionParser.kt @@ -1,4 +1,4 @@ -package cn.fd.ratziel.module.item.impl.feature.action +package cn.fd.ratziel.module.item.impl.action import cn.fd.ratziel.core.serialization.getBy import cn.fd.ratziel.core.serialization.toBasic diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ScriptedAction.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ScriptedAction.kt new file mode 100644 index 00000000..d796a57b --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/ScriptedAction.kt @@ -0,0 +1,27 @@ +package cn.fd.ratziel.module.item.impl.action + +import cn.fd.ratziel.function.ArgumentContext +import cn.fd.ratziel.module.item.api.trigger.TriggerAction +import cn.fd.ratziel.module.item.api.trigger.TriggerType +import cn.fd.ratziel.script.api.EvaluableScript +import cn.fd.ratziel.script.api.ScriptEnvironment +import cn.fd.ratziel.script.impl.SimpleScriptEnv + +/** + * ScriptedAction + * + * @author TheFloodDragon + * @since 2024/7/3 15:32 + */ +open class ScriptedAction( + /** + * 可执行脚本 + */ + val script: EvaluableScript, +) : TriggerAction { + + override fun execute(trigger: TriggerType, context: ArgumentContext) { + script.evaluate(context.popOr(ScriptEnvironment::class.java, SimpleScriptEnv())) + } + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerListener.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerListener.kt new file mode 100644 index 00000000..d507ffa1 --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerListener.kt @@ -0,0 +1,96 @@ +@file:Suppress("unused") + +package cn.fd.ratziel.module.item.impl.action + +import cn.fd.ratziel.module.item.impl.RatzielItem +import cn.fd.ratziel.script.impl.SimpleScriptEnv +import org.bukkit.entity.Player +import org.bukkit.event.block.Action.* +import org.bukkit.event.entity.EntityDamageByEntityEvent +import org.bukkit.event.player.PlayerInteractEvent +import org.bukkit.event.player.PlayerItemBreakEvent +import org.bukkit.event.player.PlayerItemDamageEvent +import taboolib.common.platform.event.SubscribeEvent +import taboolib.platform.util.attacker + +/** + * TriggerListener + * + * @author TheFloodDragon + * @since 2024/8/13 14:35 + */ +object TriggerListener { + + @SubscribeEvent + fun onAttack(event: EntityDamageByEntityEvent) { + // 获取攻击者 + val attacker = event.attacker + // 判断是否是玩家, 物品是否是本插件物品 + if (attacker !is Player) return + // 获取攻击时的物品 + val item = attacker.inventory.itemInMainHand + val neoItem = RatzielItem.of(item) ?: return + // 触发触发器 (参数: 事件(EntityDamageByEntityEvent), 攻击者(Player), ItemStack, RatzielItem) + Triggers.ATTACK.trigger(neoItem.id) { + set("event", event) + set("attacker", attacker) + set("item", item) + set("neoItem", neoItem) + } + } + + @SubscribeEvent(ignoreCancelled = true) + fun onBreak(event: PlayerItemBreakEvent) { + // 获取损坏时的物品 + val item = event.brokenItem + val neoItem = RatzielItem.of(item) ?: return + // 触发触发器 + Triggers.BREAK.trigger(neoItem.id) { + set("event", event) + set("player", event.player) + set("item", item) + set("neoItem", neoItem) + } + } + + @SubscribeEvent + fun onDamage(event: PlayerItemDamageEvent) { + // 获取攻击时的物品 + val item = event.item + val neoItem = RatzielItem.of(item) ?: return + // 触发触发器 + Triggers.DAMAGED.trigger(neoItem.id) { + set("event", event) + set("player", event.player) + set("damage", event.damage) + set("item", event.item) + set("neoItem", neoItem) + } + } + + /** + * 当玩家与空气或方块发生交互时 + * 触发事件及脚本 + */ + @SubscribeEvent + fun onInteract(event: PlayerInteractEvent) { + // 获取交互时的物品 + val item = event.item ?: return + val neoItem = RatzielItem.of(item) ?: return + // 环境 + val env = SimpleScriptEnv().apply { + set("event", event) + set("item", item) + set("neoItem", neoItem) + } + // 触发触发器 + when (event.action) { + LEFT_CLICK_AIR -> Triggers.INTERACT_LEFT_CLICK_AIR.trigger(neoItem.id, env) + LEFT_CLICK_BLOCK -> Triggers.INTERACT_LEFT_CLICK_BLOCK.trigger(neoItem.id, env) + RIGHT_CLICK_AIR -> Triggers.INTERACT_RIGHT_CLICK_AIR.trigger(neoItem.id, env) + RIGHT_CLICK_BLOCK -> Triggers.INTERACT_RIGHT_CLICK_BLOCK.trigger(neoItem.id, env) + else -> {} + } + } + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerMap.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerMap.kt new file mode 100644 index 00000000..b661990c --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/TriggerMap.kt @@ -0,0 +1,15 @@ +package cn.fd.ratziel.module.item.impl.action + +import cn.fd.ratziel.module.item.api.trigger.TriggerAction +import cn.fd.ratziel.module.item.api.trigger.TriggerType +import java.util.concurrent.ConcurrentHashMap + +/** + * TriggerMap + * + * @author TheFloodDragon + * @since 2024/8/13 14:01 + */ +open class TriggerMap( + protected open val map: MutableMap = ConcurrentHashMap(), +) : MutableMap by map \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/Triggers.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/Triggers.kt new file mode 100644 index 00000000..812f48ba --- /dev/null +++ b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/action/Triggers.kt @@ -0,0 +1,49 @@ +package cn.fd.ratziel.module.item.impl.action + +import cn.fd.ratziel.core.Identifier +import cn.fd.ratziel.function.ArgumentContext +import cn.fd.ratziel.function.SimpleArgumentContext +import cn.fd.ratziel.module.item.api.trigger.TriggerType +import cn.fd.ratziel.script.api.ScriptEnvironment +import cn.fd.ratziel.script.impl.SimpleScriptEnv + +/** + * Triggers + * + * @author TheFloodDragon + * @since 2024/8/13 14:29 + */ +enum class Triggers( + override vararg val names: String, + val parent: TriggerType? = null +) : TriggerType { + + // 攻击 + ATTACK("onAttack", "onAtk", "attack", "atk"), + + // 被损坏 + BREAK("onBreak", "break"), + + // 耐久损伤 + DAMAGED("onDamaged","damaged", "onDamage", "damage"), + + // 交互 + INTERACT_LEFT_CLICK("onLeft", "left", "onLeftClick", "leftClick"), + INTERACT_RIGHT_CLICK("onLeft", "left", "onLeftClick", "leftClick"), + INTERACT_LEFT_CLICK_AIR("onLeftClickedAir", "left-air", "left-click-air", parent = INTERACT_LEFT_CLICK), + INTERACT_LEFT_CLICK_BLOCK("onLeftClickedBlock", "left-block", "left-click-block", parent = INTERACT_LEFT_CLICK), + INTERACT_RIGHT_CLICK_AIR("onRightClickedAir", "right-air", "right-click-air", parent = INTERACT_RIGHT_CLICK), + INTERACT_RIGHT_CLICK_BLOCK("onRightClickedBlock", "right-block", "right-click-block", parent = INTERACT_RIGHT_CLICK); + + fun trigger(identifier: Identifier, context: ArgumentContext) { + // Trigger myself + ActionManager.trigger(identifier, this, context) + // Trigger parent + if (parent != null) ActionManager.trigger(identifier, parent, context) + } + + fun trigger(identifier: Identifier, environment: ScriptEnvironment) = trigger(identifier, SimpleArgumentContext(environment)) + + fun trigger(identifier: Identifier, envAction: ScriptEnvironment.() -> Unit) = trigger(identifier, SimpleScriptEnv().also { envAction(it) }) + +} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionManager.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionManager.kt deleted file mode 100644 index 943aa368..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ActionManager.kt +++ /dev/null @@ -1,64 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action - -import cn.fd.ratziel.core.Identifier -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.impl.feature.action.triggers.* -import cn.fd.ratziel.module.item.impl.service.NativeServiceRegistry -import cn.fd.ratziel.script.api.ScriptEnvironment -import cn.fd.ratziel.script.impl.SimpleScriptEnv -import java.util.concurrent.ConcurrentHashMap - -/** - * ActionManager - * - * @author TheFloodDragon - * @since 2024/7/3 15:20 - */ -object ActionManager { - - /** - * 物品触发器注册表 - */ - val triggers: MutableSet = mutableSetOf( - AttackTrigger, DamageTrigger, BreakTrigger, - ReleaseTrigger, - ).apply { - addAll(InteractTrigger.Triggers.values()) - } - - /** - * 物品唯一标识符 - 触发器表 (存有物品触发器和物品动作) - */ - val actionMap: MutableMap = ConcurrentHashMap() - - init { - // 注册服务 - NativeServiceRegistry.register(TriggerMap::class.java, { actionMap[it] }, { i, m -> actionMap[i] = m }) - } - - /** - * 触发指定物品的指定触发器, 以处理物品动作 - */ - @JvmStatic - fun trigger(identifier: Identifier, trigger: ItemTrigger, environment: ScriptEnvironment) { - // 获取物品动作 - val action = actionMap[identifier]?.get(trigger) -// // 设置绑定键 -// environment.context.add(environment.bindings) -// // 执行物品动作 -// action?.execute(environment.context)// - // 执行物品动作 - action?.execute(environment) - } - - @JvmStatic - fun trigger(identifier: Identifier, trigger: ItemTrigger, function: ScriptEnvironment.() -> Unit) = - trigger(identifier, trigger, SimpleScriptEnv().apply(function)) - - /** - * 匹配 [TriggerMap] - */ - @JvmStatic - fun matchTrigger(name: String): ItemTrigger? = triggers.firstOrNull { it.names.contains(name) } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ScriptedAction.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ScriptedAction.kt deleted file mode 100644 index 6eb12950..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/ScriptedAction.kt +++ /dev/null @@ -1,24 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action - -import cn.fd.ratziel.module.item.api.feature.ItemAction -import cn.fd.ratziel.script.api.EvaluableScript -import cn.fd.ratziel.script.api.ScriptEnvironment - -/** - * ScriptedAction - * - * @author TheFloodDragon - * @since 2024/7/3 15:32 - */ -open class ScriptedAction( - /** - * 可执行脚本 - */ - val script: EvaluableScript, -) : ItemAction { - - override fun execute(context: ScriptEnvironment) { - script.evaluate(context) - } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/TriggerMap.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/TriggerMap.kt deleted file mode 100644 index 9831e483..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/TriggerMap.kt +++ /dev/null @@ -1,15 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action - -import cn.fd.ratziel.module.item.api.feature.ItemAction -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import java.util.concurrent.ConcurrentHashMap - -/** - * TriggerMap - * - * @author TheFloodDragon - * @since 2024/7/3 18:53 - */ -open class TriggerMap( - protected open val map: MutableMap = ConcurrentHashMap(), -) : MutableMap by map \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/AttackTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/AttackTrigger.kt deleted file mode 100644 index ba042147..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/AttackTrigger.kt +++ /dev/null @@ -1,46 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action.triggers - -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.impl.RatzielItem -import cn.fd.ratziel.module.item.impl.feature.action.ActionManager -import org.bukkit.entity.Player -import org.bukkit.event.entity.EntityDamageByEntityEvent -import org.bukkit.inventory.ItemStack -import taboolib.common.platform.event.SubscribeEvent -import taboolib.platform.util.attacker -import taboolib.platform.util.isAir - -/** - * AttackTrigger - * - * @author TheFloodDragon - * @since 2024/7/3 19:06 - */ -internal object AttackTrigger : ItemTrigger { - - override val names = arrayOf("onAttack", "onAtk", "attack", "atk") - - @SubscribeEvent - fun onAttack(event: EntityDamageByEntityEvent) { - // 获取攻击者 - val attacker = event.attacker - // 判断是否是玩家, 物品是否是本插件物品 - if (attacker !is Player) return - // 获取攻击时的物品 - val item = attacker.inventory.itemInMainHand - val neoItem = asNeo(item) ?: return - // 触发触发器 (参数: 事件(EntityDamageByEntityEvent), 攻击者(Player), ItemStack, RatzielItem) - ActionManager.trigger(neoItem.id, this) { - set("event", event) - set("attacker", attacker) - set("item", item) - set("neoItem", neoItem) - } - } - - fun asNeo(item: ItemStack): RatzielItem? { - if (item.isAir()) return null - return RatzielItem.of(item) - } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/BreakTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/BreakTrigger.kt deleted file mode 100644 index 9f3d1d4b..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/BreakTrigger.kt +++ /dev/null @@ -1,32 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action.triggers - -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.impl.feature.action.ActionManager -import org.bukkit.event.player.PlayerItemBreakEvent -import taboolib.common.platform.event.SubscribeEvent - -/** - * BreakTrigger - * - * @author TheFloodDragon - * @since 2024/7/8 16:19 - */ -object BreakTrigger : ItemTrigger { - - override val names = arrayOf("onBreak", "break") - - @SubscribeEvent(ignoreCancelled = true) - fun onBreak(event: PlayerItemBreakEvent) { - // 获取损坏时的物品 - val item = event.brokenItem - val neoItem = AttackTrigger.asNeo(item) ?: return - // 触发触发器 - ActionManager.trigger(neoItem.identifier, this) { - set("event", event) - set("player", event.player) - set("item", item) - set("neoItem", neoItem) - } - } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/DamageTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/DamageTrigger.kt deleted file mode 100644 index b5adc284..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/DamageTrigger.kt +++ /dev/null @@ -1,33 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action.triggers - -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.impl.feature.action.ActionManager -import org.bukkit.event.player.PlayerItemDamageEvent -import taboolib.common.platform.event.SubscribeEvent - -/** - * DamageTrigger - * - * @author TheFloodDragon - * @since 2024/7/8 15:43 - */ -internal object DamageTrigger : ItemTrigger { - - override val names = arrayOf("onDamage", "damage") - - @SubscribeEvent - fun onDamage(event: PlayerItemDamageEvent) { - // 获取攻击时的物品 - val item = event.item - val neoItem = AttackTrigger.asNeo(item) ?: return - // 触发触发器 - ActionManager.trigger(neoItem.identifier, this) { - set("event", event) - set("player", event.player) - set("damage", event.damage) - set("item", event.item) - set("neoItem", neoItem) - } - } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/InteractTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/InteractTrigger.kt deleted file mode 100644 index 489ab90d..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/InteractTrigger.kt +++ /dev/null @@ -1,74 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action.triggers - -import cn.fd.ratziel.core.Identifier -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.impl.feature.action.ActionManager -import cn.fd.ratziel.script.api.ScriptEnvironment -import cn.fd.ratziel.script.impl.SimpleScriptEnv -import org.bukkit.event.block.Action.* -import org.bukkit.event.player.PlayerInteractEvent -import taboolib.common.platform.event.SubscribeEvent - -/** - * InteractTrigger - * - * @author TheFloodDragon - * @since 2024/7/8 16:09 - */ -object InteractTrigger { - - /** - * 当玩家与空气或方块发生交互时 - * 触发事件及脚本 - */ - @SubscribeEvent - fun onInteract(event: PlayerInteractEvent) { - // 获取交互时的物品 - val item = event.item ?: return - val neoItem = AttackTrigger.asNeo(item) ?: return - // 环境 - val env = SimpleScriptEnv().apply { - set("event", event) - set("item", item) - set("neoItem", neoItem) - } - // 触发触发器 - when (event.action) { - LEFT_CLICK_AIR -> Triggers.LEFT_CLICK_AIR.trigger(neoItem.identifier, env) - LEFT_CLICK_BLOCK -> Triggers.LEFT_CLICK_BLOCK.trigger(neoItem.identifier, env) - RIGHT_CLICK_AIR -> Triggers.RIGHT_CLICK_AIR.trigger(neoItem.identifier, env) - RIGHT_CLICK_BLOCK -> Triggers.RIGHT_CLICK_BLOCK.trigger(neoItem.identifier, env) - else -> {} - } - } - - enum class Triggers( - override vararg val names: String, - val parent: ItemTrigger? = null - ) : ItemTrigger { - - /** - * includes [LEFT_CLICK_AIR] [LEFT_CLICK_BLOCK] - */ - LEFT_CLICK("onLeft", "left", "onLeftClick", "leftClick"), - - /** - * includes [RIGHT_CLICK_AIR] [RIGHT_CLICK_BLOCK] - */ - RIGHT_CLICK("onLeft", "left", "onLeftClick", "leftClick"), - - LEFT_CLICK_AIR("onLeftClickedAir", "left-air", "left-click-air", parent = LEFT_CLICK), - LEFT_CLICK_BLOCK("onLeftClickedBlock", "left-block", "left-click-block", parent = LEFT_CLICK), - RIGHT_CLICK_AIR("onRightClickedAir", "right-air", "right-click-air", parent = RIGHT_CLICK), - RIGHT_CLICK_BLOCK("onRightClickedBlock", "right-block", "right-click-block", parent = RIGHT_CLICK); - - fun trigger(identifier: Identifier, environment: ScriptEnvironment) { - // Trigger myself - ActionManager.trigger(identifier, this, environment) - // Trigger parent - if (parent != null) ActionManager.trigger(identifier, parent, environment) - } - - } - -} \ No newline at end of file diff --git a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/ReleaseTrigger.kt b/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/ReleaseTrigger.kt deleted file mode 100644 index 49c698ba..00000000 --- a/project/module-item/src/main/kotlin/cn/fd/ratziel/module/item/impl/feature/action/triggers/ReleaseTrigger.kt +++ /dev/null @@ -1,33 +0,0 @@ -package cn.fd.ratziel.module.item.impl.feature.action.triggers - -import cn.fd.ratziel.module.item.api.feature.ItemTrigger -import cn.fd.ratziel.module.item.api.event.ItemGenerateEvent -import cn.fd.ratziel.module.item.impl.RatzielItem -import cn.fd.ratziel.module.item.impl.feature.action.ActionManager -import cn.fd.ratziel.module.item.nms.RefItemStack -import taboolib.common.platform.event.SubscribeEvent - -/** - * ReleaseTrigger - * - * @author TheFloodDragon - * @since 2024/7/8 16:00 - */ -internal object ReleaseTrigger : ItemTrigger { - - override val names = arrayOf("onRelease", "release", "onFinished", "onFinish", "finish", "onEnd", "end") - - @SubscribeEvent - fun onRelease(event: ItemGenerateEvent.Post) { - val neoItem = event.item as? RatzielItem ?: return - // 获取攻击时的物品 - val item = RefItemStack(event.item.data).getAsBukkit() - // 触发触发器 - ActionManager.trigger(neoItem.identifier, this) { - set("event", event) - set("item", item) - set("neoItem", neoItem) - } - } - -} \ No newline at end of file