package minefantasy.mf2.item.weapon; import java.util.List; import minefantasy.mf2.api.stamina.StaminaBar; import mods.battlegear2.api.shield.IShield; 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.EnumChatFormatting; import net.minecraft.util.StatCollector; /** * @author Anonymous Productions */ public class ItemLance extends ItemSpearMF { /** */ public ItemLance(String name, ToolMaterial material, int rarity, float weight) { super(name, material, rarity, weight); setMaxDamage(getMaxDamage()*2); } @Override public void addInformation(ItemStack weapon, EntityPlayer user, List list, boolean extra) { super.addInformation(weapon, user, list, extra); list.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.modifier.plus."+ 0, decimal_format.format(getJoustDamage(weapon)), StatCollector.translateToLocal("attribute.weapon.joustDam"))); } @Override public boolean allowOffhand(ItemStack mainhand, ItemStack offhand) { return offhand==null || offhand.getItem() instanceof IShield; } @Override public float getReachModifierInBlocks(ItemStack stack) { return 3.0F; } @Override protected float[] getWeaponRatio(ItemStack implement) { return lanceRatio; } @Override public float modifyDamage(ItemStack item, EntityLivingBase wielder, Entity hit, float initialDam, boolean properHit) { float dam = super.modifyDamage(item, wielder, hit, initialDam, properHit); if(hit instanceof EntityLivingBase) { return joust((EntityLivingBase)hit, wielder, dam); } return dam; } @Override public boolean canWeaponParry() { return false; } //Higher stamina means more precice hits: Full stamina hits are perfect @Override public float getBalance(EntityLivingBase user) { if(StaminaBar.isSystemActive) { return 0.0F + (2*(1-StaminaBar.getStaminaDecimal(user))); } return 0.0F; } @Override protected float getKnockbackStrength() { return 5.0F; } @Override protected float getStaminaMod() { return 5.0F; } @Override public boolean canBlock() { return false; } public float joust(EntityLivingBase target, EntityLivingBase attacker, float dam) { float speedMod = 20F; float speedCap = 5F; if(attacker.isRiding()) { Entity mount = attacker.ridingEntity; float speed = (float)Math.hypot(mount.motionX, mount.motionZ) * speedMod; if(speed > speedCap)speed = speedCap; dam += getJoustDamage(target.getHeldItem()) / speedCap * speed; if(attacker instanceof EntityPlayer) { ((EntityPlayer) attacker).onCriticalHit(target); } if(target.isRiding() && speed > (speedCap/2F)) { target.dismountEntity(target.ridingEntity); target.mountEntity(null); } } return dam; } @Override public int modifyHitTime(EntityLivingBase user, ItemStack item) { return super.modifyHitTime(user, item) + speedModSpear*2; } @Override protected float getMeleeDamage(ItemStack item) { return 2F; } protected float getJoustDamage(ItemStack item) { return super.getMeleeDamage(item)*2.5F; } }