class DurabilityMechanicsManager implements Listener {
private DurabilityMechanicFactory factory;
public DurabilityMechanicsManager(DurabilityMechanicFactory factory) {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
private void onItemDamaged(PlayerItemDamageEvent event) {
ItemStack item = event.getItem();
String itemID = OraxenItems.getIdByItem(item);
if (factory.isNotImplementedIn(itemID))
DurabilityMechanic durabilityMechanic =
(DurabilityMechanic) factory.getMechanic(itemID);
ItemMeta itemMeta = item.getItemMeta();
PersistentDataContainer persistentDataContainer =
itemMeta.getPersistentDataContainer();
int realDurabilityLeft = persistentDataContainer
.get(DurabilityMechanic.NAMESPACED_KEY, PersistentDataType.INTEGER)
if (realDurabilityLeft > 0) {
double realMaxDurability =
//because int rounded values suck
durabilityMechanic.getItemMaxDurability();
persistentDataContainer.set(DurabilityMechanic.NAMESPACED_KEY,
PersistentDataType.INTEGER, realDurabilityLeft);
((Damageable) itemMeta).setDamage((int) (item.getType()
.getMaxDurability() - realDurabilityLeft
/ realMaxDurability * item.getType().getMaxDurability()));
item.setItemMeta(itemMeta);