package minefantasy.mf2.item.weapon; import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.mechanics.EventManagerMF; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.DamageSource; /** * @author Anonymous Productions */ public class ItemWaraxeMF extends ItemWeaponMF { private float injuryChance = 0.05F; /** * The waraxe is for brutal players. It does more damage and a higher bonus when sprinting or * jumping. Waraxes are pure damage * * These are for the brutal player */ public ItemWaraxeMF(String name, ToolMaterial material, int rarity, float weight) { super(material, name, rarity, weight); } @Override public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) { float damage = super.modifyDamage(item, wielder, hit, initialDam, properHit); if(!(hit instanceof EntityLivingBase)) { return damage; } EntityLivingBase target = (EntityLivingBase)hit; if(wielder.isSprinting()) { if(wielder.fallDistance > 0 && canLunge(wielder) && tryPerformAbility(wielder, lunge_cost, !properHit, true, true, true))//LUNGE: 20 Points { return chargeAt(wielder, target, true, damage, properHit); } else if(wielder.onGround && getHeightGap(target, wielder) <= 0.5F && tryPerformAbility(wielder, charge_cost))//CHARGE: 10 points { return chargeAt(wielder, target, false, damage, properHit); } } else if(wielder.fallDistance > 0 && !wielder.isOnLadder() && tryPerformAbility(wielder, jump_cost))//JUMP: 2 points { if(properHit) brutalise(wielder, target, 1.0F); return damage * 1.25F; } return damage; } private float chargeAt(EntityLivingBase entityHitting, EntityLivingBase entityHit, boolean lunge, float dam, boolean properHit) { if(properHit) brutalise(entityHitting, entityHit, 1.0F); if(lunge) { float fallBonus = (Math.min(entityHitting.fallDistance, getMeleeDamage(entityHitting.getHeldItem())))/2F; if(entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.knockbackEntity(entityHit, entityHitting, 4F, 0.5F); TacticalManager.lungeEntity(entityHitting, entityHit, 2F, 0.1F); } if(properHit) { if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 400, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 200, 1)); } entityHitting.fallDistance -= fallBonus; } if(fallBonus > 0) { dam += fallBonus; } } else { if(properHit) { if(entityHitting.onGround && entityHit.onGround && !properHit) { entityHitting.hurtResistantTime = 20; TacticalManager.lungeEntity(entityHitting, entityHit, 1F, 0.0F); } if(properHit) { if(!entityHit.isPotionActive(Potion.moveSlowdown.id)) { entityHit.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 3)); entityHit.addPotionEffect(new PotionEffect(Potion.confusion.id, 100, 0)); } } } } return dam *1.25F; } @Override public void onProperHit(EntityLivingBase user, ItemStack weapon, Entity hit, float dam) { if(rand.nextFloat() < injuryChance && dam > 0) { hit.getEntityData().setInteger(EventManagerMF.injuredNBT, 200 + rand.nextInt(600)); } super.onProperHit(user, weapon, hit, dam); } /** * Determines if sprint-jump lunges work */ private boolean canLunge(EntityLivingBase entityHitting) { return true; } private double getHeightGap(EntityLivingBase entityHit, EntityLivingBase entityHitting) { double a = entityHitting.posY - entityHit.posY; return Math.max(a, -a); } @Override public float getDigSpeed(ItemStack itemstack, Block block, int metadata) { if(Items.iron_axe.getDigSpeed(itemstack, block, metadata) > 2.0F) { return material.getEfficiencyOnProperMaterial()*0.75F; } return super.getDigSpeed(itemstack, block, metadata); } public static void brutalise(EntityLivingBase entityHitting, EntityLivingBase entityHit, float power) { if(!entityHit.worldObj.isRemote) { if(entityHitting instanceof EntityPlayer) { ((EntityPlayer)entityHitting).onCriticalHit(entityHit); } } } @Override public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 1.0F); return true; } @Override public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModAxe; } @Override public float getDamageModifier() { return damageModAxe; } @Override protected float[] getWeaponRatio(ItemStack implement) { return waraxeRatio; } @Override public float getPenetrationLevel(Object implement) { return axeAPModifier; } /** * gets the time after being hit your guard will be let down */ @Override public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return axeParryTime; } @Override protected float getStaminaMod() { return axeStaminaCost; } @Override public WeaponClass getWeaponClass() { return WeaponClass.AXE; } @Override public boolean canCounter() { return true; } @Override public float[] getCounterRatio() { return spearRatio; } @Override public float getCounterDamage() { return 1.0F; } }