From 2982dd1f588aea1dd622f920e026a10cee12bc96 Mon Sep 17 00:00:00 2001 From: abel1502 Date: Thu, 15 May 2025 01:30:10 +0300 Subject: [PATCH] Begin ability refactor, rewrite tool harvest abilities --- .../java/com/hbm/handler/ToolAbility.java | 36 +- .../java/com/hbm/handler/WeaponAbility.java | 65 +++- .../com/hbm/handler/ability/IBaseAbility.java | 27 ++ .../hbm/handler/ability/IToolAreaAbility.java | 14 + .../handler/ability/IToolHarvestAbility.java | 321 ++++++++++++++++++ .../hbm/handler/ability/IWeaponAbility.java | 12 + ...ItemAbility.java => IItemWithAbility.java} | 2 +- .../com/hbm/items/tool/ItemSwordAbility.java | 2 +- .../com/hbm/items/tool/ItemToolAbility.java | 2 +- .../textures/gui/tool/gui_tool_ability.png | Bin 4053 -> 4073 bytes 10 files changed, 450 insertions(+), 31 deletions(-) create mode 100644 src/main/java/com/hbm/handler/ability/IBaseAbility.java create mode 100644 src/main/java/com/hbm/handler/ability/IToolAreaAbility.java create mode 100644 src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java create mode 100644 src/main/java/com/hbm/handler/ability/IWeaponAbility.java rename src/main/java/com/hbm/items/tool/{IItemAbility.java => IItemWithAbility.java} (99%) diff --git a/src/main/java/com/hbm/handler/ToolAbility.java b/src/main/java/com/hbm/handler/ToolAbility.java index aab7757f9..e41813af1 100644 --- a/src/main/java/com/hbm/handler/ToolAbility.java +++ b/src/main/java/com/hbm/handler/ToolAbility.java @@ -15,7 +15,7 @@ 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.IItemAbility; +import com.hbm.items.tool.IItemWithAbility; import com.hbm.util.EnchantmentUtil; import net.minecraft.block.Block; @@ -33,7 +33,7 @@ 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, IItemAbility tool) { return false; } + 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(); @@ -50,7 +50,7 @@ public abstract class ToolAbility { private Set pos = new HashSet(); @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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); @@ -80,7 +80,7 @@ public abstract class ToolAbility { } } - private void recurse(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemAbility tool, int depth) { + private void recurse(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemWithAbility tool, int depth) { List shuffledOffsets = new ArrayList<>(offsets); Collections.shuffle(shuffledOffsets); @@ -90,7 +90,7 @@ public abstract class ToolAbility { } } - private void breakExtra(World world, int x, int y, int z, int refX, int refY, int refZ, EntityPlayer player, IItemAbility tool, int 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; @@ -166,7 +166,7 @@ public abstract class ToolAbility { } @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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++) { @@ -213,7 +213,7 @@ public abstract class ToolAbility { } @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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; @@ -232,7 +232,7 @@ public abstract class ToolAbility { } } if(player instanceof EntityPlayerMP) - IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); @@ -264,7 +264,7 @@ public abstract class ToolAbility { public static class SilkAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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; @@ -273,7 +273,7 @@ public abstract class ToolAbility { EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); if(player instanceof EntityPlayerMP) - IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); @@ -310,7 +310,7 @@ public abstract class ToolAbility { } @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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; @@ -319,7 +319,7 @@ public abstract class ToolAbility { EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, luck); if(player instanceof EntityPlayerMP) - IItemAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); @@ -350,7 +350,7 @@ public abstract class ToolAbility { public static class SmelterAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemWithAbility tool) { List drops = block.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); @@ -403,7 +403,7 @@ public abstract class ToolAbility { public static class ShredderAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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) @@ -445,7 +445,7 @@ public abstract class ToolAbility { public static class CentrifugeAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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) @@ -491,7 +491,7 @@ public abstract class ToolAbility { public static class CrystallizerAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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) @@ -533,7 +533,7 @@ public abstract class ToolAbility { public static class MercuryAbility extends ToolAbility { @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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) @@ -585,7 +585,7 @@ public abstract class ToolAbility { } @Override - public boolean onDig(World world, int x, int y, int z, EntityPlayer player, Block block, int meta, IItemAbility tool) { + 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); diff --git a/src/main/java/com/hbm/handler/WeaponAbility.java b/src/main/java/com/hbm/handler/WeaponAbility.java index 8529bb370..54f490b46 100644 --- a/src/main/java/com/hbm/handler/WeaponAbility.java +++ b/src/main/java/com/hbm/handler/WeaponAbility.java @@ -4,7 +4,8 @@ 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.IItemAbility; +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; @@ -38,7 +39,7 @@ import net.minecraft.world.World; public abstract class WeaponAbility { - public abstract void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool); + public abstract void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool); public abstract String getName(); public abstract String getFullName(); @@ -51,7 +52,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) ContaminationUtil.contaminate((EntityLivingBase)victim, HazardType.RADIATION, ContaminationType.CREATIVE, rad); @@ -77,7 +78,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) { @@ -109,7 +110,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) { @@ -130,6 +131,50 @@ public abstract class WeaponAbility { 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 { @@ -140,7 +185,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) { @@ -170,7 +215,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) { victim.setFire(duration); @@ -197,7 +242,7 @@ public abstract class WeaponAbility { } @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase) { @@ -241,7 +286,7 @@ public abstract class WeaponAbility { public static class BeheaderAbility extends WeaponAbility { @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityLivingBase && ((EntityLivingBase) victim).getHealth() <= 0.0F) { @@ -294,7 +339,7 @@ public abstract class WeaponAbility { public static class BobbleAbility extends WeaponAbility { @Override - public void onHit(World world, EntityPlayer player, Entity victim, IItemAbility tool) { + public void onHit(World world, EntityPlayer player, Entity victim, IItemWithAbility tool) { if(victim instanceof EntityMob && ((EntityMob) victim).getHealth() <= 0.0F) { diff --git a/src/main/java/com/hbm/handler/ability/IBaseAbility.java b/src/main/java/com/hbm/handler/ability/IBaseAbility.java new file mode 100644 index 000000000..c5811a4b1 --- /dev/null +++ b/src/main/java/com/hbm/handler/ability/IBaseAbility.java @@ -0,0 +1,27 @@ +package com.hbm.handler.ability; + +import net.minecraft.client.resources.I18n; + +public interface IBaseAbility { + String getName(); + + default String getExtension(int level) { + return ""; + } + + default String getFullName(int level) { + return I18n.format(getName()) + getExtension(level); + } + + default boolean isAllowed() { + return true; + } + + // 1 means no support for levels (i.e. the level is always 0). + // The UI only supports levels() between 1 and 10 (inclusive). + // All calls accepting an `int level` parameters must be done + // with a level between 0 and levels()-1 (inclusive). + default int levels() { + return 1; + } +} diff --git a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java new file mode 100644 index 000000000..2161e37f6 --- /dev/null +++ b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java @@ -0,0 +1,14 @@ +package com.hbm.handler.ability; + +import com.hbm.items.tool.IItemWithAbility; +import com.jcraft.jorbis.Block; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public interface IToolAreaAbility extends IBaseAbility { + // Should call tool.breakExtraBlock on a bunch of blocks. + // The initial block is always implicitly broken and shouldn't be included. + // TODO: Explosion needs it not to be broken, as it bypasses the harvest ability + void onDig(int level, World world, int x, int y, int z, EntityPlayer player, IItemWithAbility tool); +} diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java new file mode 100644 index 000000000..0138e406a --- /dev/null +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -0,0 +1,321 @@ +package com.hbm.handler.ability; + +import java.util.List; + +import com.hbm.config.ToolConfig; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.recipes.CentrifugeRecipes; +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.util.EnchantmentUtil; + +import net.minecraft.block.Block; +import net.minecraft.enchantment.Enchantment; +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.world.World; + +public interface IToolHarvestAbility extends IBaseAbility { + default void preHarvestAll(int level, World world, EntityPlayer player) {} + + default void postHarvestAll(int level, World world, EntityPlayer player) {} + + boolean skipDefaultDrops(int level); + + // Call IToolHarvestAbility.super.onHarvestBlock to emulate the actual block breaking + default void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + if (skipDefaultDrops(level)) { + // Emulate the block breaking without drops + world.setBlockToAir(x, y, z); + player.getHeldItem().damageItem(1, player); + } else if (player instanceof EntityPlayerMP) { + // Break the block conventionally + IItemWithAbility.standardDigPost(world, x, y, z, (EntityPlayerMP) player); + } + } + + public static enum HarvestAbility { + None( + new IToolHarvestAbility() { + @Override + public String getName() { + // TODO: null? empty? otherwise i18n + return ""; + } + + @Override + public boolean skipDefaultDrops(int level) { + return false; + } + } + ), + + Silk(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.silktouch"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilitySilk; + } + + @Override + public boolean skipDefaultDrops(int level) { + return false; + } + + @Override + public void preHarvestAll(int level, World world, EntityPlayer player) { + ItemStack stack = player.getHeldItem(); + EnchantmentUtil.addEnchantment(stack, Enchantment.silkTouch, 1); + } + + @Override + public void postHarvestAll(int level, World world, EntityPlayer player) { + // ToC-ToU mismatch should be impossible + // because both calls happen on the same tick. + // Even if can be forced somehow, the player doesn't gain any benefit from it. + ItemStack stack = player.getHeldItem(); + EnchantmentUtil.removeEnchantment(stack, Enchantment.silkTouch); + } + }), + + Luck(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.luck"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityLuck; + } + + final int[] powerAtLevel = {1, 2, 3, 4, 5, 9}; + + @Override + public int levels() { + return powerAtLevel.length; + } + + @Override + public String getExtension(int level) { + return " (" + powerAtLevel[level] + ")"; + } + + @Override + public boolean skipDefaultDrops(int level) { + return false; + } + + @Override + public void preHarvestAll(int level, World world, EntityPlayer player) { + ItemStack stack = player.getHeldItem(); + EnchantmentUtil.addEnchantment(stack, Enchantment.fortune, powerAtLevel[level]); + } + + @Override + public void postHarvestAll(int level, World world, EntityPlayer player) { + // ToC-ToU mismatch should be impossible + // because both calls happen on the same tick. + // Even if can be forced somehow, the player doesn't gain any benefit from it. + ItemStack stack = player.getHeldItem(); + EnchantmentUtil.removeEnchantment(stack, Enchantment.fortune); + } + }), + + Smelter(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.smelter"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityFurnace; + } + + @Override + public boolean skipDefaultDrops(int level) { + return true; + } + + @Override + public void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + List 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) { + IToolHarvestAbility.super.onHarvestBlock(level, world, x, y, z, player, block, meta); + + for(ItemStack stack : drops) + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, stack.copy())); + } + } + }), + + Shredder(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.shredder"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityShredder; + } + + @Override + public boolean skipDefaultDrops(int level) { + return true; + } + + @Override + public void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + //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) { + IToolHarvestAbility.super.onHarvestBlock(level, world, x, y, z, player, block, meta); + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.copy())); + } + } + }), + + Centrifuge(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.centrifuge"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityCentrifuge; + } + + @Override + public boolean skipDefaultDrops(int level) { + return true; + } + + @Override + public void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + //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) { + IToolHarvestAbility.super.onHarvestBlock(level, world, x, y, z, player, block, meta); + + for(ItemStack st : result) { + if(st != null) + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, st.copy())); + } + } + } + }), + + Crystallizer(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.crystallizer"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityCrystallizer; + } + + @Override + public boolean skipDefaultDrops(int level) { + return true; + } + + @Override + public void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + //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) { + IToolHarvestAbility.super.onHarvestBlock(level, world, x, y, z, player, block, meta); + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, result.output.copy())); + } + } + }), + + Mercury(new IToolHarvestAbility() { + @Override + public String getName() { + return "tool.ability.mercury"; + } + + @Override + public boolean isAllowed() { + return ToolConfig.abilityMercury; + } + + @Override + public boolean skipDefaultDrops(int level) { + return true; + } + + @Override + public void onHarvestBlock(int level, World world, int x, int y, int z, EntityPlayer player, Block block, int meta) { + //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) { + IToolHarvestAbility.super.onHarvestBlock(level, world, x, y, z, player, block, meta); + world.spawnEntityInWorld(new EntityItem(world, x + 0.5, y + 0.5, z + 0.5, new ItemStack(ModItems.ingot_mercury, mercury))); + } + } + }); + + public IToolHarvestAbility handler; + + HarvestAbility(IToolHarvestAbility handler) { + this.handler = handler; + } + } +} diff --git a/src/main/java/com/hbm/handler/ability/IWeaponAbility.java b/src/main/java/com/hbm/handler/ability/IWeaponAbility.java new file mode 100644 index 000000000..cf293bbb0 --- /dev/null +++ b/src/main/java/com/hbm/handler/ability/IWeaponAbility.java @@ -0,0 +1,12 @@ +package com.hbm.handler.ability; + +import javax.swing.text.html.parser.Entity; + +import com.hbm.items.tool.IItemWithAbility; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; + +public interface IWeaponAbility extends IBaseAbility { + void onHit(int level, World world, EntityPlayer player, Entity victim, IItemWithAbility tool); +} diff --git a/src/main/java/com/hbm/items/tool/IItemAbility.java b/src/main/java/com/hbm/items/tool/IItemWithAbility.java similarity index 99% rename from src/main/java/com/hbm/items/tool/IItemAbility.java rename to src/main/java/com/hbm/items/tool/IItemWithAbility.java index 4096a2a6b..99d442fbb 100644 --- a/src/main/java/com/hbm/items/tool/IItemAbility.java +++ b/src/main/java/com/hbm/items/tool/IItemWithAbility.java @@ -22,7 +22,7 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.IShearable; import net.minecraftforge.event.world.BlockEvent; -public interface IItemAbility { +public interface IItemWithAbility { public boolean canHarvestBlock(Block par1Block, ItemStack itemStack); public boolean isShears(ItemStack stack); diff --git a/src/main/java/com/hbm/items/tool/ItemSwordAbility.java b/src/main/java/com/hbm/items/tool/ItemSwordAbility.java index 5c8132c58..f54f47446 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordAbility.java @@ -19,7 +19,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.ItemSword; import net.minecraft.util.EnumChatFormatting; -public class ItemSwordAbility extends ItemSword implements IItemAbility { +public class ItemSwordAbility extends ItemSword implements IItemWithAbility { private EnumRarity rarity = EnumRarity.common; // was there a reason for this to be private? diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index e0c8fd8a4..1dad676cf 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -40,7 +40,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class ItemToolAbility extends ItemTool implements IItemAbility, IDepthRockTool, IGUIProvider { +public class ItemToolAbility extends ItemTool implements IItemWithAbility, IDepthRockTool, IGUIProvider { protected boolean isShears = false; protected EnumToolType toolType; diff --git a/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png b/src/main/resources/assets/hbm/textures/gui/tool/gui_tool_ability.png index 5e53a867d0d9413790f32e433d6f0d090c3005fa..38157a296cd8dc963d8e0bb794f70740328f067c 100644 GIT binary patch delta 3601 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