Skip to content

Groovy注册插件中的内容

插件可以自动加载一些特定的 Groovy 类为 属性组件、读取组件,也可以实现 GroovyScript 接口注册属性类型

警告

若代码中有 TaskTimer、监听器等长期持有的对象,一定要在生命周期结束时(onDisable())清除或关闭,否则会造成内存泄漏。

扩展属性类型

可搭配开发文档一同使用
属性类型续对应一套触发器,处理器(当然也可以复用或重写已有的)

Groovy
package expansions

import cn.org.bukkit.craneattribute.api.attribute.AttributeType
import cn.org.bukkit.craneattribute.core.attribute.AttributeTypes
import groovy.transform.CompileStatic
import cn.org.bukkit.craneattribute.api.expansions.GroovyScript
import org.bukkit.event.player.PlayerExpChangeEvent

@CompileStatic
class AttributeManager implements GroovyScript {

    public static AttributeType GROOVY = AttributeType.create("GROOVY", { it ->
        it.triggerSetting("test", "value!", "GROOVY 注释")
    })

    /**
     * 启用时注册属性类型
     */
    @Override
    void onEnable() {
        GROOVY.register(触发器实例)
    }

    /**
     * 一定要在 disable 时 unregister 属性类型
     * 否则可能会内存泄漏
     */
    @Override
    void onDisable() {
        GROOVY.unregister()
    }

}
Groovy
package expansions

import cn.org.bukkit.craneattribute.api.attribute.trigger.AttributeTrigger
import groovy.transform.CompileStatic
import org.bukkit.event.EventPriority
import org.bukkit.event.entity.EntityDeathEvent

@CompileStatic
class CustomTrigger implements AttributeTrigger<EntityDeathEvent> {

    @Override
    Class<EntityDeathEvent> getEventClass() {
        return EntityDeathEvent.class
    }

    @Override
    EventPriority getPriority() {
        return EventPriority.HIGH
    }

    @Override
    boolean getIgnoreCancelled() {
        return false
    }

    @Override
    boolean condition(EntityDeathEvent event) {
        // 只有被玩家击杀时才触发
        return event.entity.killer != null
    }

    @Override
    void trigger(EntityDeathEvent event) {
        def entity = event.entity
        def killer = event.entity.killer

        if (!killer.isDead()) {
            // 通过自定义处理器处理属性
            new CustomHandler(killer.getAttrData(), entity.getAttrData()).handle()
        }
    }

    @Override
    void onLoad() {
        // 插件加载或重载时调用
    }
}
Groovy
package expansions

import cn.org.bukkit.craneattribute.api.attribute.data.AttributeData
import cn.org.bukkit.craneattribute.api.attribute.trigger.AttributeHandler
import cn.org.bukkit.craneattribute.api.attribute.handler.AttributeTracker
import cn.org.bukkit.craneattribute.api.attribute.handler.MetadataTracker
import cn.org.bukkit.craneattribute.api.attribute.handler.Cancellable
import cn.org.bukkit.craneattribute.api.attribute.AttributeType
import groovy.transform.CompileStatic
import org.bukkit.entity.LivingEntity

@CompileStatic
class CustomHandler implements AttributeHandler, AttributeTracker, MetadataTracker, Cancellable {

    final AttributeData killerData
    final AttributeData entityData

    @Override
    AttributeType getType() {
        return AttributeManager.GROOVY
    }

    @Override
    boolean cancelled = false

    // AttributeTracker 接口
    @Override
    Map<UUID, AttributeData> getDataMap() {
        return [
            (killerData.entity.uniqueId): killerData,
            (entityData.entity.uniqueId): entityData
        ]
    }

    @Override
    Map<UUID, Map<String, double[]>> getTempAttribute() {
        return [
            (killerData.entity.uniqueId): [:],
            (entityData.entity.uniqueId): [:]
        ]
    }

    @Override
    Set<String> getTriggerAttribute() {
        return []
    }

    // MetadataTracker 接口
    @Override
    Map<UUID, Map<String, Object>> getMetadata() {
        return [
            (killerData.entity.uniqueId): [:],
            (entityData.entity.uniqueId): [:]
        ]
    }

    @Override
    void handle() {
        // 过滤出对应类型的属性
        def components = (killerData cp entityData).filterAttributes(type)

        for (def component in components) {
            // 调用属性的 onExtHandler 方法
            if (component.onExtHandler(this, killerData.entity, entityData.entity)) {
                if (!cancelled) {
                    trigger(component)
                }
            }
        }
    }
}

扩展属性源

可搭配开发文档一同使用

Groovy
Groovy