Fix ISpecialArmor to allow for "Unblockable" damage to be handled if the armor opts in. (#4964)
This commit is contained in:
parent
74c3aab720
commit
19de6cf97e
1 changed files with 26 additions and 10 deletions
|
@ -86,6 +86,19 @@ public interface ISpecialArmor
|
||||||
*/
|
*/
|
||||||
void damageArmor(EntityLivingBase entity, @Nonnull ItemStack stack, DamageSource source, int damage, int slot);
|
void damageArmor(EntityLivingBase entity, @Nonnull ItemStack stack, DamageSource source, int damage, int slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple check to see if the armor should interact with "Unblockable" damage
|
||||||
|
* sources. A fair number of vanilla damage sources have this tag, such as
|
||||||
|
* Anvils, Falling, Fire, and Magic.
|
||||||
|
*
|
||||||
|
* Returning true here means that the armor is able to meaningfully respond
|
||||||
|
* to this damage source. Otherwise, no interaction is allowed.
|
||||||
|
*/
|
||||||
|
default boolean handleUnblockableDamage(EntityLivingBase entity, @Nonnull ItemStack armor, DamageSource source, double damage, int slot)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public static class ArmorProperties implements Comparable<ArmorProperties>
|
public static class ArmorProperties implements Comparable<ArmorProperties>
|
||||||
{
|
{
|
||||||
public int Priority = 0;
|
public int Priority = 0;
|
||||||
|
@ -118,11 +131,6 @@ public interface ISpecialArmor
|
||||||
*/
|
*/
|
||||||
public static float applyArmor(EntityLivingBase entity, NonNullList<ItemStack> inventory, DamageSource source, double damage)
|
public static float applyArmor(EntityLivingBase entity, NonNullList<ItemStack> inventory, DamageSource source, double damage)
|
||||||
{
|
{
|
||||||
if (source.isUnblockable())
|
|
||||||
{
|
|
||||||
return (float)damage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
{
|
{
|
||||||
System.out.println("Start: " + damage);
|
System.out.println("Start: " + damage);
|
||||||
|
@ -131,6 +139,12 @@ public interface ISpecialArmor
|
||||||
double totalArmor = entity.getTotalArmorValue();
|
double totalArmor = entity.getTotalArmorValue();
|
||||||
double totalToughness = entity.getEntityAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getAttributeValue();
|
double totalToughness = entity.getEntityAttribute(SharedMonsterAttributes.ARMOR_TOUGHNESS).getAttributeValue();
|
||||||
|
|
||||||
|
if (source.isUnblockable())
|
||||||
|
{
|
||||||
|
totalArmor = 0;
|
||||||
|
totalToughness = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ArrayList<ArmorProperties> dmgVals = new ArrayList<ArmorProperties>();
|
ArrayList<ArmorProperties> dmgVals = new ArrayList<ArmorProperties>();
|
||||||
for (int slot = 0; slot < inventory.size(); slot++)
|
for (int slot = 0; slot < inventory.size(); slot++)
|
||||||
{
|
{
|
||||||
|
@ -144,12 +158,14 @@ public interface ISpecialArmor
|
||||||
ArmorProperties prop = null;
|
ArmorProperties prop = null;
|
||||||
if (stack.getItem() instanceof ISpecialArmor)
|
if (stack.getItem() instanceof ISpecialArmor)
|
||||||
{
|
{
|
||||||
|
if (!source.isUnblockable() || ((ISpecialArmor) stack.getItem()).handleUnblockableDamage(entity, stack, source, damage, slot)) {
|
||||||
ISpecialArmor armor = (ISpecialArmor)stack.getItem();
|
ISpecialArmor armor = (ISpecialArmor)stack.getItem();
|
||||||
prop = armor.getProperties(entity, stack, source, damage, slot).copy();
|
prop = armor.getProperties(entity, stack, source, damage, slot).copy();
|
||||||
totalArmor += prop.Armor;
|
totalArmor += prop.Armor;
|
||||||
totalToughness += prop.Toughness;
|
totalToughness += prop.Toughness;
|
||||||
}
|
}
|
||||||
else if (stack.getItem() instanceof ItemArmor)
|
}
|
||||||
|
else if (stack.getItem() instanceof ItemArmor && !source.isUnblockable())
|
||||||
{
|
{
|
||||||
ItemArmor armor = (ItemArmor)stack.getItem();
|
ItemArmor armor = (ItemArmor)stack.getItem();
|
||||||
prop = new ArmorProperties(0, 0, Integer.MAX_VALUE);
|
prop = new ArmorProperties(0, 0, Integer.MAX_VALUE);
|
||||||
|
|
Loading…
Reference in a new issue