Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add configurable maximum durability feature via config key "Item-Durability" #16

Open
wants to merge 13 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/main/java/com/cjcrafter/armormechanics/ArmorMechanics.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ class ArmorMechanics : JavaPlugin() {
pm.registerEvents(ArmorUpdateListener(), this)
pm.registerEvents(BlockPlaceListener(), this)
pm.registerEvents(DamageMechanicListener(), this)
pm.registerEvents(DurabilityListener(), this)
pm.registerEvents(ImmunePotionCanceller(), this)
pm.registerEvents(PreventRemoveListener(), this)

Expand Down Expand Up @@ -201,6 +202,8 @@ class ArmorMechanics : JavaPlugin() {
}

companion object {
val DURABILITY_PRE = ChatColor.GRAY.toString() + "Durability: "
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
val DURABILITY = DURABILITY_PRE + ChatColor.GREEN + "%d" + ChatColor.WHITE + "/" + ChatColor.GREEN + "%d"
lateinit var INSTANCE: ArmorMechanics
}
}
24 changes: 22 additions & 2 deletions src/main/java/com/cjcrafter/armormechanics/ArmorSerializer.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.cjcrafter.armormechanics

import me.deecaad.core.compatibility.CompatibilityAPI
import com.cjcrafter.armormechanics.durability.DurabilityManager.setDurability
import com.cjcrafter.armormechanics.durability.DurabilityManager.setMaxDurability
import me.deecaad.core.file.SerializeData
import me.deecaad.core.file.SerializerException
import me.deecaad.core.file.serializers.ItemSerializer
import me.deecaad.core.utils.AdventureUtil
import me.deecaad.weaponmechanics.utils.CustomTag
import org.bukkit.inventory.ItemStack
import javax.annotation.Nonnull
Expand All @@ -20,6 +20,26 @@ class ArmorSerializer : ItemSerializer() {
"Material was not a valid armor type",
SerializerException.forValue(item.type)
)


if (data.has("Item-Durability")) {
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
val durability = data.of("Item-Durability").getInt(0)
if (durability > 0) {
setDurability(item, durability)
setMaxDurability(item, durability)
val meta = item.itemMeta
val lore = ArrayList<String>()
if (meta!!.hasLore()) {
lore.addAll(meta.lore!!)
}
lore.add(String.format(ArmorMechanics.DURABILITY, durability, durability))
meta.lore = lore
item.itemMeta = meta
}
}



val title = data.key
val effect = data.of("Bonus_Effects").serialize(BonusEffect::class.java)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package com.cjcrafter.armormechanics.listeners

import com.cjcrafter.armormechanics.durability.DurabilityManager.changeDurability
import com.cjcrafter.armormechanics.durability.DurabilityManager.getDurability
import me.deecaad.core.compatibility.CompatibilityAPI
import org.bukkit.Material
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.inventory.PrepareAnvilEvent
import org.bukkit.event.inventory.PrepareItemCraftEvent
import org.bukkit.event.player.PlayerItemDamageEvent
import org.bukkit.event.player.PlayerItemMendEvent
import org.bukkit.inventory.ItemStack

class DurabilityListener : Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
fun onItemDamaged(event: PlayerItemDamageEvent) {
changeDurability(event.item, -event.damage)
}

@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
fun onItemMend(event: PlayerItemMendEvent) {
changeDurability(event.item, event.repairAmount)
}

@EventHandler
fun onRepairAnvil(event: PrepareAnvilEvent) {
var totalDurability = 0
val contents = event.inventory.contents.filter{ it != null && it.type != Material.AIR }
if (contents.size != 2) {
event.result = null
return
}
val resultItem: ItemStack = event.result ?: return
val titles = ArrayList<String>()
contents.forEach { item ->
if(item != null && item.type.maxDurability > 0) {
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
val title =
CompatibilityAPI.getNBTCompatibility().getString(item, "ArmorMechanics", "armor-title")
titles.add(title)
totalDurability += getDurability(item)
}
}
if(titles.distinct().size != 1) {
event.result = null
return
}
changeDurability(resultItem, totalDurability-getDurability(resultItem))
event.result = resultItem
}
/*
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
@EventHandler
fun onRepairItem(event: InventoryClickEvent) {
println("Asama 1")
val damageable = event.currentItem?.itemMeta as? Damageable ?: return
if ((event.clickedInventory == null || event.clickedInventory!!.type != InventoryType.ANVIL
|| event.slotType != InventoryType.SlotType.RESULT || event.currentItem == null) || event.currentItem!!.type.isAir || getDurability(
event.currentItem!!
) == -1
) {
return
}
println("Asama 2")
val item = event.currentItem!!.clone()
val otherItems = event.clickedInventory!!.contents.filterNotNull().filter { it != event.currentItem }
println(otherItems.map { it?.itemMeta?.displayName })
val titles = ArrayList<String>()
otherItems.forEach { item ->
if(item != null && item.type.maxDurability > 0) {
val title =
CompatibilityAPI.getNBTCompatibility().getString(item, "ArmorMechanics", "armor-title")
titles.add(title)
}
}
if(titles.distinct().size != 1) {
event.currentItem = null
return
}
val totalDurability = otherItems.sumOf { getDurability(it) }
println(totalDurability)
val maxDurability = getMaxDurability(event.currentItem!!)
val newDurability = maxDurability - totalDurability
changeDurability(item, newDurability)
event.currentItem = item
}
*/

@EventHandler
fun onRepairCraft(event: PrepareItemCraftEvent) {
if(!event.isRepair) return
var totalDurability = 0
val contents = event.inventory.contents.drop(1).filter{ it != null && it.type != Material.AIR }
val resultItem: ItemStack = contents[0].clone()
val titles = ArrayList<String>()
contents.forEach { item ->
if(item != null && item.type.maxDurability > 0) {
val title =
CompatibilityAPI.getNBTCompatibility().getString(item, "ArmorMechanics", "armor-title")
titles.add(title)
totalDurability += getDurability(item)
}
}
if(titles.distinct().size != 1) {
event.inventory.result = null
return
}
changeDurability(resultItem, totalDurability-getDurability(resultItem))
event.inventory.result = resultItem
}
}
79 changes: 79 additions & 0 deletions src/main/java/com/cjcrafter/durability/DurabilityManager.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.cjcrafter.armormechanics.durability

import com.cjcrafter.armormechanics.ArmorMechanics
import org.bukkit.NamespacedKey
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.Damageable
import org.bukkit.inventory.meta.ItemMeta
import org.bukkit.persistence.PersistentDataType
import java.util.List

object DurabilityManager {
private val DURABILITY: NamespacedKey = NamespacedKey(ArmorMechanics.INSTANCE, "armor-durability")
private val DURABILITY_MAX: NamespacedKey = NamespacedKey(ArmorMechanics.INSTANCE, "armor-durability-max")
fun changeDurability(item: ItemStack, change: Int) {
if (getDurability(item) == -1) {
return
}
var durability = getDurability(item)
val maxDurability = getMaxDurability(item)
durability = Math.min(durability + change, maxDurability)
setDurability(item, durability)
val damageable = item.itemMeta
if (damageable !is Damageable) {
return
}

if (durability > 0) {



damageable.damage = item.type.maxDurability - (durability*item.type.maxDurability)/maxDurability
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
if (damageable.hasLore()) {
val lore: ArrayList<String> = ArrayList<String>(damageable.getLore())
for (i in lore.indices) {
if (lore[i].startsWith(ArmorMechanics.DURABILITY_PRE)) {
lore[i] = java.lang.String.format(ArmorMechanics.DURABILITY, durability, maxDurability)
}
}
damageable.setLore(lore)
} else {
damageable.setLore(
List.of(
java.lang.String.format(
ArmorMechanics.DURABILITY,
durability,
maxDurability
)
)
)
}
} else {
damageable.setDamage(item.getType().getMaxDurability().toInt())
item.setAmount(0)
}
item.setItemMeta(damageable)
}

fun getMaxDurability(item: ItemStack): Int {
LiberaTeMetuMortis marked this conversation as resolved.
Show resolved Hide resolved
val meta: ItemMeta = item.getItemMeta()!!
return meta.getPersistentDataContainer().getOrDefault<Int, Int>(DURABILITY_MAX, PersistentDataType.INTEGER, -1)
}

fun getDurability(item: ItemStack): Int {
val meta: ItemMeta = item.getItemMeta()!!
return meta.getPersistentDataContainer().getOrDefault<Int, Int>(DURABILITY, PersistentDataType.INTEGER, -1)
}

fun setMaxDurability(item: ItemStack, value: Int) {
val meta: ItemMeta = item.getItemMeta()!!
meta.getPersistentDataContainer().set<Int, Int>(DURABILITY_MAX, PersistentDataType.INTEGER, value)
item.setItemMeta(meta)
}

fun setDurability(item: ItemStack, value: Int) {
val meta: ItemMeta = item.getItemMeta()!!
meta.getPersistentDataContainer().set<Int, Int>(DURABILITY, PersistentDataType.INTEGER, value)
item.setItemMeta(meta)
}
}