Reimplement ItemToolAbility

I'll be very impressed if it works correctly right away. But, to my credit, it does compile
This commit is contained in:
abel1502 2025-05-17 21:55:23 +03:00
parent 634836c549
commit c190863785
No known key found for this signature in database
GPG Key ID: 076926596A536338
12 changed files with 730 additions and 1652 deletions

View File

@ -1,622 +0,0 @@
package com.hbm.handler;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.hbm.config.ToolConfig;
import com.hbm.explosion.ExplosionNT;
import com.hbm.explosion.ExplosionNT.ExAttrib;
import com.hbm.inventory.fluid.Fluids;
import com.hbm.inventory.recipes.CentrifugeRecipes;
import com.hbm.inventory.recipes.CrystallizerRecipes;
import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe;
import com.hbm.inventory.recipes.ShredderRecipes;
import com.hbm.items.ModItems;
import com.hbm.items.tool.IItemWithAbility;
import com.hbm.util.EnchantmentUtil;
import net.minecraft.block.Block;
import net.minecraft.client.resources.I18n;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public abstract class ToolAbility {
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) { return false; }
public abstract String getName();
public abstract String getFullName();
public abstract String getExtension();
public abstract boolean isAllowed();
public static class RecursionAbility extends ToolAbility {
int radius;
public RecursionAbility(int radius) {
this.radius = radius;
}
private Set<ThreeInts> pos = new HashSet();
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
Block b = world.getBlock(x, y, z);
if(b == Blocks.stone && !ToolConfig.recursiveStone)
return false;
if(b == Blocks.netherrack && !ToolConfig.recursiveNetherrack)
return false;
pos.clear();
recurse(world, x, y, z, x, y, z, player, tool, 0);
return false;
}
private static final List<ThreeInts> offsets = new ArrayList<>(3*3*3-1);
static {
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
for (int dz = -1; dz <= 1; dz++) {
if (dx != 0 || dy != 0 || dz != 0) {
offsets.add(new ThreeInts(dx, dy, dz));
}
}
}
}
}
private void recurse(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemWithAbility tool, int depth) {
List<ThreeInts> shuffledOffsets = new ArrayList<>(offsets);
Collections.shuffle(shuffledOffsets);
for(ThreeInts offset : shuffledOffsets) {
breakExtra(world, x + offset.x, y + offset.y, z + offset.z, refX, refY, refZ, player, tool, depth);
}
}
private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemWithAbility tool, int depth) {
if(pos.contains(new ThreeInts(x, y, z)))
return;
depth += 1;
if(depth > ToolConfig.recursionDepth)
return;
pos.add(new ThreeInts(x, y, z));
//don't lose the ref block just yet
if(x == refX && y == refY && z == refZ)
return;
if(Vec3.createVectorHelper(x - refX, y - refY, z - refZ).lengthVector() > radius)
return;
Block b = world.getBlock(x, y, z);
Block ref = world.getBlock(refX, refY, refZ);
int meta = world.getBlockMetadata(x, y, z);
int refMeta = world.getBlockMetadata(refX, refY, refZ);
if(!isSameBlock(b, ref))
return;
if(meta != refMeta)
return;
if(player.getHeldItem() == null)
return;
tool.breakExtraBlock(world, x, y, z, player, refX, refY, refZ);
recurse(world, x, y, z, refX, refY, refZ, player, tool, depth);
}
private boolean isSameBlock(Block b1, Block b2) {
if(b1 == b2) return true;
if((b1 == Blocks.redstone_ore && b2 == Blocks.lit_redstone_ore) || (b1 == Blocks.lit_redstone_ore && b2 == Blocks.redstone_ore)) return true;
return false;
}
@Override
public String getName() {
return "tool.ability.recursion";
}
@Override
public String getFullName() {
return I18n.format(getName()) + getExtension();
}
@Override
public String getExtension() {
return " (" + radius + ")";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityVein;
}
}
public static class HammerAbility extends ToolAbility {
int range;
public HammerAbility(int range) {
this.range = range;
}
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
for(int a = x - range; a <= x + range; a++) {
for(int b = y - range; b <= y + range; b++) {
for(int c = z - range; c <= z + range; c++) {
if(a == x && b == y && c == z)
continue;
tool.breakExtraBlock(world, a, b ,c, player, x, y, z);
}
}
}
return false;
}
@Override
public String getName() {
return "tool.ability.hammer";
}
@Override
public String getFullName() {
return I18n.format(getName()) + getExtension();
}
@Override
public String getExtension() {
return " (" + range + ")";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityHammer;
}
}
public static class HammerSilkAbility extends ToolAbility {
int range;
public HammerSilkAbility(int range) {
this.range = range;
}
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null)
return false;
ItemStack stack = player.getHeldItem();
EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1);
for(int a = x - range; a <= x + range; a++) {
for(int b = y - range; b <= y + range; b++) {
for(int c = z - range; c <= z + range; c++) {
if(a == x && b == y && c == z)
continue;
tool.breakExtraBlock(world, a, b ,c, player, x, y, z);
}
}
}
if(player instanceof EntityPlayerMP)
IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player);
EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch);
return false;
}
@Override
public String getName() {
return "tool.ability.hammersilk";
}
@Override
public String getFullName() {
return I18n.format(getName()) + getExtension();
}
@Override
public String getExtension() {
return " (" + range + ")";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityHammer;
}
}
public static class SilkAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
if(EnchantmentHelper.getSilkTouchModifier(player) || player.getHeldItem() == null)
return false;
ItemStack stack = player.getHeldItem();
EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1);
if(player instanceof EntityPlayerMP)
IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player);
EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch);
return true;
}
@Override
public String getName() {
return "tool.ability.silktouch";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public String getExtension() {
return "";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilitySilk;
}
}
public static class LuckAbility extends ToolAbility {
int luck;
public LuckAbility(int luck) {
this.luck = luck;
}
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
if(EnchantmentHelper.getFortuneModifier(player) > 0 || player.getHeldItem() == null)
return false;
ItemStack stack = player.getHeldItem();
EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, luck);
if(player instanceof EntityPlayerMP)
IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player);
EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune);
return true;
}
@Override
public String getName() {
return "tool.ability.luck";
}
@Override
public String getFullName() {
return I18n.format(getName()) + getExtension();
}
@Override
public String getExtension() {
return " (" + luck + ")";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityLuck;
}
}
public static class SmelterAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
List<ItemStack> drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
boolean doesSmelt = false;
for(int i = 0; i < drops.size(); i++) {
ItemStack stack = drops.get(i).copy();
ItemStack result = FurnaceRecipes.smelting().getSmeltingResult(stack);
if(result != null) {
result = result.copy();
result.stackSize *= stack.stackSize;
drops.set(i, result);
doesSmelt = true;
}
}
if(doesSmelt) {
world.setBlockToAir(x, y, z);
player.getHeldItem().damageItem(1, player);
for(ItemStack stack : drops)
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy()));
}
return false;
}
@Override
public String getName() {
return "tool.ability.smelter";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public String getExtension() {
return "";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityFurnace;
}
}
public static class ShredderAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
//a band-aid on a gaping wound
if(block == Blocks.lit_redstone_ore)
block = Blocks.redstone_ore;
ItemStack stack = new ItemStack(block, 1, meta);
ItemStack result = ShredderRecipes.getShredderResult(stack);
if(result != null && result.getItem() != ModItems.scrap) {
world.setBlockToAir(x, y, z);
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy()));
player.getHeldItem().damageItem(1, player);
}
return false;
}
@Override
public String getName() {
return "tool.ability.shredder";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public String getExtension() {
return "";
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityShredder;
}
}
public static class CentrifugeAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
//a band-aid on a gaping wound
if(block == Blocks.lit_redstone_ore)
block = Blocks.redstone_ore;
ItemStack stack = new ItemStack(block, 1, meta);
ItemStack[] result = CentrifugeRecipes.getOutput(stack);
if(result != null) {
world.setBlockToAir(x, y, z);
player.getHeldItem().damageItem(1, player);
for(ItemStack st : result) {
if(st != null)
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy()));
}
}
return false;
}
@Override
public String getExtension() {
return "";
}
@Override
public String getName() {
return "tool.ability.centrifuge";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityCentrifuge;
}
}
public static class CrystallizerAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
//a band-aid on a gaping wound
if(block == Blocks.lit_redstone_ore)
block = Blocks.redstone_ore;
ItemStack stack = new ItemStack(block, 1, meta);
CrystallizerRecipe result = CrystallizerRecipes.getOutput(stack, Fluids.PEROXIDE);
if(result != null) {
world.setBlockToAir(x, y, z);
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.output.copy()));
player.getHeldItem().damageItem(1, player);
}
return false;
}
@Override
public String getExtension() {
return "";
}
@Override
public String getName() {
return "tool.ability.crystallizer";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityCrystallizer;
}
}
public static class MercuryAbility extends ToolAbility {
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
//a band-aid on a gaping wound
if(block == Blocks.lit_redstone_ore)
block = Blocks.redstone_ore;
int mercury = 0;
if(block == Blocks.redstone_ore)
mercury = player.getRNG().nextInt(5) + 4;
if(block == Blocks.redstone_block)
mercury = player.getRNG().nextInt(7) + 8;
if(mercury > 0) {
world.setBlockToAir(x, y, z);
world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury)));
player.getHeldItem().damageItem(1, player);
}
return false;
}
@Override
public String getExtension() {
return "";
}
@Override
public String getName() {
return "tool.ability.mercury";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityMercury;
}
}
public static class ExplosionAbility extends ToolAbility {
float strength;
public ExplosionAbility(float strength) {
this.strength = strength;
}
@Override
public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) {
ExplosionNT ex = new ExplosionNT(player.worldObj, player, x + 0.5, y + 0.5, z + 0.5, strength);
ex.addAttrib(ExAttrib.ALLDROP);
ex.addAttrib(ExAttrib.NOHURT);
ex.addAttrib(ExAttrib.NOPARTICLE);
ex.doExplosionA();
ex.doExplosionB(false);
player.worldObj.createExplosion(player, x + 0.5, y + 0.5, z + 0.5, 0.1F, false);
return true;
}
@Override
public String getExtension() {
return " (" + strength + ")";
}
@Override
public String getName() {
return "tool.ability.explosion";
}
@Override
public String getFullName() {
return I18n.format(getName()) + getExtension();
}
@Override
public boolean isAllowed() {
return ToolConfig.abilityExplosion;
}
}
}

View File

@ -1,369 +0,0 @@
package com.hbm.handler;
import com.hbm.blocks.ModBlocks;
import com.hbm.blocks.generic.BlockBobble.BobbleType;
import com.hbm.handler.threading.PacketThreading;
import com.hbm.items.ModItems;
import com.hbm.items.tool.IItemWithAbility;
import com.hbm.lib.ModDamageSource;
import com.hbm.packet.toclient.AuxParticlePacketNT;
import com.hbm.potion.HbmPotion;
import com.hbm.util.ContaminationUtil;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import com.hbm.util.ContaminationUtil.ContaminationType;
import com.hbm.util.ContaminationUtil.HazardType;
import net.minecraft.block.Block;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityXPOrb;
import net.minecraft.entity.monster.EntityCreeper;
import net.minecraft.entity.monster.EntityMagmaCube;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.monster.EntitySkeleton;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
public abstract class WeaponAbility {
public abstract void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool);
public abstract String getName();
public abstract String getFullName();
public static class RadiationAbility extends WeaponAbility {
float rad;
public RadiationAbility(float rad) {
this.rad = rad;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase)
ContaminationUtil.contaminate((EntityLivingBase)victim, HazardType.RADIATION, ContaminationType.CREATIVE, rad);
}
@Override
public String getName() {
return "weapon.ability.radiation";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (" + rad + ")";
}
}
public static class VampireAbility extends WeaponAbility {
float amount;
public VampireAbility(float amount) {
this.amount = amount;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) victim;
if(living.getHealth() <= 0) return;
living.setHealth(living.getHealth() - amount);
if(living.getHealth() <= 0) living.onDeath(DamageSource.magic);
player.heal(amount);
}
}
@Override
public String getName() {
return "weapon.ability.vampire";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (" + amount + ")";
}
}
public static class StunAbility extends WeaponAbility {
int duration;
public StunAbility(int duration) {
this.duration = duration;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) victim;
living.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, duration * 20, 4));
living.addPotionEffect(new PotionEffect(Potion.weakness.id, duration * 20, 4));
}
}
@Override
public String getName() {
return "weapon.ability.stun";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (" + duration + ")";
}
}
public static class BlendAbility extends WeaponAbility {
int divider;
public BlendAbility(int divider) {
this.divider = divider;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) victim;
if(living.getHealth() <= 0.0F) {
int count = Math.min((int)Math.ceil(living.getMaxHealth() / divider), 250); //safeguard to prevent funnies from bosses with obscene health
world.playSoundEffect(living.posX, living.posY + living.height * 0.5, living.posZ, "mob.zombie.woodbreak", 0.5F, 1.0F);
victim.attackEntityFrom(ModDamageSource.turbofan, 100);
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "giblets");
data.setInteger("count", count * 4);
data.setInteger("ent", victim.getEntityId());
data.setInteger("cDiv", 5);
PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, victim.posX, victim.posY + victim.height * 0.5, victim.posZ), new TargetPoint(victim.dimension, victim.posX, victim.posY + victim.height * 0.5, victim.posZ, 150));
living.entityDropItem(new ItemStack(ModItems.flesh, 10, 0), 0.0F);
}
}
}
@Override
public String getName() {
return "weapon.ability.blender";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (1:" + divider + ")";
}
}
public static class PhosphorusAbility extends WeaponAbility {
int duration;
public PhosphorusAbility(int duration) {
this.duration = duration;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) victim;
living.addPotionEffect(new PotionEffect(HbmPotion.phosphorus.id, duration * 20, 4));
}
}
@Override
public String getName() {
return "weapon.ability.phosphorus";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (" + duration + ")";
}
}
public static class FireAbility extends WeaponAbility {
int duration;
public FireAbility(int duration) {
this.duration = duration;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
victim.setFire(duration);
}
}
@Override
public String getName() {
return "weapon.ability.fire";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (" + duration + ")";
}
}
public static class ChainsawAbility extends WeaponAbility {
int divider;
public ChainsawAbility(int divider) {
this.divider = divider;
}
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase) {
EntityLivingBase living = (EntityLivingBase) victim;
if(living.getHealth() <= 0.0F) {
int count = Math.min((int)Math.ceil(living.getMaxHealth() / divider), 250); //safeguard to prevent funnies from bosses with obscene health
for(int i = 0; i < count; i++) {
living.entityDropItem(new ItemStack(ModItems.nitra_small), 1);
world.spawnEntityInWorld(new EntityXPOrb(world, living.posX, living.posY, living.posZ, 1));
}
if(player instanceof EntityPlayerMP) {
NBTTagCompound data = new NBTTagCompound();
data.setString("type", "vanillaburst");
data.setInteger("count", count * 4);
data.setDouble("motion", 0.1D);
data.setString("mode", "blockdust");
data.setInteger("block", Block.getIdFromBlock(Blocks.redstone_block));
PacketThreading.createAllAroundThreadedPacket(new AuxParticlePacketNT(data, living.posX, living.posY + living.height * 0.5, living.posZ), new TargetPoint(living.dimension, living.posX, living.posY, living.posZ, 50));
}
world.playSoundEffect(living.posX, living.posY + living.height * 0.5, living.posZ, "hbm:weapon.chainsaw", 0.5F, 1.0F);
}
}
}
@Override
public String getName() {
return "weapon.ability.chainsaw";
}
@Override
public String getFullName() {
return I18n.format(getName()) + " (1:" + divider + ")";
}
}
public static class BeheaderAbility extends WeaponAbility {
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityLivingBase && ((EntityLivingBase) victim).getHealth() <= 0.0F) {
EntityLivingBase living = (EntityLivingBase) victim;
if(living instanceof EntitySkeleton) {
if(((EntitySkeleton)living).getSkeletonType() == 0) {
living.entityDropItem(new ItemStack(Items.skull, 1, 0), 0.0F);
} else {
if(world.rand.nextInt(20) == 0)
living.entityDropItem(new ItemStack(Items.skull, 1, 1), 0.0F);
else
living.entityDropItem(new ItemStack(Items.coal, 3), 0.0F);
}
} else if(living instanceof EntityZombie) {
living.entityDropItem(new ItemStack(Items.skull, 1, 2), 0.0F);
} else if(living instanceof EntityCreeper) {
living.entityDropItem(new ItemStack(Items.skull, 1, 4), 0.0F);
} else if(living instanceof EntityMagmaCube) {
living.entityDropItem(new ItemStack(Items.magma_cream, 3), 0.0F);
} else if(living instanceof EntitySlime) {
living.entityDropItem(new ItemStack(Items.slime_ball, 3), 0.0F);
} else if(living instanceof EntityPlayer) {
ItemStack head = new ItemStack(Items.skull, 1, 3);
head.stackTagCompound = new NBTTagCompound();
head.stackTagCompound.setString("SkullOwner", ((EntityPlayer) living).getDisplayName());
living.entityDropItem(head, 0.0F);
} else {
living.entityDropItem(new ItemStack(Items.rotten_flesh, 3, 0), 0.0F);
living.entityDropItem(new ItemStack(Items.bone, 2, 0), 0.0F);
}
}
}
@Override
public String getName() {
return "weapon.ability.beheader";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
}
public static class BobbleAbility extends WeaponAbility {
@Override
public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) {
if(victim instanceof EntityMob && ((EntityMob) victim).getHealth() <= 0.0F) {
EntityMob mob = (EntityMob) victim;
int chance = 1000;
if(mob.getMaxHealth() > 20) {
chance = 750;
}
if(world.rand.nextInt(chance) == 0)
mob.entityDropItem(new ItemStack(ModBlocks.bobblehead, 1, world.rand.nextInt(BobbleType.values().length - 1) + 1), 0.0F);
}
}
@Override
public String getName() {
return "weapon.ability.bobble";
}
@Override
public String getFullName() {
return I18n.format(getName());
}
}
}

View File

@ -4,6 +4,9 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.hbm.main.MainRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@ -17,10 +20,18 @@ public class AvailableAbilities {
public AvailableAbilities addAbility(IBaseAbility ability, int level) {
if (level < 0 || level >= ability.levels()) {
throw new IllegalArgumentException("Illegal level " + level + " for ability " + ability.getName());
MainRegistry.logger.warn("Illegal level " + level + " for ability " + ability.getName());
level = ability.levels() - 1;
}
if (abilities.containsKey(ability)) {
MainRegistry.logger.warn("Ability " + ability.getName() + " already had level " + abilities.get(ability) + ", overwriting with level " + level);
}
if (ability.isAllowed()) {
abilities.put(ability, level);
}
abilities.put(ability, level);
return this;
}
@ -47,6 +58,22 @@ public class AvailableAbilities {
return Collections.unmodifiableMap(abilities);
}
public Map<IWeaponAbility, Integer> getWeaponAbilities() {
return abilities.keySet().stream().filter(a -> a instanceof IWeaponAbility).collect(Collectors.toMap(a -> (IWeaponAbility)a, a -> abilities.get(a)));
}
public Map<IBaseAbility, Integer> getToolAbilities() {
return abilities.keySet().stream().filter(a -> a instanceof IToolAreaAbility || a instanceof IToolHarvestAbility).collect(Collectors.toMap(a -> a, a -> abilities.get(a)));
}
public Map<IToolAreaAbility, Integer> getToolAreaAbilities() {
return abilities.keySet().stream().filter(a -> a instanceof IToolAreaAbility).collect(Collectors.toMap(a -> (IToolAreaAbility)a, a -> abilities.get(a)));
}
public Map<IToolHarvestAbility, Integer> getToolHarvestAbilities() {
return abilities.keySet().stream().filter(a -> a instanceof IToolHarvestAbility).collect(Collectors.toMap(a -> (IToolHarvestAbility)a, a -> abilities.get(a)));
}
public int size() {
return abilities.size();
}
@ -57,12 +84,12 @@ public class AvailableAbilities {
@SideOnly(Side.CLIENT)
public void addInformation(List list) {
boolean hasToolAbilities = abilities.keySet().stream().anyMatch(a -> a instanceof IToolAreaAbility || a instanceof IToolHarvestAbility);
Map<IBaseAbility, Integer> toolAbilities = getToolAbilities();
if (hasToolAbilities) {
if (!toolAbilities.isEmpty()) {
list.add("Abilities: ");
abilities.forEach((ability, level) -> {
toolAbilities.forEach((ability, level) -> {
list.add(" " + EnumChatFormatting.GOLD + ability.getFullName(level));
});
@ -71,12 +98,12 @@ public class AvailableAbilities {
list.add("Alt-click to open ability selection GUI!");
}
boolean hasWeaponModifiers = abilities.keySet().stream().anyMatch(a -> a instanceof IWeaponAbility);
Map<IWeaponAbility, Integer> weaponAbilities = getWeaponAbilities();
if (hasWeaponModifiers) {
if (!weaponAbilities.isEmpty()) {
list.add("Weapon modifiers: ");
abilities.forEach((ability, level) -> {
weaponAbilities.forEach((ability, level) -> {
list.add(" " + EnumChatFormatting.RED + ability.getFullName(level));
});
}

View File

@ -11,7 +11,7 @@ import com.hbm.explosion.ExplosionNT;
import com.hbm.explosion.ExplosionNT.ExAttrib;
import com.hbm.handler.ThreeInts;
import com.hbm.inventory.OreDictManager;
import com.hbm.items.tool.IItemWithAbility;
import com.hbm.items.tool.ItemToolAbility;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
@ -27,18 +27,17 @@ public interface IToolAreaAbility extends IBaseAbility {
// The initial block is always implicitly broken and shouldn't be included.
// If true is returned, no block breaking is handled by the tool
// (neither for the original block nor for the extras)
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool);
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool);
// region handlers
public static final IToolAreaAbility NONE = new IToolAreaAbility() {
@Override
public String getName() {
// TODO: null? empty? otherwise i18n
return "";
}
@Override
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool) {
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) {
return false;
}
};
@ -73,7 +72,7 @@ public interface IToolAreaAbility extends IBaseAbility {
private Set<ThreeInts> pos = new HashSet<>();
@Override
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool) {
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) {
Block b = world.getBlock(x, y, z);
if(!ToolConfig.recursiveStone) {
@ -112,7 +111,7 @@ public interface IToolAreaAbility extends IBaseAbility {
}
}};
private void recurse(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemWithAbility tool, int depth, int radius) {
private void recurse(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, ItemToolAbility tool, int depth, int radius) {
List<ThreeInts> shuffledOffsets = new ArrayList<>(offsets);
Collections.shuffle(shuffledOffsets);
@ -121,7 +120,7 @@ public interface IToolAreaAbility extends IBaseAbility {
}
}
private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemWithAbility tool, int depth, int radius) {
private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, ItemToolAbility tool, int depth, int radius) {
if(pos.contains(new ThreeInts(x, y, z)))
return;
@ -190,7 +189,7 @@ public interface IToolAreaAbility extends IBaseAbility {
}
@Override
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool) {
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) {
int range = rangeAtLevel[level];
for(int a = x - range; a <= x + range; a++) {
@ -233,7 +232,7 @@ public interface IToolAreaAbility extends IBaseAbility {
}
@Override
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool) {
public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) {
float strength = strengthAtLevel[level];
ExplosionNT ex = new ExplosionNT(player.worldObj, player, x + 0.5, y + 0.5, z + 0.5, strength);
@ -249,4 +248,15 @@ public interface IToolAreaAbility extends IBaseAbility {
}
};
// endregion handlers
static final IToolAreaAbility[] abilities = {NONE, RECURSION, HAMMER, EXPLOSION};
static IToolAreaAbility getByName(String name) {
for(IToolAreaAbility ability : abilities) {
if(ability.getName().equals(name))
return ability;
}
return NONE;
}
}

View File

@ -9,7 +9,7 @@ import com.hbm.inventory.recipes.CrystallizerRecipes;
import com.hbm.inventory.recipes.ShredderRecipes;
import com.hbm.inventory.recipes.CrystallizerRecipes.CrystallizerRecipe;
import com.hbm.items.ModItems;
import com.hbm.items.tool.IItemWithAbility;
import com.hbm.items.tool.ItemToolAbility;
import com.hbm.util.EnchantmentUtil;
import net.minecraft.block.Block;
@ -37,7 +37,7 @@ public interface IToolHarvestAbility extends IBaseAbility {
player.getHeldItem().damageItem(1, player);
} else if (player instanceof EntityPlayerMP) {
// Break the block conventionally
IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player);
ItemToolAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player);
}
}
@ -45,7 +45,6 @@ public interface IToolHarvestAbility extends IBaseAbility {
public static final IToolHarvestAbility NONE = new IToolHarvestAbility() {
@Override
public String getName() {
// TODO: null? empty? otherwise i18n
return "";
}
@ -310,4 +309,15 @@ public interface IToolHarvestAbility extends IBaseAbility {
}
};
// endregion handlers
static final IToolHarvestAbility[] abilities = {NONE, SILK, LUCK, SMELTER, SHREDDER, CENTRIFUGE, CRYSTALLIZER, MERCURY};
static IToolHarvestAbility getByName(String name) {
for(IToolHarvestAbility ability : abilities) {
if(ability.getName().equals(name))
return ability;
}
return NONE;
}
}

View File

@ -42,7 +42,6 @@ public interface IWeaponAbility extends IBaseAbility {
public static final IWeaponAbility NONE = new IWeaponAbility() {
@Override
public String getName() {
// TODO: null? empty? otherwise i18n
return "";
}
@ -349,4 +348,15 @@ public interface IWeaponAbility extends IBaseAbility {
}
};
// endregion handlers
static final IWeaponAbility[] abilities = {NONE, RADIATION, VAMPIRE, STUN, BLEND, PHOSPHORUS, FIRE, CHAINSAW, BEHEADER, BOBBLE};
static IWeaponAbility getByName(String name) {
for(IWeaponAbility ability : abilities) {
if(ability.getName().equals(name))
return ability;
}
return NONE;
}
}

View File

@ -1,5 +1,11 @@
package com.hbm.handler.ability;
import com.hbm.util.ChatBuilder;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
public class ToolPreset {
public IToolAreaAbility areaAbility = IToolAreaAbility.NONE;
public int areaAbilityLevel = 0;
@ -20,19 +26,69 @@ public class ToolPreset {
this.harvestAbilityLevel = harvestAbilityLevel;
}
public String getMessage() {
public ChatComponentText getMessage() {
if (isNone())
return ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush();
String areaPart = areaAbility.getFullName(areaAbilityLevel);
String harvestPart = harvestAbility.getFullName(harvestAbilityLevel);
if (harvestPart.isEmpty() && areaPart.isEmpty())
return "[Tool ability deactivated]";
if (harvestPart.isEmpty())
return "[Enabled " + areaPart + "]";
if (areaPart.isEmpty())
return "[Enabled " + harvestPart + "]";
ChatBuilder builder = ChatBuilder.start("[Enabled ");
return "[Enabled " + areaPart + " + " + harvestPart + "]";
if (!areaPart.isEmpty())
builder.next(areaPart);
if (!areaPart.isEmpty() && !harvestPart.isEmpty())
builder.next(" + ");
if (!harvestPart.isEmpty())
builder.next(harvestPart);
return builder.colorAll(EnumChatFormatting.YELLOW).flush();
}
public boolean isNone() {
return areaAbility == IToolAreaAbility.NONE && harvestAbility == IToolHarvestAbility.NONE;
}
public void writeToNBT(NBTTagCompound nbt) {
nbt.setString("area", areaAbility.getName());
nbt.setInteger("areaLevel", areaAbilityLevel);
nbt.setString("harvest", harvestAbility.getName());
nbt.setInteger("harvestLevel", harvestAbilityLevel);
}
public void readFromNBT(NBTTagCompound nbt) {
areaAbility = IToolAreaAbility.getByName(nbt.getString("area"));
areaAbilityLevel = nbt.getInteger("areaLevel");
harvestAbility = IToolHarvestAbility.getByName(nbt.getString("harvest"));
harvestAbilityLevel = nbt.getInteger("harvestLevel");
areaAbilityLevel = Math.min(areaAbilityLevel, areaAbility.levels() - 1);
harvestAbilityLevel = Math.min(harvestAbilityLevel, harvestAbility.levels() - 1);
}
public void restrictTo(AvailableAbilities availableAbilities) {
int maxAreaLevel = availableAbilities.maxLevel(areaAbility);
if (maxAreaLevel == -1) {
areaAbility = IToolAreaAbility.NONE;
areaAbilityLevel = 0;
} else if (areaAbilityLevel > maxAreaLevel) {
areaAbilityLevel = maxAreaLevel;
} else if (areaAbilityLevel < 0) {
areaAbilityLevel = 0;
}
int maxHarvestLevel = availableAbilities.maxLevel(harvestAbility);
if (maxHarvestLevel == -1) {
harvestAbility = IToolHarvestAbility.NONE;
harvestAbilityLevel = 0;
} else if (harvestAbilityLevel > maxHarvestLevel) {
harvestAbilityLevel = maxHarvestLevel;
} else if (harvestAbilityLevel < 0) {
harvestAbilityLevel = 0;
}
}
}

View File

@ -6,14 +6,20 @@ import java.util.List;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import com.hbm.handler.ability.AvailableAbilities;
import com.hbm.handler.ability.IBaseAbility;
import com.hbm.handler.ability.IToolAreaAbility;
import com.hbm.handler.ability.IToolHarvestAbility;
import com.hbm.handler.ability.ToolPreset;
import com.hbm.items.tool.ItemToolAbility;
import com.hbm.items.tool.ItemToolAbility.Configuration;
import com.hbm.lib.RefStrings;
import com.hbm.main.MainRegistry;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.PlayerInformPacket;
import com.hbm.util.EnumUtil;
import com.hbm.util.I18nUtil;
import com.hbm.util.Tuple.Pair;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
@ -32,9 +38,6 @@ public class GUIScreenToolAbility extends GuiScreen {
protected int ySize;
protected int insetWidth;
protected ItemToolAbility toolDef;
protected ItemStack toolStack;
public static class AbilityInfo {
public IBaseAbility ability;
public int textureU, textureV;
@ -65,23 +68,19 @@ public class GUIScreenToolAbility extends GuiScreen {
abilitiesHarvest.add(new AbilityInfo(IToolHarvestAbility.MERCURY, 224, 107));
}
// TODO: availability status for abilities; list of presets; selected preset index;
// TODO: Remove this in favor of current preset
int selectionIdxArea = 0;
int selectedLevelArea = 0;
int selectionIdxHarvest = 0;
int selectedLevelHarvest = 0;
int selectedPreset = 0;
int totalPresets = 1;
// TODO: Use availableAbilities
protected ItemStack toolStack;
AvailableAbilities availableAbilities;
ItemToolAbility.Configuration config;
int hoverIdxArea = -1;
int hoverIdxHarvest = -1;
int hoverIdxExtraBtn = -1;
public GUIScreenToolAbility(ItemToolAbility toolDef) {
public GUIScreenToolAbility(AvailableAbilities availableAbilities) {
super();
this.toolDef = toolDef;
this.availableAbilities = availableAbilities;
this.xSize = 186; // Note: increased dynamically
this.ySize = 76;
@ -112,12 +111,13 @@ public class GUIScreenToolAbility extends GuiScreen {
drawStretchedRect(guiLeft, guiTop, 0, 0, xSize, xSize - insetWidth, ySize, 74, 76);
// Draw the switches
hoverIdxArea = drawSwitches(abilitiesArea, selectionIdxArea, selectedLevelArea, guiLeft + 15, guiTop + 25, mouseX, mouseY);
hoverIdxHarvest = drawSwitches(abilitiesHarvest, selectionIdxHarvest, selectedLevelHarvest, guiLeft + 15, guiTop + 45, mouseX, mouseY);
ToolPreset activePreset = config.getActivePreset();
hoverIdxArea = drawSwitches(abilitiesArea, activePreset.areaAbility, activePreset.areaAbilityLevel, guiLeft + 15, guiTop + 25, mouseX, mouseY);
hoverIdxHarvest = drawSwitches(abilitiesHarvest, activePreset.harvestAbility, activePreset.harvestAbilityLevel, guiLeft + 15, guiTop + 45, mouseX, mouseY);
// Draw preset indicator
drawNumber(selectedPreset + 1, guiLeft + insetWidth + 115, guiTop + 25);
drawNumber(totalPresets, guiLeft + insetWidth + 149, guiTop + 25);
drawNumber(config.currentPreset + 1, guiLeft + insetWidth + 115, guiTop + 25);
drawNumber(config.presets.size(), guiLeft + insetWidth + 149, guiTop + 25);
// Draw extra buttons hover highlights
int extraBtnsX = guiLeft + xSize - 86;
@ -135,14 +135,14 @@ public class GUIScreenToolAbility extends GuiScreen {
if (hoverIdxArea != -1) {
int level = 0;
if (hoverIdxArea == selectionIdxArea) {
level = selectedLevelArea;
if (abilitiesArea.get(hoverIdxArea).ability == activePreset.areaAbility) {
level = activePreset.areaAbilityLevel;
}
tooltipValue = abilitiesArea.get(hoverIdxArea).ability.getFullName(level);
} else if (hoverIdxHarvest != -1) {
int level = 0;
if (hoverIdxHarvest == selectionIdxHarvest) {
level = selectedLevelHarvest;
if (abilitiesHarvest.get(hoverIdxHarvest).ability == activePreset.harvestAbility) {
level = activePreset.harvestAbilityLevel;
}
tooltipValue = abilitiesHarvest.get(hoverIdxHarvest).ability.getFullName(level);
} else if (hoverIdxExtraBtn != -1) {
@ -176,12 +176,13 @@ public class GUIScreenToolAbility extends GuiScreen {
drawTexturedModalRect(x + keepLeft + realMidWidth, y, u + keepLeft + midWidth, v, keepRight, height);
}
protected int drawSwitches(List<AbilityInfo> abilities, int selectionIdx, int selectedLevel, int x, int y, int mouseX, int mouseY) {
protected int drawSwitches(List<AbilityInfo> abilities, IBaseAbility selectedAbility, int selectedLevel, int x, int y, int mouseX, int mouseY) {
int hoverIdx = -1;
for (int i = 0; i < abilities.size(); ++i) {
AbilityInfo abilityInfo = abilities.get(i);
boolean available = true; // TODO
boolean available = availableAbilities.supportsAbility(abilityInfo.ability);
boolean selected = abilityInfo.ability == selectedAbility;
// Draw switch
drawTexturedModalRect(x + 20 * i, y, abilityInfo.textureU + (available ? 16 : 0), abilityInfo.textureV, 16, 16);
@ -190,11 +191,11 @@ public class GUIScreenToolAbility extends GuiScreen {
if (abilityInfo.ability.levels() > 1) {
int level = 0;
if (i == selectionIdx) {
if (selected) {
level = selectedLevel + 1;
}
// TODO: Max allowed level instead?
// Note: only visual effect for the LEDs
// int maxLevel = Math.min(abilityInfo.ability.levels(), 5);
int maxLevel = 5;
@ -212,7 +213,7 @@ public class GUIScreenToolAbility extends GuiScreen {
hoverIdx = i;
}
if (i == selectionIdx) {
if (selected) {
// Draw selection highlight
drawTexturedModalRect(x + 20 * i - 1, y - 1, 220, 9, 18, 18);
} else if (available && isHovered) {
@ -242,7 +243,7 @@ public class GUIScreenToolAbility extends GuiScreen {
public void updateScreen() {
EntityPlayer player = this.mc.thePlayer;
if(player.getHeldItem() == null || player.getHeldItem().getItem() != toolDef)
if(player.getHeldItem() == null || player.getHeldItem() != toolStack)
player.closeScreen();
}
@ -253,77 +254,29 @@ public class GUIScreenToolAbility extends GuiScreen {
if(Mouse.getEventButton() == -1) {
int scroll = Mouse.getEventDWheel();
if(scroll < 0 && selectedPreset > 0) selectedPreset -= 1;
if(scroll > 0 && selectedPreset < totalPresets - 1) selectedPreset += 1;
if(scroll < 0) doPrevPreset(true);
if(scroll > 0) doNextPreset(true);
}
}
@Override
protected void mouseClicked(int mouseX, int mouseY, int button) {
ToolPreset activePreset = config.getActivePreset();
// Process switches
// TODO: Encapsulate in a method
if (hoverIdxArea != -1) {
boolean available = true; // TODO
if (available) {
int availableLevels = abilitiesArea.get(hoverIdxArea).ability.levels();
if (hoverIdxArea != selectionIdxArea || availableLevels > 1) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBoop"), 2F));
}
if (hoverIdxArea == selectionIdxArea) {
selectedLevelArea = (selectedLevelArea + 1) % availableLevels;
} else {
selectedLevelArea = 0;
}
selectionIdxArea = hoverIdxArea;
}
}
if (hoverIdxHarvest != -1) {
boolean available = true; // TODO
if (available) {
int availableLevels = abilitiesHarvest.get(hoverIdxHarvest).ability.levels();
if (hoverIdxHarvest == selectionIdxHarvest) {
selectedLevelHarvest = (selectedLevelHarvest + 1) % availableLevels;
} else {
selectedLevelHarvest = 0;
}
selectionIdxHarvest = hoverIdxHarvest;
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBoop"), 2F));
}
}
handleSwitchesClicked(abilitiesArea, activePreset.areaAbility, activePreset.areaAbilityLevel, hoverIdxArea, mouseX, mouseY);
handleSwitchesClicked(abilitiesHarvest, activePreset.harvestAbility, activePreset.harvestAbilityLevel, hoverIdxHarvest, mouseX, mouseY);
// Process extra buttons
if (hoverIdxExtraBtn != -1) {
switch (hoverIdxExtraBtn) {
case 0:
doResetPresets();
break;
case 1:
doDelPreset();
break;
case 2:
doAddPreset();
break;
case 3:
doZeroPreset();
break;
case 4:
doNextPreset();
break;
case 5:
doPrevPreset();
break;
case 6:
doClose();
break;
case 0: doResetPresets(); break;
case 1: doDelPreset(); break;
case 2: doAddPreset(); break;
case 3: doZeroPreset(); break;
case 4: doNextPreset(false); break;
case 5: doPrevPreset(false); break;
case 6: doClose(); break;
}
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 0.5F));
@ -335,6 +288,31 @@ public class GUIScreenToolAbility extends GuiScreen {
}
}
protected Pair<IBaseAbility, Integer> handleSwitchesClicked(List<AbilityInfo> abilities, IBaseAbility selectedAbility, int selectedLevel, int hoverIdx, int mouseX, int mouseY) {
if (hoverIdx != -1) {
IBaseAbility hoveredAbility = abilities.get(hoverIdx).ability;
boolean available = availableAbilities.supportsAbility(hoveredAbility);
if (available) {
int availableLevels = availableAbilities.maxLevel(hoveredAbility) + 1;
if (hoveredAbility != selectedAbility || availableLevels > 1) {
mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("hbm:item.techBoop"), 2F));
}
if (hoveredAbility == selectedAbility) {
selectedLevel = (selectedLevel + 1) % availableLevels;
} else {
selectedLevel = 0;
}
selectedAbility = hoveredAbility;
}
}
return new Pair<>(selectedAbility, selectedLevel);
}
@Override
protected void keyTyped(char c, int key) {
if(key == 1 || key == this.mc.gameSettings.keyBindInventory.getKeyCode()) {
@ -351,46 +329,51 @@ public class GUIScreenToolAbility extends GuiScreen {
}
protected void doResetPresets() {
// TODO
totalPresets = 1;
selectedPreset = 0;
selectionIdxArea = 0;
selectedLevelArea = 0;
selectionIdxHarvest = 0;
selectedLevelHarvest = 0;
config.reset(availableAbilities);
}
protected void doDelPreset() {
// TODO
if (totalPresets <= 1) {
if (config.presets.size() <= 1) {
return;
}
totalPresets -= 1;
selectedPreset -= 1;
config.presets.remove(config.currentPreset);
config.currentPreset = Math.min(config.currentPreset, config.presets.size() - 1);
}
protected void doAddPreset() {
// TODO
totalPresets += 1;
selectedPreset += 1;
config.presets.add(config.currentPreset + 1, new ToolPreset());
config.currentPreset += 1;
}
protected void doZeroPreset() {
// TODO
selectedPreset = 0;
config.currentPreset = 0;
}
protected void doNextPreset() {
// TODO
selectedPreset = (selectedPreset + 1) % totalPresets;
protected void doNextPreset(boolean bound) {
if (bound) {
if (config.currentPreset < config.presets.size() - 1) {
config.currentPreset += 1;
}
} else {
config.currentPreset = (config.currentPreset + 1) % config.presets.size();
}
}
protected void doPrevPreset() {
// TODO
selectedPreset = (selectedPreset + totalPresets - 1) % totalPresets;
protected void doPrevPreset(boolean bound) {
if (bound) {
if (config.currentPreset > 0) {
config.currentPreset -= 1;
}
} else {
config.currentPreset = (config.currentPreset + config.presets.size() - 1) % config.presets.size();
}
}
protected void doClose() {
this.mc.thePlayer.closeScreen();
MainRegistry.proxy.displayTooltip(config.getActivePreset().getMessage().getFormattedText(), MainRegistry.proxy.ID_TOOLABILITY);
this.mc.theWorld.playSoundAtEntity(this.mc.thePlayer, "random.orb", 0.25F, config.getActivePreset().isNone() ? 0.75F : 1.25F);
}
}

View File

@ -3,10 +3,9 @@ package com.hbm.items;
import com.hbm.blocks.ModBlocks;
import com.hbm.config.VersatileConfig;
import com.hbm.handler.BucketHandler;
import com.hbm.handler.ToolAbility;
import com.hbm.handler.ToolAbility.LuckAbility;
import com.hbm.handler.ability.IToolAreaAbility;
import com.hbm.handler.ability.IToolHarvestAbility;
import com.hbm.handler.ability.IWeaponAbility;
import com.hbm.handler.WeaponAbility;
import com.hbm.handler.guncfg.*;
import com.hbm.interfaces.ICustomWarhead.SaltedFuel.HalfLifeType;
import com.hbm.inventory.fluid.Fluids;
@ -4475,45 +4474,45 @@ public class ModItems {
chainsaw = new ItemChainsaw(25, -0.05, MainRegistry.tMatChainsaw, EnumToolType.AXE, 5000, 1, 250,
Fluids.DIESEL, Fluids.DIESEL_CRACK, Fluids.KEROSENE, Fluids.BIOFUEL, Fluids.GASOLINE, Fluids.GASOLINE_LEADED, Fluids.PETROIL, Fluids.PETROIL_LEADED, Fluids.COALGAS, Fluids.COALGAS_LEADED)
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addHitAbility(new WeaponAbility.ChainsawAbility(10))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setShears().setUnlocalizedName("chainsaw").setTextureName(RefStrings.MODID + ":chainsaw");
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IWeaponAbility.CHAINSAW, 1)
.addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("chainsaw").setTextureName(RefStrings.MODID + ":chainsaw");
schrabidium_sword = new ItemSwordAbility(75, 0, MainRegistry.tMatSchrab)
.addHitAbility(IWeaponAbility.RADIATION, 1)
.addHitAbility(IWeaponAbility.VAMPIRE, 0)
.addAbility(IWeaponAbility.RADIATION, 1)
.addAbility(IWeaponAbility.VAMPIRE, 0)
.setRarity(EnumRarity.rare).setUnlocalizedName("schrabidium_sword").setTextureName(RefStrings.MODID + ":schrabidium_sword");
schrabidium_pickaxe = new ItemToolAbility(20, 0, MainRegistry.tMatSchrab, EnumToolType.PICKAXE)
.addHitAbility(new WeaponAbility.RadiationAbility(15F))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(10))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addAbility(IWeaponAbility.RADIATION, 0)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 6)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.setRarity(EnumRarity.rare).setUnlocalizedName("schrabidium_pickaxe").setTextureName(RefStrings.MODID + ":schrabidium_pickaxe");
schrabidium_axe = new ItemToolAbility(25, 0, MainRegistry.tMatSchrab, EnumToolType.AXE)
.addHitAbility(new WeaponAbility.RadiationAbility(15F))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(10))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addAbility(IWeaponAbility.RADIATION, 0)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 6)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IWeaponAbility.BEHEADER, 0)
.setRarity(EnumRarity.rare).setUnlocalizedName("schrabidium_axe").setTextureName(RefStrings.MODID + ":schrabidium_axe");
schrabidium_shovel = new ItemToolAbility(15, 0, MainRegistry.tMatSchrab, EnumToolType.SHOVEL)
.addHitAbility(new WeaponAbility.RadiationAbility(15F))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(10))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addAbility(IWeaponAbility.RADIATION, 0)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 6)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.setRarity(EnumRarity.rare).setUnlocalizedName("schrabidium_shovel").setTextureName(RefStrings.MODID + ":schrabidium_shovel");
schrabidium_hoe = new HoeSchrabidium(MainRegistry.tMatSchrab).setUnlocalizedName("schrabidium_hoe").setTextureName(RefStrings.MODID + ":schrabidium_hoe");
@ -4521,294 +4520,282 @@ public class ModItems {
titanium_sword = new ItemSwordAbility(6.5F, 0, MainRegistry.tMatTitan).setUnlocalizedName("titanium_sword").setTextureName(RefStrings.MODID + ":titanium_sword");
titanium_pickaxe = new ItemToolAbility(4.5F, 0, MainRegistry.tMatTitan, EnumToolType.PICKAXE).setUnlocalizedName("titanium_pickaxe").setTextureName(RefStrings.MODID + ":titanium_pickaxe");
titanium_axe = new ItemToolAbility(5.5F, 0, MainRegistry.tMatTitan, EnumToolType.AXE)
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("titanium_axe").setTextureName(RefStrings.MODID + ":titanium_axe");
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("titanium_axe").setTextureName(RefStrings.MODID + ":titanium_axe");
titanium_shovel = new ItemToolAbility(3.5F, 0, MainRegistry.tMatTitan, EnumToolType.SHOVEL).setUnlocalizedName("titanium_shovel").setTextureName(RefStrings.MODID + ":titanium_shovel");
titanium_hoe = new ModHoe(MainRegistry.tMatTitan).setUnlocalizedName("titanium_hoe").setTextureName(RefStrings.MODID + ":titanium_hoe");
steel_sword = new ItemSwordAbility(6F, 0, MainRegistry.tMatSteel).setUnlocalizedName("steel_sword").setTextureName(RefStrings.MODID + ":steel_sword");
steel_pickaxe = new ItemToolAbility(4F, 0, MainRegistry.tMatSteel, EnumToolType.PICKAXE).setUnlocalizedName("steel_pickaxe").setTextureName(RefStrings.MODID + ":steel_pickaxe");
steel_axe = new ItemToolAbility(5F, 0, MainRegistry.tMatSteel, EnumToolType.AXE)
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("steel_axe").setTextureName(RefStrings.MODID + ":steel_axe");
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("steel_axe").setTextureName(RefStrings.MODID + ":steel_axe");
steel_shovel = new ItemToolAbility(3F, 0, MainRegistry.tMatSteel, EnumToolType.SHOVEL).setUnlocalizedName("steel_shovel").setTextureName(RefStrings.MODID + ":steel_shovel");
steel_hoe = new ModHoe(MainRegistry.tMatSteel).setUnlocalizedName("steel_hoe").setTextureName(RefStrings.MODID + ":steel_hoe");
alloy_sword = new ItemSwordAbility(8F, 0, MainRegistry.tMatAlloy)
.addHitAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("alloy_sword").setTextureName(RefStrings.MODID + ":alloy_sword");
.addAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("alloy_sword").setTextureName(RefStrings.MODID + ":alloy_sword");
alloy_pickaxe = new ItemToolAbility(5F, 0, MainRegistry.tMatAlloy, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.RecursionAbility(3)).setUnlocalizedName("alloy_pickaxe").setTextureName(RefStrings.MODID + ":alloy_pickaxe");
.addAbility(IToolAreaAbility.RECURSION, 0).setUnlocalizedName("alloy_pickaxe").setTextureName(RefStrings.MODID + ":alloy_pickaxe");
alloy_axe = new ItemToolAbility(7F, 0, MainRegistry.tMatAlloy, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.RecursionAbility(3))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("alloy_axe").setTextureName(RefStrings.MODID + ":alloy_axe");
.addAbility(IToolAreaAbility.RECURSION, 0)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("alloy_axe").setTextureName(RefStrings.MODID + ":alloy_axe");
alloy_shovel = new ItemToolAbility(4F, 0, MainRegistry.tMatAlloy, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.RecursionAbility(3)).setUnlocalizedName("alloy_shovel").setTextureName(RefStrings.MODID + ":alloy_shovel");
.addAbility(IToolAreaAbility.RECURSION, 0).setUnlocalizedName("alloy_shovel").setTextureName(RefStrings.MODID + ":alloy_shovel");
alloy_hoe = new ModHoe(MainRegistry.tMatAlloy).setUnlocalizedName("alloy_hoe").setTextureName(RefStrings.MODID + ":alloy_hoe");
cmb_sword = new ItemSwordAbility(35F, 0, MainRegistry.tMatCMB)
.addHitAbility(IWeaponAbility.STUN, 0)
.addHitAbility(IWeaponAbility.VAMPIRE, 0).setUnlocalizedName("cmb_sword").setTextureName(RefStrings.MODID + ":cmb_sword");
.addAbility(IWeaponAbility.STUN, 0)
.addAbility(IWeaponAbility.VAMPIRE, 0).setUnlocalizedName("cmb_sword").setTextureName(RefStrings.MODID + ":cmb_sword");
cmb_pickaxe = new ItemToolAbility(10F, 0, MainRegistry.tMatCMB, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3)).setUnlocalizedName("cmb_pickaxe").setTextureName(RefStrings.MODID + ":cmb_pickaxe");
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cmb_pickaxe").setTextureName(RefStrings.MODID + ":cmb_pickaxe");
cmb_axe = new ItemToolAbility(30F, 0, MainRegistry.tMatCMB, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("cmb_axe").setTextureName(RefStrings.MODID + ":cmb_axe");
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("cmb_axe").setTextureName(RefStrings.MODID + ":cmb_axe");
cmb_shovel = new ItemToolAbility(8F, 0, MainRegistry.tMatCMB, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3)).setUnlocalizedName("cmb_shovel").setTextureName(RefStrings.MODID + ":cmb_shovel");
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cmb_shovel").setTextureName(RefStrings.MODID + ":cmb_shovel");
cmb_hoe = new ModHoe(MainRegistry.tMatCMB).setUnlocalizedName("cmb_hoe").setTextureName(RefStrings.MODID + ":cmb_hoe");
elec_sword = new ItemSwordAbilityPower(12.5F, 0, MainRegistry.tMatElec, 500000, 1000, 100)
.addHitAbility(IWeaponAbility.STUN, 2).setUnlocalizedName("elec_sword").setTextureName(RefStrings.MODID + ":elec_sword_anim");
.addAbility(IWeaponAbility.STUN, 2).setUnlocalizedName("elec_sword").setTextureName(RefStrings.MODID + ":elec_sword_anim");
elec_pickaxe = new ItemToolAbilityPower(6F, 0, MainRegistry.tMatElec, EnumToolType.PICKAXE, 500000, 1000, 100)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2)).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_pickaxe").setTextureName(RefStrings.MODID + ":elec_drill_anim");
elec_axe = new ItemToolAbilityPower(10F, 0, MainRegistry.tMatElec, EnumToolType.AXE, 500000, 1000, 100)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2))
.addHitAbility(new WeaponAbility.ChainsawAbility(15))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1)
.addAbility(IWeaponAbility.CHAINSAW, 0)
.addAbility(IWeaponAbility.BEHEADER, 0).setShears().setUnlocalizedName("elec_axe").setTextureName(RefStrings.MODID + ":elec_chainsaw_anim");
elec_shovel = new ItemToolAbilityPower(5F, 0, MainRegistry.tMatElec, EnumToolType.SHOVEL, 500000, 1000, 100)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2)).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("elec_shovel").setTextureName(RefStrings.MODID + ":elec_shovel_anim");
desh_sword = new ItemSwordAbility(12.5F, 0, MainRegistry.tMatDesh)
.addHitAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("desh_sword").setTextureName(RefStrings.MODID + ":desh_sword");
.addAbility(IWeaponAbility.STUN, 0).setUnlocalizedName("desh_sword").setTextureName(RefStrings.MODID + ":desh_sword");
desh_pickaxe = new ItemToolAbility(5F, -0.05, MainRegistry.tMatDesh, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.RecursionAbility(3))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2)).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe");
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolAreaAbility.RECURSION, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_pickaxe").setTextureName(RefStrings.MODID + ":desh_pickaxe");
desh_axe = new ItemToolAbility(7.5F, -0.05, MainRegistry.tMatDesh, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.RecursionAbility(3))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("desh_axe").setTextureName(RefStrings.MODID + ":desh_axe");
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolAreaAbility.RECURSION, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("desh_axe").setTextureName(RefStrings.MODID + ":desh_axe");
desh_shovel = new ItemToolAbility(4F, -0.05, MainRegistry.tMatDesh, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.RecursionAbility(3))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(2)).setUnlocalizedName("desh_shovel").setTextureName(RefStrings.MODID + ":desh_shovel");
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolAreaAbility.RECURSION, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 1).setUnlocalizedName("desh_shovel").setTextureName(RefStrings.MODID + ":desh_shovel");
desh_hoe = new ModHoe(MainRegistry.tMatDesh).setUnlocalizedName("desh_hoe").setTextureName(RefStrings.MODID + ":desh_hoe");
cobalt_sword = new ItemSwordAbility(12F, 0, MainRegistry.tMatCobalt).setUnlocalizedName("cobalt_sword").setTextureName(RefStrings.MODID + ":cobalt_sword");
cobalt_pickaxe = new ItemToolAbility(4F, 0, MainRegistry.tMatCobalt, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(1)).setUnlocalizedName("cobalt_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_pickaxe");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 0).setUnlocalizedName("cobalt_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_pickaxe");
cobalt_axe = new ItemToolAbility(6F, 0, MainRegistry.tMatCobalt, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(1))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("cobalt_axe").setTextureName(RefStrings.MODID + ":cobalt_axe");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 0)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("cobalt_axe").setTextureName(RefStrings.MODID + ":cobalt_axe");
cobalt_shovel = new ItemToolAbility(3.5F, 0, MainRegistry.tMatCobalt, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(1)).setUnlocalizedName("cobalt_shovel").setTextureName(RefStrings.MODID + ":cobalt_shovel");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 0).setUnlocalizedName("cobalt_shovel").setTextureName(RefStrings.MODID + ":cobalt_shovel");
cobalt_hoe = new ModHoe(MainRegistry.tMatCobalt).setUnlocalizedName("cobalt_hoe").setTextureName(RefStrings.MODID + ":cobalt_hoe");
ToolMaterial matDecCobalt = EnumHelper.addToolMaterial("HBM_COBALT2", 3, 2500, 15.0F, 2.5F, 75).setRepairItem(new ItemStack(ModItems.ingot_cobalt));
cobalt_decorated_sword = new ItemSwordAbility(15F, 0, matDecCobalt)
.addHitAbility(IWeaponAbility.BOBBLE, 0).setUnlocalizedName("cobalt_decorated_sword").setTextureName(RefStrings.MODID + ":cobalt_decorated_sword");
.addAbility(IWeaponAbility.BOBBLE, 0).setUnlocalizedName("cobalt_decorated_sword").setTextureName(RefStrings.MODID + ":cobalt_decorated_sword");
cobalt_decorated_pickaxe = new ItemToolAbility(6F, 0, matDecCobalt, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3)).setUnlocalizedName("cobalt_decorated_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_decorated_pickaxe");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_pickaxe").setTextureName(RefStrings.MODID + ":cobalt_decorated_pickaxe");
cobalt_decorated_axe = new ItemToolAbility(8F, 0, matDecCobalt, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("cobalt_decorated_axe").setTextureName(RefStrings.MODID + ":cobalt_decorated_axe");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("cobalt_decorated_axe").setTextureName(RefStrings.MODID + ":cobalt_decorated_axe");
cobalt_decorated_shovel = new ItemToolAbility(5F, 0, matDecCobalt, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(3)).setUnlocalizedName("cobalt_decorated_shovel").setTextureName(RefStrings.MODID + ":cobalt_decorated_shovel");
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolAreaAbility.HAMMER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 2).setUnlocalizedName("cobalt_decorated_shovel").setTextureName(RefStrings.MODID + ":cobalt_decorated_shovel");
cobalt_decorated_hoe = new ModHoe(matDecCobalt).setUnlocalizedName("cobalt_decorated_hoe").setTextureName(RefStrings.MODID + ":cobalt_decorated_hoe");
ToolMaterial matStarmetal = EnumHelper.addToolMaterial("HBM_STARMETAL", 3, 3000, 20.0F, 2.5F, 100).setRepairItem(new ItemStack(ModItems.ingot_starmetal));
starmetal_sword = new ItemSwordAbility(25F, 0, matStarmetal)
.addHitAbility(IWeaponAbility.BEHEADER, 0)
.addHitAbility(IWeaponAbility.STUN, 1)
.addHitAbility(IWeaponAbility.BOBBLE, 0).setUnlocalizedName("starmetal_sword").setTextureName(RefStrings.MODID + ":starmetal_sword");
.addAbility(IWeaponAbility.BEHEADER, 0)
.addAbility(IWeaponAbility.STUN, 1)
.addAbility(IWeaponAbility.BOBBLE, 0).setUnlocalizedName("starmetal_sword").setTextureName(RefStrings.MODID + ":starmetal_sword");
starmetal_pickaxe = new ItemToolAbility(8F, 0, matStarmetal, EnumToolType.PICKAXE)
.addBreakAbility(new ToolAbility.RecursionAbility(6))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addHitAbility(new WeaponAbility.StunAbility(3)).setUnlocalizedName("starmetal_pickaxe").setTextureName(RefStrings.MODID + ":starmetal_pickaxe");
.addAbility(IToolAreaAbility.RECURSION, 3)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_pickaxe").setTextureName(RefStrings.MODID + ":starmetal_pickaxe");
starmetal_axe = new ItemToolAbility(12F, 0, matStarmetal, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.RecursionAbility(6))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addHitAbility(new WeaponAbility.StunAbility(3)).setUnlocalizedName("starmetal_axe").setTextureName(RefStrings.MODID + ":starmetal_axe");
.addAbility(IToolAreaAbility.RECURSION, 3)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IWeaponAbility.BEHEADER, 0)
.addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_axe").setTextureName(RefStrings.MODID + ":starmetal_axe");
starmetal_shovel = new ItemToolAbility(7F, 0, matStarmetal, EnumToolType.SHOVEL)
.addBreakAbility(new ToolAbility.RecursionAbility(6))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new LuckAbility(5))
.addHitAbility(new WeaponAbility.StunAbility(3)).setUnlocalizedName("starmetal_shovel").setTextureName(RefStrings.MODID + ":starmetal_shovel");
.addAbility(IToolAreaAbility.RECURSION, 3)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 4)
.addAbility(IWeaponAbility.STUN, 1).setUnlocalizedName("starmetal_shovel").setTextureName(RefStrings.MODID + ":starmetal_shovel");
starmetal_hoe = new ModHoe(matStarmetal).setUnlocalizedName("starmetal_hoe").setTextureName(RefStrings.MODID + ":starmetal_hoe");
centri_stick = new ItemToolAbility(3F, 0, MainRegistry.tMatElec, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.CentrifugeAbility()).setMaxDamage(50).setUnlocalizedName("centri_stick").setTextureName(RefStrings.MODID + ":centri_stick");
.addAbility(IToolHarvestAbility.CENTRIFUGE, 0).setMaxDamage(50).setUnlocalizedName("centri_stick").setTextureName(RefStrings.MODID + ":centri_stick");
smashing_hammer = new ItemToolAbility(12F, -0.1, MainRegistry.tMatSteel, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.ShredderAbility()).setMaxDamage(2500).setUnlocalizedName("smashing_hammer").setTextureName(RefStrings.MODID + ":smashing_hammer");
.addAbility(IToolHarvestAbility.SHREDDER, 0).setMaxDamage(2500).setUnlocalizedName("smashing_hammer").setTextureName(RefStrings.MODID + ":smashing_hammer");
drax = new ItemToolAbilityPower(10F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 500000000, 100000, 5000)
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addBreakAbility(new ToolAbility.LuckAbility(2))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(5)).setUnlocalizedName("drax").setTextureName(RefStrings.MODID + ":drax");
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IToolHarvestAbility.LUCK, 1)
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 2).setUnlocalizedName("drax").setTextureName(RefStrings.MODID + ":drax");
drax_mk2 = new ItemToolAbilityPower(15F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 1000000000, 250000, 7500)
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addBreakAbility(new ToolAbility.CentrifugeAbility())
.addBreakAbility(new ToolAbility.LuckAbility(3))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.HammerAbility(3))
.addBreakAbility(new ToolAbility.RecursionAbility(7)).setUnlocalizedName("drax_mk2").setTextureName(RefStrings.MODID + ":drax_mk2");
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IToolHarvestAbility.CENTRIFUGE, 0)
.addAbility(IToolHarvestAbility.LUCK, 2)
.addAbility(IToolAreaAbility.HAMMER, 2)
.addAbility(IToolAreaAbility.RECURSION, 4).setUnlocalizedName("drax_mk2").setTextureName(RefStrings.MODID + ":drax_mk2");
drax_mk3 = new ItemToolAbilityPower(20F, -0.05, MainRegistry.tMatElec, EnumToolType.MINER, 2500000000L, 500000, 10000)
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.ShredderAbility())
.addBreakAbility(new ToolAbility.CentrifugeAbility())
.addBreakAbility(new ToolAbility.CrystallizerAbility())
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new ToolAbility.LuckAbility(4))
.addBreakAbility(new ToolAbility.HammerAbility(1))
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.HammerAbility(3))
.addBreakAbility(new ToolAbility.HammerAbility(4))
.addBreakAbility(new ToolAbility.RecursionAbility(9)).setUnlocalizedName("drax_mk3").setTextureName(RefStrings.MODID + ":drax_mk3");
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IToolHarvestAbility.CENTRIFUGE, 0)
.addAbility(IToolHarvestAbility.CRYSTALLIZER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 3)
.addAbility(IToolAreaAbility.HAMMER, 3)
.addAbility(IToolAreaAbility.RECURSION, 5).setUnlocalizedName("drax_mk3").setTextureName(RefStrings.MODID + ":drax_mk3");
ToolMaterial matBismuth = EnumHelper.addToolMaterial("HBM_BISMUTH", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth));
bismuth_pickaxe = new ItemToolAbility(15F, 0, matBismuth, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.ShredderAbility())
.addBreakAbility(new ToolAbility.LuckAbility(2))
.addBreakAbility(new ToolAbility.SilkAbility())
.addHitAbility(new WeaponAbility.StunAbility(5))
.addHitAbility(new WeaponAbility.VampireAbility(2F))
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IToolHarvestAbility.LUCK, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IWeaponAbility.STUN, 2)
.addAbility(IWeaponAbility.VAMPIRE, 0)
.addAbility(IWeaponAbility.BEHEADER, 0)
.setDepthRockBreaker().setUnlocalizedName("bismuth_pickaxe").setTextureName(RefStrings.MODID + ":bismuth_pickaxe");
bismuth_axe = new ItemToolAbility(25F, 0, matBismuth, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.ShredderAbility())
.addBreakAbility(new ToolAbility.LuckAbility(2))
.addBreakAbility(new ToolAbility.SilkAbility())
.addHitAbility(new WeaponAbility.StunAbility(10))
.addHitAbility(new WeaponAbility.VampireAbility(3F))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("bismuth_axe").setTextureName(RefStrings.MODID + ":bismuth_axe");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SHREDDER, 0)
.addAbility(IToolHarvestAbility.LUCK, 1)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IWeaponAbility.STUN, 3)
.addAbility(IWeaponAbility.VAMPIRE, 1)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("bismuth_axe").setTextureName(RefStrings.MODID + ":bismuth_axe");
ToolMaterial matVolcano = EnumHelper.addToolMaterial("HBM_VOLCANIC", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.ingot_bismuth));
volcanic_pickaxe = new ItemToolAbility(15F, 0, matVolcano, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.LuckAbility(3))
.addBreakAbility(new ToolAbility.SilkAbility())
.addHitAbility(new WeaponAbility.FireAbility(5))
.addHitAbility(new WeaponAbility.VampireAbility(2F))
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.LUCK, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IWeaponAbility.FIRE, 0)
.addAbility(IWeaponAbility.VAMPIRE, 0)
.addAbility(IWeaponAbility.BEHEADER, 0)
.setDepthRockBreaker().setUnlocalizedName("volcanic_pickaxe").setTextureName(RefStrings.MODID + ":volcanic_pickaxe");
volcanic_axe = new ItemToolAbility(25F, 0, matVolcano, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.SmelterAbility())
.addBreakAbility(new ToolAbility.LuckAbility(3))
.addBreakAbility(new ToolAbility.SilkAbility())
.addHitAbility(new WeaponAbility.FireAbility(10))
.addHitAbility(new WeaponAbility.VampireAbility(3F))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("volcanic_axe").setTextureName(RefStrings.MODID + ":volcanic_axe");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.SMELTER, 0)
.addAbility(IToolHarvestAbility.LUCK, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IWeaponAbility.FIRE, 1)
.addAbility(IWeaponAbility.VAMPIRE, 1)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("volcanic_axe").setTextureName(RefStrings.MODID + ":volcanic_axe");
ToolMaterial matChlorophyte = EnumHelper.addToolMaterial("HBM_CHLOROPHYTE", 4, 0, 75F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.powder_chlorophyte));
chlorophyte_pickaxe = new ItemToolAbility(20F, 0, matChlorophyte, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.LuckAbility(4))
.addBreakAbility(new ToolAbility.CentrifugeAbility())
.addBreakAbility(new ToolAbility.MercuryAbility())
.addHitAbility(new WeaponAbility.StunAbility(10))
.addHitAbility(new WeaponAbility.VampireAbility(5F))
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.LUCK, 3)
.addAbility(IToolHarvestAbility.CENTRIFUGE, 0)
.addAbility(IToolHarvestAbility.MERCURY, 0)
.addAbility(IWeaponAbility.STUN, 3)
.addAbility(IWeaponAbility.VAMPIRE, 2)
.addAbility(IWeaponAbility.BEHEADER, 0)
.setDepthRockBreaker().setUnlocalizedName("chlorophyte_pickaxe").setTextureName(RefStrings.MODID + ":chlorophyte_pickaxe");
chlorophyte_axe = new ItemToolAbility(50F, 0, matChlorophyte, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.HammerAbility(2))
.addBreakAbility(new ToolAbility.RecursionAbility(4))
.addBreakAbility(new ToolAbility.LuckAbility(4))
.addHitAbility(new WeaponAbility.StunAbility(15))
.addHitAbility(new WeaponAbility.VampireAbility(10F))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("chlorophyte_axe").setTextureName(RefStrings.MODID + ":chlorophyte_axe");
.addAbility(IToolAreaAbility.HAMMER, 1)
.addAbility(IToolAreaAbility.RECURSION, 1)
.addAbility(IToolHarvestAbility.LUCK, 3)
.addAbility(IWeaponAbility.STUN, 4)
.addAbility(IWeaponAbility.VAMPIRE, 3)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("chlorophyte_axe").setTextureName(RefStrings.MODID + ":chlorophyte_axe");
ToolMaterial matMese = EnumHelper.addToolMaterial("HBM_MESE", 4, 0, 100F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa));
mese_pickaxe = new ItemToolAbility(35F, 0, matMese, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.HammerAbility(3))
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.CrystallizerAbility())
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new ToolAbility.LuckAbility(9))
.addBreakAbility(new ToolAbility.ExplosionAbility(2.5F))
.addBreakAbility(new ToolAbility.ExplosionAbility(5F))
.addBreakAbility(new ToolAbility.ExplosionAbility(10F))
.addBreakAbility(new ToolAbility.ExplosionAbility(15F))
.addHitAbility(new WeaponAbility.StunAbility(10))
.addHitAbility(new WeaponAbility.PhosphorusAbility(60))
.addHitAbility(new WeaponAbility.BeheaderAbility())
.addAbility(IToolAreaAbility.HAMMER, 2)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.CRYSTALLIZER, 0)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 5)
.addAbility(IToolAreaAbility.EXPLOSION, 3)
.addAbility(IWeaponAbility.STUN, 3)
.addAbility(IWeaponAbility.PHOSPHORUS, 0)
.addAbility(IWeaponAbility.BEHEADER, 0)
.setDepthRockBreaker().setUnlocalizedName("mese_pickaxe").setTextureName(RefStrings.MODID + ":mese_pickaxe");
mese_axe = new ItemToolAbility(75F, 0, matMese, EnumToolType.AXE)
.addBreakAbility(new ToolAbility.HammerAbility(3))
.addBreakAbility(new ToolAbility.RecursionAbility(5))
.addBreakAbility(new ToolAbility.SilkAbility())
.addBreakAbility(new ToolAbility.LuckAbility(9))
.addBreakAbility(new ToolAbility.ExplosionAbility(2.5F))
.addBreakAbility(new ToolAbility.ExplosionAbility(5F))
.addBreakAbility(new ToolAbility.ExplosionAbility(10F))
.addBreakAbility(new ToolAbility.ExplosionAbility(15F))
.addHitAbility(new WeaponAbility.StunAbility(15))
.addHitAbility(new WeaponAbility.PhosphorusAbility(90))
.addHitAbility(new WeaponAbility.BeheaderAbility()).setUnlocalizedName("mese_axe").setTextureName(RefStrings.MODID + ":mese_axe");
.addAbility(IToolAreaAbility.HAMMER, 2)
.addAbility(IToolAreaAbility.RECURSION, 2)
.addAbility(IToolHarvestAbility.SILK, 0)
.addAbility(IToolHarvestAbility.LUCK, 5)
.addAbility(IToolAreaAbility.EXPLOSION, 3)
.addAbility(IWeaponAbility.STUN, 4)
.addAbility(IWeaponAbility.PHOSPHORUS, 1)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("mese_axe").setTextureName(RefStrings.MODID + ":mese_axe");
dnt_sword = new ItemSwordAbility(12F, 0, matMese).setUnlocalizedName("dnt_sword").setTextureName(RefStrings.MODID + ":dnt_sword");
ToolMaterial matDwarf = EnumHelper.addToolMaterial("HBM_DWARVEN", 2, 0, 4F, 0.0F, 10).setRepairItem(new ItemStack(ModItems.ingot_copper));
dwarven_pickaxe = new ItemToolAbility(5F, -0.1, matDwarf, EnumToolType.MINER)
.addBreakAbility(new ToolAbility.HammerAbility(1)).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe");
.addAbility(IToolAreaAbility.HAMMER, 0).setUnlocalizedName("dwarven_pickaxe").setMaxDamage(250).setTextureName(RefStrings.MODID + ":dwarven_pickaxe");
ToolMaterial matMeteorite = EnumHelper.addToolMaterial("HBM_METEORITE", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa));
meteorite_sword = new ItemSwordMeteorite(9F, 0, matMeteorite).setUnlocalizedName("meteorite_sword").setTextureName(RefStrings.MODID + ":meteorite_sword");
@ -4883,11 +4870,11 @@ public class ModItems {
diamond_gavel = new WeaponSpecial(ToolMaterial.EMERALD).setUnlocalizedName("diamond_gavel").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":diamond_gavel");
ToolMaterial matMeseGavel = EnumHelper.addToolMaterial("HBM_MESEGAVEL", 4, 0, 50F, 0.0F, 200).setRepairItem(new ItemStack(ModItems.plate_paa));
mese_gavel = new ItemSwordAbility(250, 1.5, matMeseGavel)
.addHitAbility(IWeaponAbility.PHOSPHORUS, 0)
.addHitAbility(IWeaponAbility.RADIATION, 2)
.addHitAbility(IWeaponAbility.STUN, 3)
.addHitAbility(IWeaponAbility.VAMPIRE, 4)
.addHitAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("mese_gavel").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":mese_gavel");
.addAbility(IWeaponAbility.PHOSPHORUS, 0)
.addAbility(IWeaponAbility.RADIATION, 2)
.addAbility(IWeaponAbility.STUN, 3)
.addAbility(IWeaponAbility.VAMPIRE, 4)
.addAbility(IWeaponAbility.BEHEADER, 0).setUnlocalizedName("mese_gavel").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":mese_gavel");
multitool_hit = new ItemMultitoolPassive().setUnlocalizedName("multitool_hit").setCreativeTab(null).setTextureName(RefStrings.MODID + ":multitool_fist");
multitool_dig = new ItemMultitoolTool(4.0F, MainRegistry.enumToolMaterialMultitool, ItemMultitoolTool.getAllBlocks()).setFull3D().setUnlocalizedName("multitool_dig").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":multitool_claw");

View File

@ -1,181 +0,0 @@
package com.hbm.items.tool;
import java.util.ArrayList;
import java.util.Random;
import com.hbm.blocks.ModBlocks;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.client.C07PacketPlayerDigging;
import net.minecraft.network.play.server.S23PacketBlockChange;
import net.minecraft.stats.StatList;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.IShearable;
import net.minecraftforge.event.world.BlockEvent;
public interface IItemWithAbility {
public boolean canHarvestBlock(Block par1Block, ItemStack itemStack);
public boolean isShears(ItemStack stack);
public default boolean canShearBlock(Block block, ItemStack stack, World world, int x, int y, int z) {
return this.isShears(stack) && block instanceof IShearable && ((IShearable) block).isShearable(stack, world, x, y, z);
}
public default void breakExtraBlock(World world, int x, int y, int z, EntityPlayer playerEntity, int refX, int refY, int refZ) {
if(world.isAirBlock(x, y, z))
return;
if(!(playerEntity instanceof EntityPlayerMP))
return;
EntityPlayerMP player = (EntityPlayerMP) playerEntity;
ItemStack stack = player.getHeldItem();
Block block = world.getBlock(x, y, z);
int meta = world.getBlockMetadata(x, y, z);
if(!(canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) || block == Blocks.bedrock || block == ModBlocks.stone_keyhole)
return;
Block refBlock = world.getBlock(refX, refY, refZ);
float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ);
float strength = ForgeHooks.blockStrength(block, player, world, x, y, z);
if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getBlockHardness(world, refX, refY, refZ) < 0)
return;
BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z);
if(event.isCanceled())
return;
if(player.capabilities.isCreativeMode) {
block.onBlockHarvested(world, x, y, z, meta, player);
if(block.removedByPlayer(world, player, x, y, z, false))
block.onBlockDestroyedByPlayer(world, x, y, z, meta);
if(!world.isRemote) {
player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world));
}
return;
}
player.getCurrentEquippedItem().func_150999_a(world, block, x, y, z, player);
if(!world.isRemote) {
if(canShearBlock(block, stack, world, x, y, z)) {
shearBlock(world, x, y, z, block, player);
}
block.onBlockHarvested(world, x, y, z, meta, player);
if(block.removedByPlayer(world, player, x, y, z, true)) {
block.onBlockDestroyedByPlayer(world, x, y, z, meta);
block.harvestBlock(world, player, x, y, z, meta);
block.dropXpOnBlockBreak(world, x, y, z, event.getExpToDrop());
}
player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world));
} else {
world.playAuxSFX(2001, x, y, z, Block.getIdFromBlock(block) + (meta << 12));
if(block.removedByPlayer(world, player, x, y, z, true)) {
block.onBlockDestroyedByPlayer(world, x, y, z, meta);
}
ItemStack itemstack = player.getCurrentEquippedItem();
if(itemstack != null) {
itemstack.func_150999_a(world, block, x, y, z, player);
if(itemstack.stackSize == 0) {
player.destroyCurrentEquippedItem();
}
}
Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit));
}
}
/** Assumes a canShearBlock check has passed, will most likely crash otherwise! */
public static void shearBlock(World world, int x, int y, int z, Block block, EntityPlayer player) {
ItemStack held = player.getHeldItem();
IShearable target = (IShearable) block;
if(target.isShearable(held, player.worldObj, x, y, z)) {
ArrayList<ItemStack> drops = target.onSheared(held, player.worldObj, x, y, z, EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, held));
Random rand = new Random();
for(ItemStack stack : drops) {
float f = 0.7F;
double d = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double d1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double d2 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
EntityItem entityitem = new EntityItem(player.worldObj, (double) x + d, (double) y + d1, (double) z + d2, stack);
entityitem.delayBeforeCanPickup = 10;
player.worldObj.spawnEntityInWorld(entityitem);
}
held.damageItem(1, player);
player.addStat(StatList.mineBlockStatArray[Block.getIdFromBlock(block)], 1);
}
}
public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) {
Block block = world.getBlock(x, y, z);
int l = world.getBlockMetadata(x, y, z);
world.playAuxSFXAtEntity(player, 2001, x, y, z, Block.getIdFromBlock(block) + (world.getBlockMetadata(x, y, z) << 12));
boolean flag = false;
if(player.capabilities.isCreativeMode) {
flag = removeBlock(world, x, y, z, false, player);
player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world));
} else {
ItemStack itemstack = player.getCurrentEquippedItem();
boolean flag1 = block.canHarvestBlock(player, l);
if(itemstack != null) {
itemstack.func_150999_a(world, block, x, y, z, player);
if(itemstack.stackSize == 0) {
player.destroyCurrentEquippedItem();
}
}
flag = removeBlock(world, x, y, z, flag1, player);
if(flag && flag1) {
block.harvestBlock(world, player, x, y, z, l);
}
}
/*
* // Drop experience if (!player.capabilities.isCreativeMode && flag &&
* event != null) { block.dropXpOnBlockBreak(world, x, y, z,
* event.getExpToDrop()); }
*/
}
public static boolean removeBlock(World world, int x, int y, int z, boolean canHarvest, EntityPlayerMP player) {
Block block = world.getBlock(x, y, z);
int l = world.getBlockMetadata(x, y, z);
block.onBlockHarvested(world, x, y, z, l, player);
boolean flag = block.removedByPlayer(world, player, x, y, z, canHarvest);
if(flag) {
block.onBlockDestroyedByPlayer(world, x, y, z, l);
}
return flag;
}
}

View File

@ -25,7 +25,7 @@ public class ItemSwordAbility extends ItemSword {
// was there a reason for this to be private?
protected float damage;
protected double movement;
private AvailableAbilities hitAbilities = new AvailableAbilities();
private AvailableAbilities abilities = new AvailableAbilities();
public ItemSwordAbility(float damage, double movement, ToolMaterial material) {
super(material);
@ -33,8 +33,8 @@ public class ItemSwordAbility extends ItemSword {
this.movement = movement;
}
public ItemSwordAbility addHitAbility(IWeaponAbility weaponAbility, int level) {
this.hitAbilities.addAbility(weaponAbility, level);
public ItemSwordAbility addAbility(IWeaponAbility weaponAbility, int level) {
this.abilities.addAbility(weaponAbility, level);
return this;
}
@ -56,8 +56,8 @@ public class ItemSwordAbility extends ItemSword {
if(this == ModItems.mese_gavel)
attacker.worldObj.playSoundAtEntity(victim, "hbm:weapon.whack", 3.0F, 1.F);
this.hitAbilities.get().forEach((ability, level) -> {
((IWeaponAbility)ability).onHit(level, attacker.worldObj, (EntityPlayer) attacker, victim, this);
this.abilities.getWeaponAbilities().forEach((ability, level) -> {
ability.onHit(level, attacker.worldObj, (EntityPlayer) attacker, victim, this);
});
}
@ -77,7 +77,7 @@ public class ItemSwordAbility extends ItemSword {
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
hitAbilities.addInformation(list);
abilities.addInformation(list);
}
protected boolean canOperate(ItemStack stack) {

View File

@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.Set;
import com.google.common.collect.HashMultimap;
@ -11,24 +12,30 @@ import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import com.hbm.inventory.gui.GUIScreenToolAbility;
import com.hbm.handler.HbmKeybinds;
import com.hbm.blocks.ModBlocks;
import com.hbm.extprop.HbmPlayerProps;
import com.hbm.handler.ToolAbility;
import com.hbm.handler.ToolAbility.*;
import com.hbm.handler.ability.AvailableAbilities;
import com.hbm.handler.ability.IBaseAbility;
import com.hbm.handler.ability.IToolAreaAbility;
import com.hbm.handler.ability.IToolHarvestAbility;
import com.hbm.handler.ability.ToolPreset;
import com.hbm.main.MainRegistry;
import com.hbm.packet.PacketDispatcher;
import com.hbm.packet.toclient.PlayerInformPacket;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.util.ChatBuilder;
import com.hbm.handler.WeaponAbility;
import api.hbm.item.IDepthRockTool;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
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.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
@ -37,10 +44,17 @@ import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.play.client.C07PacketPlayerDigging;
import net.minecraft.network.play.server.S23PacketBlockChange;
import net.minecraft.stats.StatList;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.IShearable;
import net.minecraftforge.event.world.BlockEvent;
public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDepthRockTool, IGUIProvider {
public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIProvider {
protected boolean isShears = false;
protected EnumToolType toolType;
@ -48,9 +62,9 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
//was there a reason for this to be private?
protected float damage;
protected double movement;
protected List<ToolAbility> breakAbility = new ArrayList() {{ add(null); }};
protected List<WeaponAbility> hitAbility = new ArrayList();
protected AvailableAbilities availableAbilities = new AvailableAbilities().addToolAbilities();
protected boolean rockBreaker = false;
public static enum EnumToolType {
PICKAXE(
@ -102,13 +116,14 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
}
}
public ItemToolAbility addBreakAbility(ToolAbility breakAbility) {
this.breakAbility.add(breakAbility);
public ItemToolAbility addAbility(IBaseAbility ability, int level) {
this.availableAbilities.addAbility(ability, level);
return this;
}
public ItemToolAbility addHitAbility(WeaponAbility weaponAbility) {
this.hitAbility.add(weaponAbility);
public ItemToolAbility setDepthRockBreaker() {
this.rockBreaker = true;
return this;
}
@ -124,14 +139,14 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
public boolean hitEntity(ItemStack stack, EntityLivingBase victim, EntityLivingBase attacker) {
if(!attacker.worldObj.isRemote && !this.hitAbility.isEmpty() && attacker instanceof EntityPlayer && canOperate(stack)) {
if(!attacker.worldObj.isRemote && attacker instanceof EntityPlayer && canOperate(stack)) {
for(WeaponAbility ability : this.hitAbility) {
ability.onHit(attacker.worldObj, (EntityPlayer) attacker, victim, this);
}
this.availableAbilities.getWeaponAbilities().forEach((ability, level) -> {
ability.onHit(level, attacker.worldObj, (EntityPlayer) attacker, victim, this);
});
}
stack.damageItem(2, attacker);
stack.damageItem(1, attacker);
return true;
}
@ -141,10 +156,19 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
World world = player.worldObj;
Block block = world.getBlock(x, y, z);
int meta = world.getBlockMetadata(x, y, z);
if(!world.isRemote && (canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) && this.getCurrentAbility(stack) != null && canOperate(stack))
return this.getCurrentAbility(stack).onDig(world, x, y, z, player, block, meta, this);
if(!world.isRemote && (canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) && canOperate(stack)) {
Configuration config = getConfiguration(stack);
ToolPreset preset = config.getActivePreset();
preset.harvestAbility.preHarvestAll(preset.harvestAbilityLevel, world, player);
boolean result = preset.areaAbility.onDig(preset.areaAbilityLevel, world, x, y, z, player, this);
preset.harvestAbility.postHarvestAll(preset.harvestAbilityLevel, world, player);
return result;
}
return false;
}
@ -169,18 +193,35 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
return super.getDigSpeed(stack, block, meta);
}
public boolean canOperate(ItemStack stack) {
return true;
}
@Override
public boolean canHarvestBlock(Block block, ItemStack stack) {
if(!canOperate(stack))
return false;
if(this.getCurrentAbility(stack) instanceof SilkAbility)
if(this.getConfiguration(stack).getActivePreset().harvestAbility == IToolHarvestAbility.SILK)
return true;
return getDigSpeed(stack, block, 0) > 1;
}
@Override
public boolean canBreakRock(World world, EntityPlayer player, ItemStack tool, Block block, int x, int y, int z) {
return canOperate(tool) && this.rockBreaker;
}
public boolean canShearBlock(Block block, ItemStack stack, World world, int x, int y, int z) {
return this.isShears(stack) && block instanceof IShearable && ((IShearable) block).isShearable(stack, world, x, y, z);
}
public boolean isShears(ItemStack stack) {
return this.isShears;
}
@Override
public Multimap getItemAttributeModifiers() {
@ -192,38 +233,13 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
@SideOnly(Side.CLIENT)
public boolean hasEffect(ItemStack stack) {
return getCurrentAbility(stack) != null || stack.isItemEnchanted();
return stack.isItemEnchanted() || !getConfiguration(stack).getActivePreset().isNone();
}
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) {
if(this.breakAbility.size() > 1) {
list.add("Abilities: ");
for(ToolAbility ability : this.breakAbility) {
if(ability != null) {
if(getCurrentAbility(stack) == ability)
list.add(" >" + EnumChatFormatting.GOLD + ability.getFullName());
else
list.add(" " + EnumChatFormatting.GOLD + ability.getFullName());
}
}
list.add("Right click to cycle through abilities!");
list.add("Sneak-click to turn ability off!");
}
if(!this.hitAbility.isEmpty()) {
list.add("Weapon modifiers: ");
for(WeaponAbility ability : this.hitAbility) {
list.add(" " + EnumChatFormatting.RED + ability.getFullName());
}
}
availableAbilities.addInformation(list);
if(this.rockBreaker) {
list.add("");
@ -233,85 +249,236 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if(this.breakAbility.size() < 2 || !canOperate(stack))
if(!canOperate(stack))
return super.onItemRightClick(stack, world, player);
Configuration config = getConfiguration(stack);
if(HbmPlayerProps.getData(player).getKeyPressed(HbmKeybinds.EnumKeybind.TOOL_ALT)) {
if(world.isRemote) player.openGui(MainRegistry.instance, 0, world, 0, 0, 0);
return stack;
}
if(world.isRemote)
if(config.presets.size() < 2 || world.isRemote)
return super.onItemRightClick(stack, world, player);
int i = getAbility(stack);
i++;
if(player.isSneaking())
i = 0;
setAbility(stack, i % this.breakAbility.size());
while(getCurrentAbility(stack) != null && !getCurrentAbility(stack).isAllowed()) {
PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("[Ability ").nextTranslation(getCurrentAbility(stack).getName()).next(getCurrentAbility(stack).getExtension() + " is blacklisted!]").colorAll(EnumChatFormatting.RED).flush(), MainRegistry.proxy.ID_TOOLABILITY), (EntityPlayerMP) player);
i++;
setAbility(stack, i % this.breakAbility.size());
}
if(getCurrentAbility(stack) != null) {
PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("[Enabled ").nextTranslation(getCurrentAbility(stack).getName()).next(getCurrentAbility(stack).getExtension() + "]").colorAll(EnumChatFormatting.YELLOW).flush(), MainRegistry.proxy.ID_TOOLABILITY), (EntityPlayerMP) player);
if(player.isSneaking()) {
config.currentPreset = 0;
} else {
PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(ChatBuilder.start("[Tool ability deactivated]").color(EnumChatFormatting.GOLD).flush(), MainRegistry.proxy.ID_TOOLABILITY), (EntityPlayerMP) player);
config.currentPreset = (config.currentPreset + 1) % config.presets.size();
}
world.playSoundAtEntity(player, "random.orb", 0.25F, getCurrentAbility(stack) == null ? 0.75F : 1.25F);
setConfiguration(stack, config);
PacketDispatcher.wrapper.sendTo(new PlayerInformPacket(config.getActivePreset().getMessage(), MainRegistry.proxy.ID_TOOLABILITY), (EntityPlayerMP) player);
world.playSoundAtEntity(player, "random.orb", 0.25F, config.getActivePreset().isNone() ? 0.75F : 1.25F);
return stack;
}
private ToolAbility getCurrentAbility(ItemStack stack) {
int ability = getAbility(stack) % this.breakAbility.size();
return this.breakAbility.get(ability);
public void breakExtraBlock(World world, int x, int y, int z, EntityPlayer playerEntity, int refX, int refY, int refZ) {
if(world.isAirBlock(x, y, z))
return;
if(!(playerEntity instanceof EntityPlayerMP))
return;
EntityPlayerMP player = (EntityPlayerMP) playerEntity;
ItemStack stack = player.getHeldItem();
Block block = world.getBlock(x, y, z);
int meta = world.getBlockMetadata(x, y, z);
if(!(canHarvestBlock(block, stack) || canShearBlock(block, stack, world, x, y, z)) || block == Blocks.bedrock || block == ModBlocks.stone_keyhole)
return;
Block refBlock = world.getBlock(refX, refY, refZ);
float refStrength = ForgeHooks.blockStrength(refBlock, player, world, refX, refY, refZ);
float strength = ForgeHooks.blockStrength(block, player, world, x, y, z);
if(!ForgeHooks.canHarvestBlock(block, player, meta) || refStrength / strength > 10f || refBlock.getBlockHardness(world, refX, refY, refZ) < 0)
return;
BlockEvent.BreakEvent event = ForgeHooks.onBlockBreakEvent(world, player.theItemInWorldManager.getGameType(), player, x, y, z);
if(event.isCanceled())
return;
Configuration config = getConfiguration(stack);
ToolPreset preset = config.getActivePreset();
preset.harvestAbility.onHarvestBlock(preset.harvestAbilityLevel, world, x, y, z, player, block, meta);
}
private int getAbility(ItemStack stack) {
/** Assumes a canShearBlock check has passed, will most likely crash otherwise! */
public static void shearBlock(World world, int x, int y, int z, Block block, EntityPlayer player) {
ItemStack held = player.getHeldItem();
if(stack.hasTagCompound())
return stack.stackTagCompound.getInteger("ability");
IShearable target = (IShearable) block;
if(target.isShearable(held, player.worldObj, x, y, z)) {
ArrayList<ItemStack> drops = target.onSheared(held, player.worldObj, x, y, z, EnchantmentHelper.getEnchantmentLevel(Enchantment.fortune.effectId, held));
Random rand = new Random();
return 0;
for(ItemStack stack : drops) {
float f = 0.7F;
double d = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double d1 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
double d2 = (double) (rand.nextFloat() * f) + (double) (1.0F - f) * 0.5D;
EntityItem entityitem = new EntityItem(player.worldObj, (double) x + d, (double) y + d1, (double) z + d2, stack);
entityitem.delayBeforeCanPickup = 10;
player.worldObj.spawnEntityInWorld(entityitem);
}
held.damageItem(1, player);
player.addStat(StatList.mineBlockStatArray[Block.getIdFromBlock(block)], 1);
}
}
private void setAbility(ItemStack stack, int ability) {
public static void standardDigPost(World world, int x, int y, int z, EntityPlayerMP player) {
Block block = world.getBlock(x, y, z);
int l = world.getBlockMetadata(x, y, z);
world.playAuxSFXAtEntity(player, 2001, x, y, z, Block.getIdFromBlock(block) + (world.getBlockMetadata(x, y, z) << 12));
boolean flag = false;
if(player.capabilities.isCreativeMode) {
flag = removeBlock(world, x, y, z, false, player);
player.playerNetServerHandler.sendPacket(new S23PacketBlockChange(x, y, z, world));
} else {
ItemStack itemstack = player.getCurrentEquippedItem();
boolean flag1 = block.canHarvestBlock(player, l);
flag = removeBlock(world, x, y, z, flag1, player);
if(itemstack != null) {
itemstack.func_150999_a(world, block, x, y, z, player);
if(itemstack.stackSize == 0) {
player.destroyCurrentEquippedItem();
}
}
// TODO: Missing from other method, may be unneeded
if(flag && flag1) {
block.harvestBlock(world, player, x, y, z, l);
}
// TODO: Added from other method, may be unneeded
Minecraft.getMinecraft().getNetHandler().addToSendQueue(new C07PacketPlayerDigging(2, x, y, z, Minecraft.getMinecraft().objectMouseOver.sideHit));
}
// Why was this commented out?
// Drop experience
// if (!player.capabilities.isCreativeMode && flag && event != null) {
// block.dropXpOnBlockBreak(world, x, y, z, event.getExpToDrop());
// }
}
public static boolean removeBlock(World world, int x, int y, int z, boolean canHarvest, EntityPlayerMP player) {
Block block = world.getBlock(x, y, z);
int l = world.getBlockMetadata(x, y, z);
block.onBlockHarvested(world, x, y, z, l, player);
boolean flag = block.removedByPlayer(world, player, x, y, z, canHarvest);
if(flag) {
block.onBlockDestroyedByPlayer(world, x, y, z, l);
}
return flag;
}
public static class Configuration {
public List<ToolPreset> presets;
public int currentPreset;
public Configuration() {
this.presets = null;
this.currentPreset = 0;
}
public Configuration(List<ToolPreset> presets, int currentPreset) {
this.presets = presets;
this.currentPreset = currentPreset;
}
public void writeToNBT(NBTTagCompound nbt) {
nbt.setInteger("ability", currentPreset);
NBTTagList nbtPresets = new NBTTagList();
for(ToolPreset preset : presets) {
NBTTagCompound nbtPreset = new NBTTagCompound();
preset.writeToNBT(nbtPreset);
nbtPresets.appendTag(nbtPreset);
}
nbt.setTag("abilityPresets", nbtPresets);
}
public void readFromNBT(NBTTagCompound nbt) {
currentPreset = nbt.getInteger("ability");
NBTTagList nbtPresets = nbt.getTagList("abilityPresets", 10);
presets = new ArrayList<ToolPreset>(nbtPresets.tagCount());
for(int i = 0; i < presets.size(); i++) {
NBTTagCompound nbtPreset = nbtPresets.getCompoundTagAt(i);
ToolPreset preset = new ToolPreset();
preset.readFromNBT(nbtPreset);
presets.add(preset);
}
currentPreset = Math.max(0, Math.min(currentPreset, presets.size() - 1));
}
public void reset(AvailableAbilities availableAbilities) {
currentPreset = 0;
presets = new ArrayList<ToolPreset>(availableAbilities.size());
presets.add(new ToolPreset());
availableAbilities.getToolAreaAbilities().forEach((ability, level) -> {
presets.add(new ToolPreset(ability, level, IToolHarvestAbility.NONE, 0));
});
availableAbilities.getToolHarvestAbilities().forEach((ability, level) -> {
presets.add(new ToolPreset(IToolAreaAbility.NONE, 0, ability, level));
});
}
public void restrictTo(AvailableAbilities availableAbilities) {
for (ToolPreset preset : presets) {
preset.restrictTo(availableAbilities);
}
}
public ToolPreset getActivePreset() {
return presets.get(currentPreset);
}
}
public Configuration getConfiguration(ItemStack stack) {
Configuration config = new Configuration();
if(!stack.hasTagCompound()) {
config.reset(availableAbilities);
return config;
}
config.readFromNBT(stack.stackTagCompound);
config.restrictTo(availableAbilities);
return config;
}
public void setConfiguration(ItemStack stack, Configuration config) {
if(!stack.hasTagCompound())
stack.stackTagCompound = new NBTTagCompound();
stack.stackTagCompound.setInteger("ability", ability);
}
public boolean canOperate(ItemStack stack) {
return true;
}
public ItemToolAbility setDepthRockBreaker() {
this.rockBreaker = true;
return this;
}
private boolean rockBreaker = false;
@Override
public boolean canBreakRock(World world, EntityPlayer player, ItemStack tool, Block block, int x, int y, int z) {
return canOperate(tool) && this.rockBreaker;
}
@Override
public boolean isShears(ItemStack stack) {
return this.isShears;
config.writeToNBT(stack.getTagCompound());
}
@Override
@ -322,6 +489,6 @@ public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDept
@Override
@SideOnly(Side.CLIENT)
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIScreenToolAbility(this);
return new GUIScreenToolAbility(this.availableAbilities);
}
}