API Usage Guide
Integrate Zaphkiel into Your Plugin
Overview
Zaphkiel provides a complete set of API interfaces, allowing other plugin developers to easily integrate and use Zaphkiel's item system. Through the API, you can create, manage, and manipulate custom items, as well as listen to related events.
Obtain API Instance
Main API Interface
Zaphkiel's core API is provided through the ZapAPI interface:
// Obtain Zaphkiel API instance
val api = Zaphkiel.api()
// Obtain various managers
val itemHandler = api.getItemHandler()
val itemManager = api.getItemManager()
val itemUpdater = api.getItemUpdater()
val itemLoader = api.getItemLoader()
val itemSerializer = api.getItemSerializer()Legacy API (Deprecated)
// Legacy API (not recommended for use)
@Deprecated("Use ink.ptms.zaphkiel.Zaphkiel#api()")
object ZaphkielAPICore API Components
ItemHandler - Item Processor
Used to read and process Zaphkiel items:
val itemHandler = Zaphkiel.api().getItemHandler()
// Read item stream
val itemStream = itemHandler.read(itemStack)
// Obtain item instance
val item = itemHandler.getItem(itemStack)
// Obtain item ID
val itemId = itemHandler.getItemId(itemStack)
// Obtain item data
val itemData = itemHandler.getItemData(itemStack)
// Obtain unique data
val uniqueData = itemHandler.getItemUniqueData(itemStack)ItemManager - Item Manager
Manages all registered items, display templates, groups, etc.:
val itemManager = Zaphkiel.api().getItemManager()
// Obtain registered items
val itemMap = itemManager.getItemMap()
val item = itemMap["item_id"]
// Obtain display templates
val displayMap = itemManager.getDisplayMap()
// Obtain groups
val groupMap = itemManager.getGroupMap()
// Obtain metadata types
val metaMap = itemManager.getMetaMap()
// Generate items
val itemStream = itemManager.generateItem("item_id", player)
val itemStack = itemManager.generateItemStack("item_id", player)ItemUpdater - Item Updater
Handles item version updates and checks:
val itemUpdater = Zaphkiel.api().getItemUpdater()
// Check inventory for updates
itemUpdater.checkUpdate(player, inventory)
// Check single item for updates
val updatedStream = itemUpdater.checkUpdate(player, itemStack)ItemLoader - Item Loader
Loads item definitions from files:
val itemLoader = Zaphkiel.api().getItemLoader()
// Load items from file
val items = itemLoader.loadItemFromFile(file)
items.forEach { itemManager.registerItem(it) }
// Load display templates
val displays = itemLoader.loadDisplayFromFile(file)
displays.forEach { itemManager.registerDisplay(it) }
// Load metadata
val metaList = itemLoader.loadMetaFromSection(configSection)ItemSerializer - Item Serializer
Serializes and deserializes items:
val itemSerializer = Zaphkiel.api().getItemSerializer()
// Serialize item
val json = itemSerializer.serialize(itemStack)
val jsonFromStream = itemSerializer.serialize(itemStream)
// Deserialize item
val itemStream = itemSerializer.deserialize(jsonString)
val itemStreamFromJson = itemSerializer.deserialize(jsonObject)Practical API Examples
Check and Manipulate Items
fun handlePlayerInteract(player: Player, itemStack: ItemStack) {
val itemHandler = Zaphkiel.api().getItemHandler()
// Check if it is a Zaphkiel item
val itemId = itemHandler.getItemId(itemStack)
if (itemId != null) {
// Obtain item instance
val item = itemHandler.getItem(itemStack)
// Obtain item data
val itemData = itemHandler.getItemData(itemStack)
// Execute custom logic
player.sendMessage("You used a Zaphkiel item: $itemId")
}
}Give Custom Items
fun giveCustomItem(player: Player, itemId: String, amount: Int) {
val itemManager = Zaphkiel.api().getItemManager()
// Generate item
val itemStack = itemManager.generateItemStack(itemId, player)
if (itemStack != null) {
itemStack.amount = amount
// Give to player
val overflow = player.inventory.addItem(itemStack)
// Handle overflow items
overflow.values.forEach { item ->
player.world.dropItem(player.location, item)
}
}
}Check Item Updates
fun checkAndUpdateItems(player: Player) {
val itemUpdater = Zaphkiel.api().getItemUpdater()
// Check entire inventory
itemUpdater.checkUpdate(player, player.inventory)
// Or check specific item
val mainHand = player.inventory.itemInMainHand
if (!mainHand.type.isAir) {
val updatedStream = itemUpdater.checkUpdate(player, mainHand)
// The updated item stream can be further processed
}
}Serialize Item Data
fun saveItemToDatabase(itemStack: ItemStack): String? {
val itemHandler = Zaphkiel.api().getItemHandler()
val itemSerializer = Zaphkiel.api().getItemSerializer()
// Check if it is a Zaphkiel item
val itemId = itemHandler.getItemId(itemStack)
if (itemId != null) {
// Serialize to JSON
val json = itemSerializer.serialize(itemStack)
return json.toString()
}
return null
}
fun loadItemFromDatabase(jsonString: String): ItemStack? {
val itemSerializer = Zaphkiel.api().getItemSerializer()
return try {
val itemStream = itemSerializer.deserialize(jsonString)
itemStream.toItemStack()
} catch (e: Exception) {
null
}
}Advanced API Usage
Custom Item Operations
fun customItemOperations(player: Player, itemId: String) {
val itemManager = Zaphkiel.api().getItemManager()
val item = itemManager.getItemMap()[itemId] ?: return
// Check if player has the item
if (item.hasItem(player, 1)) {
// Remove item
if (item.takeItem(player, 1)) {
player.sendMessage("Item removed")
}
}
// Give item (handle overflow)
item.giveItem(player, 1) { overflow ->
overflow.forEach { item ->
player.world.dropItem(player.location, item)
}
}
// Give item or drop if inventory is full
item.giveItemOrDrop(player, 1)
}Item Similarity Check
fun checkItemSimilarity(itemStack1: ItemStack, itemStack2: ItemStack): Boolean {
val itemHandler = Zaphkiel.api().getItemHandler()
val item1 = itemHandler.getItem(itemStack1)
val item2 = itemHandler.getItem(itemStack2)
return if (item1 != null && item2 != null) {
item1.isSimilar(itemStack2)
} else {
false
}
}Event Listening
Listen to Zaphkiel Events
@EventHandler
fun onItemBuild(event: ItemBuildEvent) {
val item = event.item
val player = event.player
val itemStream = event.itemStream
// Execute custom logic when item is built
if (item.id == "special_item") {
// Modify item stream
itemStream.getZaphkielData().putDeep("custom.property", ItemTagData("value"))
}
}
@EventHandler
fun onItemRelease(event: ItemReleaseEvent) {
val itemStream = event.itemStream
val player = event.player
// Execute logic when item is released
val itemId = itemStream.getZaphkielItem().id
player.sendMessage("Released item: $itemId")
}Dependency Configuration
Maven
<dependency>
<groupId>ink.ptms.zaphkiel</groupId>
<artifactId>zaphkiel-api</artifactId>
<version>Latest Version</version>
<scope>provided</scope>
</dependency>Gradle
dependencies {
compileOnly("ink.ptms.zaphkiel:zaphkiel-api:Latest Version")
}Best Practices
1. Safety Checks
// Always check API availability
if (Bukkit.getPluginManager().isPluginEnabled("Zaphkiel")) {
val api = Zaphkiel.api()
// Use the API
}2. Exception Handling
try {
val itemStream = itemHandler.read(itemStack)
// Process the item stream
} catch (e: Exception) {
// Handle exceptions (may not be a Zaphkiel item)
}3. Performance Considerations
// Cache frequently used item instances
private val cachedItems = mutableMapOf<String, Item>()
fun getCachedItem(itemId: String): Item? {
return cachedItems.computeIfAbsent(itemId) {
Zaphkiel.api().getItemManager().getItemMap()[it]
}
}