package minefantasy.mf2.item.tool.advanced; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import minefantasy.mf2.MineFantasyII; import minefantasy.mf2.api.helpers.CustomToolHelper; import minefantasy.mf2.api.helpers.ToolHelper; import minefantasy.mf2.api.material.CustomMaterial; import minefantasy.mf2.api.tier.IToolMaterial; import minefantasy.mf2.api.weapon.IDamageType; import minefantasy.mf2.farming.FarmingHelper; import minefantasy.mf2.item.list.CreativeTabMF; import minefantasy.mf2.item.list.ToolListMF; import minefantasy.mf2.item.tool.ToolMaterialMF; import minefantasy.mf2.item.tool.crafting.ItemSaw; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; /** * @author Anonymous Productions */ public class ItemScythe extends Item implements IToolMaterial, IDamageType { private Random rand = new Random(); private ToolMaterial toolMaterial; private String name; /** */ public ItemScythe(String name, ToolMaterial material, int rarity) { this.toolMaterial = material; this.setFull3D(); itemRarity = rarity; this.name=name; setCreativeTab(CreativeTabMF.tabOldTools); setTextureName("minefantasy2:Tool/Advanced/"+name); GameRegistry.registerItem(this, name, MineFantasyII.MODID); this.setUnlocalizedName(name); this.maxStackSize = 1; this.setMaxDamage(material.getMaxUses()); } private float baseDamage = 3.0F; @Override public ToolMaterial getMaterial() { return toolMaterial; } private boolean cutGrass(World world, int x, int y, int z, int r, EntityPlayer entity, boolean leaf) { boolean flag = false; ItemStack item = entity.getHeldItem(); if(item == null)return false; for(int x2 = -r; x2 <= r; x2 ++) { for(int y2 = -r; y2 <= r; y2 ++) { for(int z2 = -r; z2 <= r; z2 ++) { Block block = world.getBlock(x+x2, y+y2, z+z2); int meta = world.getBlockMetadata(x+x2, y+y2, z+z2); if(block != null) { Material m = block.getMaterial(); if(canCutMaterial(m, block.getBlockHardness(world, x+x2, y+y2, z+z2), leaf)) { if(getDistance(x+x2, y+y2, z+z2, x, y, z) < r*1) { flag = true; ArrayList<ItemStack> items = block.getDrops(world, x+x2, y+y2, z+z2, meta, 0); world.setBlockToAir(x+x2, y+y2, z+z2); world.playAuxSFXAtEntity(entity, 2001, x+x2, y+y2, z+z2, Block.getIdFromBlock(block) + (world.getBlockMetadata(x+x2, y+y2, z+z2) << 16)); tryBreakFarmland(world, x+x2, y+y2-1, z+z2); if(!entity.capabilities.isCreativeMode) { ItemSaw.tirePlayer(entity, 1F); for (ItemStack drop : items) { if (world.rand.nextFloat() <= 1.0F) { dropBlockAsItem_do(world, x+x2, y+y2, z+z2, drop); } } } item.damageItem(1, entity); } } } } } } return flag; } private void tryBreakFarmland(World world, int x, int y, int z) { Block base = world.getBlock(x, y, z); if(base != null && base == Blocks.farmland && FarmingHelper.didHarvestRuinBlock(world, true)) { world.setBlock(x, y, z, Blocks.dirt); } } protected void dropBlockAsItem_do(World world, int x, int y, int z, ItemStack drop) { if (!world.isRemote && world.getGameRules().getGameRuleBooleanValue("doTileDrops")) { float var6 = 0.7F; double var7 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; double var9 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; double var11 = world.rand.nextFloat() * var6 + (1.0F - var6) * 0.5D; EntityItem var13 = new EntityItem(world, x + var7, y + var9, z + var11, drop); var13.delayBeforeCanPickup = 10; world.spawnEntityInWorld(var13); } } private boolean canCutMaterial(Material m, float str, boolean leaf) { if(!leaf) { if(str <= 0.0F) { return m == Material.vine || m == Material.plants || m == Material.grass ;} else return false; } return m == Material.leaves || m == Material.vine; } public double getDistance(double x, double y, double z, int posX, int posY, int posZ) { double var7 = posX - x; double var9 = posY - y; double var11 = posZ - z; return MathHelper.sqrt_double(var7 * var7 + var9 * var9 + var11 * var11); } @Override public boolean onItemUse(ItemStack hoe, EntityPlayer player, World world, int x, int y, int z, int facing, float pitch, float yaw, float pan) { if (!player.canPlayerEdit(x, y, z, facing, hoe) || !ItemSaw.canAcceptCost(player)) { return false; } else { Block block = world.getBlock(x, y, z); if(block != null) { Material m = block.getMaterial(); float hard = block.getBlockHardness(world, x, y, z); if(this.canCutMaterial(m, hard, false)) { if(cutGrass(world, x, y, z, 5, player, false)) { player.swingItem(); } } else if(this.canCutMaterial(m, hard, true)) { if(cutGrass(world, x, y, z, 3, player, true)) { player.swingItem(); } } } } return false; } @Override public float[] getDamageRatio(Object... implement) { return new float[]{1,0, 2}; } @Override public float getPenetrationLevel(Object implement) { return 0F; } //===================================================== CUSTOM START =============================================================\\ private boolean isCustom = false; public ItemScythe setCustom(String s) { canRepair = false; setTextureName("minefantasy2:custom/tool/"+s+"/"+name); isCustom = true; return this; } public ItemScythe setBaseDamage(float baseDamage) { this.baseDamage = baseDamage; return this; } private float efficiencyMod = 1.0F; public ItemScythe setEfficiencyMod(float efficiencyMod) { this.efficiencyMod = efficiencyMod; return this; } @Override public Multimap getAttributeModifiers(ItemStack item) { Multimap map = HashMultimap.create(); map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0)); return map; } /** * Gets a stack-sensitive value for the melee dmg */ protected float getMeleeDamage(ItemStack item) { return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity()); } protected float getWeightModifier(ItemStack stack) { return CustomToolHelper.getWeightModifier(stack, 1.0F); } private IIcon detailTex = null; private IIcon haftTex = null; @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister reg) { if(isCustom) { haftTex = reg.registerIcon(this.getIconString()+"_haft"); detailTex = reg.registerIcon(this.getIconString()+"_detail"); } super.registerIcons(reg); } @Override @SideOnly(Side.CLIENT) public boolean requiresMultipleRenderPasses() { return isCustom; } //Returns the number of render passes this item has. @Override public int getRenderPasses(int metadata) { return 3; } @Override public IIcon getIcon(ItemStack stack, int pass) { if(isCustom && pass == 1 && haftTex != null) { return haftTex; } if(isCustom && pass == 2 && detailTex != null) { return detailTex; } return super.getIcon(stack, pass); } @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack item, int layer) { return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer)); } @Override public int getMaxDamage(ItemStack stack) { return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack)); } public ItemStack construct(String main, String haft) { return CustomToolHelper.construct(this, main, haft); } protected int itemRarity; @Override public EnumRarity getRarity(ItemStack item) { return CustomToolHelper.getRarity(item, itemRarity); } @Override public float getDigSpeed(ItemStack stack, Block block, int meta) { if (!ForgeHooks.isToolEffective(stack, block, meta)) { return this.func_150893_a(stack, block); } return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod); } @Override public int getHarvestLevel(ItemStack stack, String toolClass) { return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass)); } @Override public void getSubItems(Item item, CreativeTabs tab, List list) { if(isCustom) { ArrayList<CustomMaterial> metal = CustomMaterial.getList("metal"); Iterator iteratorMetal = metal.iterator(); while(iteratorMetal.hasNext()) { CustomMaterial customMat = (CustomMaterial) iteratorMetal.next(); if(MineFantasyII.isDebug() || customMat.getItem() != null) { list.add(this.construct(customMat.name,"OakWood")); } } } else { super.getSubItems(item, tab, list); } } @Override public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra) { if(isCustom) { CustomToolHelper.addInformation(item, list); } super.addInformation(item, user, list, extra); } @Override @SideOnly(Side.CLIENT) public String getItemStackDisplayName(ItemStack item) { String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name"; return CustomToolHelper.getLocalisedName(item, unlocalName); } //====================================================== CUSTOM END ==============================================================\\ }