package minefantasy.mf2.item.weapon; import java.util.List; import minefantasy.mf2.api.helpers.TacticalManager; import minefantasy.mf2.api.weapon.WeaponClass; import minefantasy.mf2.config.ConfigWeapon; import minefantasy.mf2.item.tool.ToolMaterialMF; import mods.battlegear2.api.shield.IShield; import mods.battlegear2.api.weapons.IExtendedReachWeapon; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; /** * @author Anonymous Productions */ public class ItemSpearMF extends ItemWeaponMF implements IExtendedReachWeapon { /** * The spear is for the defensive player, it has a long reach, knockback and can be thrown. * Spears are good for keeping enemies at a distance, Parrying is easier when sneaking * * These are for the defensive player */ public ItemSpearMF(String name, ToolMaterial material, int rarity, float weight) { super(material, name, rarity, weight); } @Override public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return offhand==null || offhand.getItem() instanceof IShield; } @Override public boolean isOffhandHandDual(ItemStack off) { return false; } @Override public boolean sheatheOnBack(ItemStack item) { return true; } @Override public float getReachModifierInBlocks(ItemStack stack) { return 3.0F; } @Override public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { super.addInformation(item, user, list, extra); if(material != ToolMaterial.WOOD) { list.add(EnumChatFormatting.DARK_GREEN+ StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 0, decimal_format.format(getMountedDamage()), StatCollector.translateToLocal("attribute.weapon.mountedBonus"))); } } @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) || this instanceof ItemLance) { return damage; } EntityLivingBase target = (EntityLivingBase)hit; if(wielder.isRiding() && tryPerformAbility(wielder, charge_cost)) { ItemWaraxeMF.brutalise(wielder, target, 1.0F); return damage + getMountedDamage(); } if(!wielder.isRiding() && wielder.isSprinting()) { if(this instanceof ItemHalbeardMF) { return Math.max(damage/1.25F, 1.0F); } else { return damage*1.25F; } } return damage; } @Override public boolean playCustomParrySound(EntityLivingBase blocker, Entity attacker, ItemStack weapon) { blocker.worldObj.playSoundAtEntity(blocker, "minefantasy2:weapon.wood_parry", 1.0F, 0.8F); return true; } @Override public void onParry(DamageSource source, EntityLivingBase user, Entity attacker, float dam) { super.onParry(source, user, attacker, dam); if(ConfigWeapon.useBalance && user instanceof EntityPlayer) { TacticalManager.throwPlayerOffBalance((EntityPlayer)user, getBalance(), rand.nextBoolean()); } } private float getMountedDamage() { if(material == ToolMaterial.WOOD) { return 0; } return 4F; } @Override protected int getParryDamage(float dam) { return (int)dam; } /** * Gets the angle the weapon can parry */ @Override public float getParryAngleModifier(EntityLivingBase user) { return user.isSneaking() ? 1.2F: 0.85F; } @Override public float getBalance() { return 0.5F; } @Override protected float getKnockbackStrength() { return 2.5F; } @Override protected boolean canAnyMobParry() { return false; } @Override public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSpear; } /** * gets the time after being hit your guard will be let down */ @Override public int getParryCooldown(DamageSource source, float dam, ItemStack weapon) { return spearParryTime; } @Override protected float getStaminaMod() { return spearStaminaCost; } @Override public WeaponClass getWeaponClass() { return WeaponClass.POLEARM; } @Override protected float[] getWeaponRatio(ItemStack implement) { return spearRatio; } @Override public boolean canCounter() { return false; } }