Merged in the change to ISpecialArmor to introduce the DamageSource argument.
As well as the concept of damage absorption vs reduction.
This commit is contained in:
parent
2ea1775224
commit
408d2a9d62
4 changed files with 135 additions and 45 deletions
|
@ -5,16 +5,23 @@
|
|||
|
||||
package net.minecraft.src.forge;
|
||||
|
||||
public class ArmorProperties {
|
||||
public int damageRemove = 0;
|
||||
public boolean allowRegularComputation = false;
|
||||
public class ArmorProperties
|
||||
{
|
||||
public double damageReduce = 0;
|
||||
public int damageAbsorb = 0;
|
||||
|
||||
public ArmorProperties () {
|
||||
|
||||
}
|
||||
|
||||
public ArmorProperties (int damageRemove, boolean allowRegularCompuation) {
|
||||
this.damageRemove = damageRemove;
|
||||
this.allowRegularComputation = allowRegularCompuation;
|
||||
public ArmorProperties () {}
|
||||
/**
|
||||
* Create an ArmorProperties describing the damage reduction.
|
||||
*
|
||||
* @param absorb Damage absorption. Removed from damage before damage
|
||||
* reduction computation is applied.
|
||||
* @param reduce Damage reduction, percentage of damage absorbed by
|
||||
* armor where 1.0 =100%. A full set of diamond armor is 80%.
|
||||
*/
|
||||
public ArmorProperties (int absorb, double reduce)
|
||||
{
|
||||
damageReduce = reduce;
|
||||
damageAbsorb = absorb;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,8 +5,10 @@
|
|||
|
||||
package net.minecraft.src.forge;
|
||||
|
||||
import net.minecraft.src.DamageSource;
|
||||
import net.minecraft.src.EntityPlayer;
|
||||
import net.minecraft.src.ItemArmor;
|
||||
import net.minecraft.src.ItemStack;
|
||||
|
||||
/**
|
||||
* This interface is to be implemented by ItemArmor classes. It will allow to
|
||||
|
@ -15,11 +17,32 @@ import net.minecraft.src.ItemArmor;
|
|||
*
|
||||
* @see ItemArmor
|
||||
*/
|
||||
public interface ISpecialArmor {
|
||||
public interface ISpecialArmor
|
||||
{
|
||||
/**
|
||||
* Apply an armor effect to incoming damage. This should both compute
|
||||
* the damage reduction properties of the armor against the incoming
|
||||
* damage, and reduce the armor durability if appropriate. If the
|
||||
* armor is destroyed, decrement the stack size of the ItemStack. It
|
||||
* will then be cleaned up automatically.
|
||||
*
|
||||
* @param player The player wearing the armor.
|
||||
* @param damageSource The source of the damage, which can be used to alter armor
|
||||
* properties based on the type or source of damage.
|
||||
* @param armor The ItemStack of the armor item itself. If you should
|
||||
* need the index in damageArmor, use the armorType field in the item.
|
||||
* @param damage The damage being applied to the armor.
|
||||
*
|
||||
*/
|
||||
public ArmorProperties getProperties(EntityPlayer player, DamageSource damageSource, ItemStack armor, int damage);
|
||||
|
||||
/**
|
||||
* Return extra properties for the armor
|
||||
* Get the displayed effective armor.
|
||||
*
|
||||
* @param player The player wearing the armor.
|
||||
* @param armor The ItemStack of the armor item itself. If you should
|
||||
* need the index in damageArmor, use the armorType field in the item.
|
||||
* @return The number of armor points for display, 2 per shield.
|
||||
*/
|
||||
public ArmorProperties getProperties(EntityPlayer player,
|
||||
int intitialDamage, int currentDamage);
|
||||
public abstract int getArmorDisplay(EntityPlayer player, ItemStack armor);
|
||||
}
|
||||
|
|
|
@ -93,34 +93,64 @@
|
|||
public boolean canHarvestBlock(Block block)
|
||||
{
|
||||
return inventory.canHarvestBlock(block);
|
||||
@@ -768,7 +824,25 @@
|
||||
@@ -768,8 +824,54 @@
|
||||
{
|
||||
i = 1 + i >> 1;
|
||||
}
|
||||
- i = applyArmorCalculations(damagesource, i);
|
||||
- i = applyPotionDamageCalculations(damagesource, i);
|
||||
+
|
||||
+ boolean doRegularComputation = true;
|
||||
+ int initialDamage = i;
|
||||
+ int absorb = 0;
|
||||
+ int reduce = 0;
|
||||
+
|
||||
+ for (ItemStack stack : inventory.armorInventory)
|
||||
+ for (int x = 0; x < inventory.armorInventory.length; x++)
|
||||
+ {
|
||||
+ if (stack != null && stack.getItem() instanceof ISpecialArmor)
|
||||
+ ItemStack stack = inventory.armorInventory[x];
|
||||
+ if (stack == null)
|
||||
+ {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (stack.getItem() instanceof ISpecialArmor)
|
||||
+ {
|
||||
+ ISpecialArmor armor = (ISpecialArmor)stack.getItem();
|
||||
+ ArmorProperties props = armor.getProperties(this, initialDamage, i);
|
||||
+ i = i - props.damageRemove;
|
||||
+ doRegularComputation = doRegularComputation && props.allowRegularComputation;
|
||||
+ ArmorProperties props = armor.getProperties(this, damagesource, stack, i);
|
||||
+ absorb += props.damageAbsorb;
|
||||
+ reduce += props.damageReduce;
|
||||
+ }
|
||||
+ else if (stack.getItem() instanceof ItemArmor && !damagesource.isUnblockable())
|
||||
+ {
|
||||
+ reduce += ((ItemArmor)stack.getItem()).damageReduceAmount / 25.0;
|
||||
+ stack.damageItem((i / 4 == 0 ? 1 : i / 4), this);
|
||||
+ }
|
||||
+
|
||||
+ if (inventory.armorInventory[x] != null)
|
||||
+ {
|
||||
+ stack.onItemDestroyedByUse(this);
|
||||
+ inventory.armorInventory[x] = null;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (doRegularComputation)
|
||||
+ i -= absorb;
|
||||
+ if (i <= 0)
|
||||
+ {
|
||||
+ i = applyArmorCalculations(damagesource, i);
|
||||
+ return;
|
||||
+ }
|
||||
i = applyPotionDamageCalculations(damagesource, i);
|
||||
+
|
||||
+ reduce = Math.min(25, 25 * reduce);
|
||||
+ int damage = i * (25 - reduce) + carryoverDamage;
|
||||
+ carryoverDamage = damage % 25;
|
||||
+ damage /= 25;
|
||||
+ if (damage <= 0)
|
||||
+ {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ i = applyPotionDamageCalculations(damagesource, damage);
|
||||
addExhaustion(damagesource.getHungerDamage());
|
||||
health -= i;
|
||||
@@ -815,7 +889,9 @@
|
||||
}
|
||||
@@ -815,7 +917,9 @@
|
||||
|
||||
public void destroyCurrentEquippedItem()
|
||||
{
|
||||
|
@ -130,7 +160,7 @@
|
|||
}
|
||||
|
||||
public double getYOffset()
|
||||
@@ -947,6 +1023,11 @@
|
||||
@@ -947,6 +1051,11 @@
|
||||
|
||||
public EnumStatus sleepInBedAt(int i, int j, int k)
|
||||
{
|
||||
|
|
|
@ -103,34 +103,64 @@
|
|||
public boolean canHarvestBlock(Block block)
|
||||
{
|
||||
return inventory.canHarvestBlock(block);
|
||||
@@ -711,7 +770,25 @@
|
||||
@@ -711,8 +770,54 @@
|
||||
{
|
||||
i = 1 + i >> 1;
|
||||
}
|
||||
- i = applyArmorCalculations(damagesource, i);
|
||||
- i = applyPotionDamageCalculations(damagesource, i);
|
||||
+
|
||||
+ boolean doRegularComputation = true;
|
||||
+ int initialDamage = i;
|
||||
+ int absorb = 0;
|
||||
+ int reduce = 0;
|
||||
+
|
||||
+ for (ItemStack stack : inventory.armorInventory)
|
||||
+ for (int x = 0; x < inventory.armorInventory.length; x++)
|
||||
+ {
|
||||
+ if (stack != null && stack.getItem() instanceof ISpecialArmor)
|
||||
+ ItemStack stack = inventory.armorInventory[x];
|
||||
+ if (stack == null)
|
||||
+ {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (stack.getItem() instanceof ISpecialArmor)
|
||||
+ {
|
||||
+ ISpecialArmor armor = (ISpecialArmor)stack.getItem();
|
||||
+ ArmorProperties props = armor.getProperties(this, initialDamage, i);
|
||||
+ i = i - props.damageRemove;
|
||||
+ doRegularComputation = doRegularComputation && props.allowRegularComputation;
|
||||
+ ArmorProperties props = armor.getProperties(this, damagesource, stack, i);
|
||||
+ absorb += props.damageAbsorb;
|
||||
+ reduce += props.damageReduce;
|
||||
+ }
|
||||
+ else if (stack.getItem() instanceof ItemArmor && !damagesource.isUnblockable())
|
||||
+ {
|
||||
+ reduce += ((ItemArmor)stack.getItem()).damageReduceAmount / 25.0;
|
||||
+ stack.damageItem((i / 4 == 0 ? 1 : i / 4), this);
|
||||
+ }
|
||||
+
|
||||
+ if (inventory.armorInventory[x] != null)
|
||||
+ {
|
||||
+ stack.onItemDestroyedByUse(this);
|
||||
+ inventory.armorInventory[x] = null;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (doRegularComputation)
|
||||
+ i -= absorb;
|
||||
+ if (i <= 0)
|
||||
+ {
|
||||
+ i = applyArmorCalculations(damagesource, i);
|
||||
+ return;
|
||||
+ }
|
||||
i = applyPotionDamageCalculations(damagesource, i);
|
||||
+
|
||||
+ reduce = Math.min(25, 25 * reduce);
|
||||
+ int damage = i * (25 - reduce) + carryoverDamage;
|
||||
+ carryoverDamage = damage % 25;
|
||||
+ damage /= 25;
|
||||
+ if (damage <= 0)
|
||||
+ {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ i = applyPotionDamageCalculations(damagesource, damage);
|
||||
addExhaustion(damagesource.getHungerDamage());
|
||||
health -= i;
|
||||
@@ -758,7 +835,9 @@
|
||||
}
|
||||
@@ -758,7 +863,9 @@
|
||||
|
||||
public void destroyCurrentEquippedItem()
|
||||
{
|
||||
|
@ -140,7 +170,7 @@
|
|||
}
|
||||
|
||||
public double getYOffset()
|
||||
@@ -884,6 +963,11 @@
|
||||
@@ -884,6 +991,11 @@
|
||||
|
||||
public EnumStatus sleepInBedAt(int i, int j, int k)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue