class BaguetteOfWisdom(stack: ItemStack) : PylonItem(stack), PylonInteractor {
companion object {
val STORED_XP_KEY = NamespacedKey(MyAddon.getInstance(), "stored_xp")
}
private val xpCapacity = settings.getOrThrow("xp-capacity", Int::class.java)
override fun getPlaceholders() =
listOf(
PylonArgument.of("xp_capacity", UnitFormat.EXPERIENCE.format(xpCapacity)),
PylonArgument.of("stored_xp", UnitFormat.EXPERIENCE.format(getStoredXp()))
)
override fun onUsedToRightClick(event: PlayerInteractEvent) {
if (event.player.isSneaking) {
// 1. Read how much XP we already have stored
val xp = storedXp
// 2. Give all the XP to the player
event.player.giveExp(xp)
// 3. Set the stored XP to 0
storedXp = 0
} else {
// 1. Read how much XP we already have stored
val xp = storedXp
// 2. Figure out how much XP we need to take to get to `xpCapacity`
val extraXpNeeded = xpCapacity - xp
// 3. Take as much XP from the player as we can to get there
val xpToTake = min(event.player.calculateTotalExperiencePoints(), extraXpNeeded)
event.player.giveExp(-xpToTake)
// 4. Set the new stored XP amount
storedXp = xp + xpToTake
}
}
var storedXp: Int
get() = stack.persistentDataContainer.get(
NamespacedKey(MyAddon.instance, "stored_xp"),
PylonSerializers.INTEGER
)!!
set(value) {
stack.editPersistentDataContainer { pdc ->
pdc.set(
NamespacedKey(MyAddon.instance, "stored_xp"),
PylonSerializers.INTEGER,
value
)
}
}
}