support shields for damage taken

This commit is contained in:
hyperdefined
2026-01-14 16:57:49 -05:00
parent 72a5de5ee8
commit 25e5a13095
2 changed files with 51 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
@@ -69,6 +70,14 @@ public class EntityDamage implements Listener {
EntityType mobAttackedType = event.getEntityType(); EntityType mobAttackedType = event.getEntityType();
boolean critical = event.isCritical(); boolean critical = event.isCritical();
if (playerBeingAttacked) {
Player player = (Player) event.getEntity();
if (player.isBlocking()) {
double blockedDamage = -event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING);
updateShieldDamage(player.getInventory(), blockedDamage);
}
}
// player attacks something // player attacks something
if (playerAttacking) { if (playerAttacking) {
Player player = (Player) damager; Player player = (Player) damager;
@@ -345,4 +354,45 @@ public class EntityDamage implements Listener {
playerInventory.getItemInMainHand().setItemMeta(newHeldWeaponMeta); playerInventory.getItemInMainHand().setItemMeta(newHeldWeaponMeta);
} }
} }
private void updateShieldDamage(PlayerInventory playerInventory, double damage) {
boolean isMain = playerInventory.getItemInMainHand().getType() == Material.SHIELD;
boolean isOffHand = playerInventory.getItemInOffHand().getType() == Material.SHIELD;
ItemStack heldShield;
if (isMain && isOffHand) {
heldShield = playerInventory.getItemInMainHand();
int shieldDamage = (heldShield.getItemMeta() instanceof Damageable d) ? d.getDamage() : 0;
ItemMeta newShieldMeta = toolStats.itemLore.updateArmorDamage(heldShield, damage, false);
if (newShieldMeta != null) {
if (newShieldMeta instanceof Damageable dNew) {
dNew.setDamage(shieldDamage);
}
playerInventory.getItemInMainHand().setItemMeta(newShieldMeta);
}
} else if (isMain) {
heldShield = playerInventory.getItemInMainHand();
int shieldDamage = (heldShield.getItemMeta() instanceof Damageable d) ? d.getDamage() : 0;
ItemMeta newShieldMeta = toolStats.itemLore.updateArmorDamage(heldShield, damage, false);
if (newShieldMeta != null) {
if (newShieldMeta instanceof Damageable dNew) {
dNew.setDamage(shieldDamage);
}
playerInventory.getItemInMainHand().setItemMeta(newShieldMeta);
}
} else if (isOffHand) {
heldShield = playerInventory.getItemInOffHand();
int shieldDamage = (heldShield.getItemMeta() instanceof Damageable d) ? d.getDamage() : 0;
ItemMeta newShieldMeta = toolStats.itemLore.updateArmorDamage(heldShield, damage, false);
if (newShieldMeta != null) {
if (newShieldMeta instanceof Damageable dNew) {
dNew.setDamage(shieldDamage);
}
playerInventory.getItemInOffHand().setItemMeta(newShieldMeta);
}
}
}
} }

View File

@@ -70,6 +70,7 @@ public class ItemChecker {
validItems.add(Material.CROSSBOW); validItems.add(Material.CROSSBOW);
validItems.add(Material.FISHING_ROD); validItems.add(Material.FISHING_ROD);
validItems.add(Material.ELYTRA); validItems.add(Material.ELYTRA);
validItems.add(Material.SHIELD);
// combine the lists // combine the lists
validItems.addAll(armorItems); validItems.addAll(armorItems);