pluginiPlugin

插件集成开发

在其他插件中集成 Zaphkiel 功能

概述

Zaphkiel 提供了多种方式让其他插件集成其功能,包括 API 调用、事件监听、Hook 系统等。通过这些集成方式,你可以在自己的插件中使用 Zaphkiel 的物品系统。

集成方式

1. API 集成

最直接的集成方式是使用 Zaphkiel 的 API 接口:

// 检查插件是否可用
if (Bukkit.getPluginManager().isPluginEnabled("Zaphkiel")) {
    val api = Zaphkiel.api()
    
    // 生成自定义物品
    val itemStack = api.getItemManager().generateItemStack("my_item", player)
    
    // 检查物品类型
    val itemId = api.getItemHandler().getItemId(itemStack)
}

2. 事件监听集成

监听 Zaphkiel 的事件来响应物品操作:

@EventHandler
fun onZaphkielItemBuild(event: ItemBuildEvent.Pre) {
    val item = event.item
    val player = event.player
    
    // 在物品构建时添加自定义逻辑
    if (item.id == "special_weapon") {
        event.addLore("custom_enchant", "&6特殊附魔效果")
    }
}
 
@EventHandler
fun onZaphkielItemRelease(event: ItemReleaseEvent) {
    val itemStream = event.itemStream
    
    // 在物品释放时修改属性
    if (itemStream.getZaphkielItem().id.startsWith("magic_")) {
        event.icon = Material.ENCHANTED_BOOK
    }
}

自定义 Hook 开发

创建自定义 Hook

@Component
object MyPluginHook {
    
    @SubscribeEvent
    fun onMyPluginEvent(event: MyPluginEvent) {
        // 检查是否为 Zaphkiel 物品
        val itemHandler = Zaphkiel.api().getItemHandler()
        val itemId = itemHandler.getItemId(event.itemStack)
        
        if (itemId != null) {
            // 处理 Zaphkiel 物品的特殊逻辑
            val itemData = itemHandler.getItemData(event.itemStack)
            val customValue = itemData?.getDeep("my_plugin.custom_value")?.asString()
            
            if (customValue != null) {
                // 执行自定义逻辑
                handleCustomValue(event.player, customValue)
            }
        }
    }
    
    private fun handleCustomValue(player: Player, value: String) {
        // 自定义处理逻辑
    }
}

在 Zaphkiel 物品中存储插件数据

my_special_item:
  icon: diamond
  name:
    item_name: '&6特殊物品'
  data:
    my_plugin:
      custom_value: "special_effect"
      power_level: 5
      effect_duration: 300

事件集成最佳实践

监听物品交互事件

@EventHandler
fun onZaphkielItemInteract(event: ItemEvent.Interact) {
    val itemStream = event.itemStream
    val bukkitEvent = event.bukkitEvent
    val player = bukkitEvent.player
    
    // 检查特定物品类型
    if (itemStream.getZaphkielItem().id == "teleport_wand") {
        // 处理传送逻辑
        if (event.isRightClick()) {
            handleTeleport(player, itemStream)
            event.save = true  // 标记需要保存物品更改
        }
    }
}
 
private fun handleTeleport(player: Player, itemStream: ItemStream) {
    val data = itemStream.getZaphkielData()
    val cooldown = data.getDeep("teleport.cooldown")?.asInt() ?: 0
    
    if (System.currentTimeMillis() - cooldown > 5000) {
        // 执行传送
        player.teleport(player.world.spawnLocation)
        data.putDeep("teleport.cooldown", System.currentTimeMillis())
    } else {
        player.sendMessage("&c传送冷却中...")
    }
}

监听物品构建事件

@EventHandler
fun onItemBuild(event: ItemBuildEvent.Pre) {
    val item = event.item
    val player = event.player
    
    // 为特定玩家添加个性化属性
    if (item.id == "adaptive_weapon" && player != null) {
        val playerLevel = getPlayerLevel(player)
        val damage = calculateDamage(playerLevel)
        
        event.addLore("damage_info", "&c伤害: &f$damage")
        event.itemStream.getZaphkielData().putDeep("calculated.damage", damage)
    }
}

数据持久化集成

序列化集成

class MyPluginDataManager {
    
    fun savePlayerItems(player: Player) {
        val itemSerializer = Zaphkiel.api().getItemSerializer()
        val inventory = player.inventory
        
        inventory.contents.forEachIndexed { index, itemStack ->
            if (itemStack != null && !itemStack.type.isAir) {
                val itemHandler = Zaphkiel.api().getItemHandler()
                val itemId = itemHandler.getItemId(itemStack)
                
                if (itemId != null) {
                    // 序列化 Zaphkiel 物品
                    val json = itemSerializer.serialize(itemStack)
                    saveToDatabase(player.uniqueId, index, json.toString())
                } else {
                    // 处理普通物品
                    saveVanillaItem(player.uniqueId, index, itemStack)
                }
            }
        }
    }
    
    fun loadPlayerItems(player: Player) {
        val itemSerializer = Zaphkiel.api().getItemSerializer()
        val savedItems = loadFromDatabase(player.uniqueId)
        
        savedItems.forEach { (slot, jsonData) ->
            try {
                val itemStream = itemSerializer.deserialize(jsonData)
                val itemStack = itemStream.toItemStack()
                player.inventory.setItem(slot, itemStack)
            } catch (e: Exception) {
                // 处理反序列化失败
                plugin.logger.warning("Failed to deserialize item for ${player.name}: ${e.message}")
            }
        }
    }
}

兼容性处理

版本检查

class ZaphkielIntegration {
    
    private var isZaphkielAvailable = false
    private var zaphkielVersion: String? = null
    
    fun initialize() {
        val zaphkielPlugin = Bukkit.getPluginManager().getPlugin("Zaphkiel")
        if (zaphkielPlugin != null && zaphkielPlugin.isEnabled) {
            isZaphkielAvailable = true
            zaphkielVersion = zaphkielPlugin.description.version
            
            // 检查版本兼容性
            if (isVersionCompatible(zaphkielVersion!!)) {
                setupIntegration()
            } else {
                plugin.logger.warning("Zaphkiel version $zaphkielVersion is not compatible")
            }
        }
    }
    
    private fun isVersionCompatible(version: String): Boolean {
        // 实现版本兼容性检查
        return version >= "2.0.0"
    }
    
    private fun setupIntegration() {
        // 注册事件监听器
        Bukkit.getPluginManager().registerEvents(ZaphkielEventListener(), plugin)
        
        // 初始化 API 集成
        initializeAPI()
    }
}

软依赖处理

# plugin.yml
softdepend: [Zaphkiel]
class MyPlugin : JavaPlugin() {
    
    private var zaphkielIntegration: ZaphkielIntegration? = null
    
    override fun onEnable() {
        // 检查 Zaphkiel 是否可用
        if (Bukkit.getPluginManager().isPluginEnabled("Zaphkiel")) {
            zaphkielIntegration = ZaphkielIntegration()
            zaphkielIntegration?.initialize()
            logger.info("Zaphkiel integration enabled")
        } else {
            logger.info("Zaphkiel not found, running without integration")
        }
    }
    
    fun isZaphkielAvailable(): Boolean {
        return zaphkielIntegration != null
    }
}

性能优化建议

缓存策略

class ZaphkielCache {
    
    private val itemCache = ConcurrentHashMap<String, Item>()
    private val displayCache = ConcurrentHashMap<String, Display>()
    
    fun getItem(itemId: String): Item? {
        return itemCache.computeIfAbsent(itemId) {
            Zaphkiel.api().getItemManager().getItemMap()[it]
        }
    }
    
    fun getDisplay(displayId: String): Display? {
        return displayCache.computeIfAbsent(displayId) {
            Zaphkiel.api().getItemManager().getDisplayMap()[it]
        }
    }
    
    fun clearCache() {
        itemCache.clear()
        displayCache.clear()
    }
}

异步处理

class AsyncZaphkielOperations {
    
    fun generateItemAsync(itemId: String, player: Player, callback: (ItemStack?) -> Unit) {
        Bukkit.getScheduler().runTaskAsynchronously(plugin, Runnable {
            try {
                val itemStack = Zaphkiel.api().getItemManager().generateItemStack(itemId, player)
                
                // 回到主线程执行回调
                Bukkit.getScheduler().runTask(plugin, Runnable {
                    callback(itemStack)
                })
            } catch (e: Exception) {
                plugin.logger.warning("Failed to generate item $itemId: ${e.message}")
                Bukkit.getScheduler().runTask(plugin, Runnable {
                    callback(null)
                })
            }
        })
    }
}