Bound tools

Fix errors

Fix

Fix

Patch

Patch
This commit is contained in:
Arcaratus 2015-12-29 14:32:35 -05:00
parent 6c6d8067bf
commit aa0f7d81a0
33 changed files with 880 additions and 31 deletions

View file

@ -2,9 +2,11 @@ package WayofTime.bloodmagic.api;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@RequiredArgsConstructor
@EqualsAndHashCode
@ -13,6 +15,8 @@ public class ItemStackWrapper {
public final Item item;
public final int stackSize;
public final int meta;
@Setter
public NBTTagCompound nbtTag;
public ItemStackWrapper(Item item, int stackSize) {
this(item, stackSize, 0);
@ -50,4 +54,10 @@ public class ItemStackWrapper {
public String toString() {
return stackSize + "x" + item.getUnlocalizedName() + "@" + this.meta;
}
public ItemStack toStack(int count) {
ItemStack result = new ItemStack(item, count, meta);
result.setTagCompound(nbtTag);
return result;
}
}

View file

@ -0,0 +1,39 @@
package WayofTime.bloodmagic.api.event;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.eventhandler.Cancelable;
import net.minecraftforge.fml.common.eventhandler.Event;
public class BoundToolEvent extends Event {
public EntityPlayer player;
public BoundToolEvent(EntityPlayer player) {
this.player = player;
}
@Cancelable
public static class Charge extends BoundToolEvent {
public ItemStack result;
public Charge(EntityPlayer player, ItemStack result) {
super(player);
this.result = result;
}
}
@Cancelable
public static class Release extends BoundToolEvent {
public final ItemStack boundTool;
public int charge;
public Release(EntityPlayer player, ItemStack boundTool, int charge) {
super(player);
this.boundTool = boundTool;
this.charge = charge;
}
}
}

View file

@ -20,7 +20,7 @@ public class ItemActivationCrystal extends ItemBindable {
setUnlocalizedName(Constants.Mod.MODID + ".activationCrystal.");
setHasSubtypes(true);
setEnergyUsed(100);
setLPUsed(100);
}
@Override

View file

@ -25,7 +25,7 @@ import java.util.List;
public class ItemBindable extends Item implements IBindable {
private int energyUsed;
private int lpUsed;
public ItemBindable() {
super();
@ -119,12 +119,12 @@ public class ItemBindable extends Item implements IBindable {
}
}
public int getEnergyUsed() {
return this.energyUsed;
public int getLPUsed() {
return this.lpUsed;
}
protected void setEnergyUsed(int energyUsed) {
this.energyUsed = energyUsed;
protected void setLPUsed(int lpUsed) {
this.lpUsed = lpUsed;
}
public String getBindableOwner(ItemStack stack) {

View file

@ -0,0 +1,36 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.Constants;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
public class ItemBloodShard extends Item {
public String[] names = { "weak", "demon" };
public ItemBloodShard() {
super();
setCreativeTab(BloodMagic.tabBloodMagic);
setUnlocalizedName(Constants.Mod.MODID + ".bloodShard.");
setHasSubtypes(true);
}
@Override
@SideOnly(Side.CLIENT)
public void getSubItems(Item id, CreativeTabs creativeTab, List<ItemStack> list) {
for (int i = 0; i < names.length; i++)
list.add(new ItemStack(id, 1, i));
}
@Override
public String getUnlocalizedName(ItemStack stack) {
return super.getUnlocalizedName(stack) + names[stack.getItemDamage()];
}
}

View file

@ -0,0 +1,83 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLeavesBase;
import net.minecraft.block.material.Material;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import java.util.List;
import java.util.Set;
public class ItemBoundAxe extends ItemBoundTool {
private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin, Blocks.melon_block, Blocks.ladder);
public ItemBoundAxe() {
super("axe", 5, EFFECTIVE_ON);
}
@Override
public float getStrVsBlock(ItemStack stack, Block block) {
return block.getMaterial() != Material.wood && block.getMaterial() != Material.plants && block.getMaterial() != Material.vine ? super.getStrVsBlock(stack, block) : 12F;
}
@Override
protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) {
boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(player);
int fortuneLvl = EnchantmentHelper.getFortuneModifier(player);
int range = (int) (charge * 0.25);
HashMultiset<ItemStackWrapper> drops = HashMultiset.create();
BlockPos playerPos = player.getPosition().add(0, -1, 0);
for (int i = -range; i <= range; i++) {
for (int j = -range; j <= range; j++) {
for (int k = -range; k <= range; k++) {
BlockPos blockPos = playerPos.add(i, j, k);
Block block = world.getBlockState(blockPos).getBlock();
int blockMeta = block.getMetaFromState(world.getBlockState(blockPos));
if (block != null && block.getBlockHardness(world, blockPos) != -1) {
float strengthVsBlock = getStrVsBlock(stack, block);
if (strengthVsBlock > 1.1F || block instanceof BlockLeavesBase && world.canMineBlockBody(player, blockPos)) {
if (silkTouch && block.canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player))
drops.add(new ItemStackWrapper(block, 1, blockMeta));
else {
List<ItemStack> itemDrops = block.getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl);
if (itemDrops != null)
for (ItemStack stacks : itemDrops)
drops.add(ItemStackWrapper.getHolder(stacks));
}
world.setBlockToAir(blockPos);
}
}
}
}
}
world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.5F, false);
dropStacks(drops, world, playerPos.add(0, 1, 0));
}
@Override
public Multimap<String, AttributeModifier> getAttributeModifiers(ItemStack stack) {
Multimap<String, AttributeModifier> multimap = super.getAttributeModifiers(stack);
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(itemModifierUUID, "Weapon modifier", 7, 0));
return multimap;
}
}

View file

@ -0,0 +1,89 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.Sets;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import java.util.List;
import java.util.Set;
public class ItemBoundPickaxe extends ItemBoundTool {
private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.activator_rail, Blocks.coal_ore, Blocks.cobblestone, Blocks.detector_rail, Blocks.diamond_block, Blocks.diamond_ore, Blocks.double_stone_slab, Blocks.golden_rail, Blocks.gold_block, Blocks.gold_ore, Blocks.ice, Blocks.iron_block, Blocks.iron_ore, Blocks.lapis_block, Blocks.lapis_ore, Blocks.lit_redstone_ore, Blocks.mossy_cobblestone, Blocks.netherrack, Blocks.packed_ice, Blocks.rail, Blocks.redstone_ore, Blocks.sandstone, Blocks.red_sandstone, Blocks.stone, Blocks.stone_slab);
public ItemBoundPickaxe() {
super("pickaxe", 5, EFFECTIVE_ON);
}
@Override
public boolean canHarvestBlock(Block blockIn) {
return true;
}
@Override
public float getStrVsBlock(ItemStack stack, Block block) {
return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock ? super.getStrVsBlock(stack, block) : 12F;
}
@Override
protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) {
boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(player);
int fortuneLvl = EnchantmentHelper.getFortuneModifier(player);
int range = (int) (charge * 0.25);
HashMultiset<ItemStackWrapper> drops = HashMultiset.create();
BlockPos playerPos = player.getPosition().add(0, -1, 0);
for (int i = -range; i <= range; i++) {
for (int j = -range; j <= range; j++) {
for (int k = -range; k <= range; k++) {
BlockPos blockPos = playerPos.add(i, j, k);
Block block = world.getBlockState(blockPos).getBlock();
int blockMeta = block.getMetaFromState(world.getBlockState(blockPos));
if (block != null && block.getBlockHardness(world, blockPos) != -1) {
float strengthVsBlock = getStrVsBlock(stack, block);
if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) {
if (silkTouch && block.canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player))
drops.add(new ItemStackWrapper(block, 1, blockMeta));
else {
List<ItemStack> itemDrops = block.getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl);
if (itemDrops != null)
for (ItemStack stacks : itemDrops)
drops.add(ItemStackWrapper.getHolder(stacks));
}
world.setBlockToAir(blockPos);
}
}
}
}
}
world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.5F, false);
dropStacks(drops, world, playerPos.add(0, 1, 0));
}
@Override
public Multimap<String, AttributeModifier> getAttributeModifiers(ItemStack stack) {
Multimap<String, AttributeModifier> multimap = super.getAttributeModifiers(stack);
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(itemModifierUUID, "Weapon modifier", 5, 0));
return multimap;
}
}

View file

@ -0,0 +1,81 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multimap;
import com.google.common.collect.Sets;
import net.minecraft.block.Block;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.world.World;
import java.util.List;
import java.util.Set;
public class ItemBoundShovel extends ItemBoundTool {
private static final Set<Block> EFFECTIVE_ON = Sets.newHashSet(Blocks.clay, Blocks.dirt, Blocks.farmland, Blocks.grass, Blocks.gravel, Blocks.mycelium, Blocks.sand, Blocks.snow, Blocks.snow_layer, Blocks.soul_sand);
public ItemBoundShovel() {
super("shovel", 5, EFFECTIVE_ON);
}
@Override
public boolean canHarvestBlock(Block blockIn) {
return blockIn == Blocks.snow_layer || blockIn == Blocks.snow;
}
@Override
protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) {
boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(player);
int fortuneLvl = EnchantmentHelper.getFortuneModifier(player);
int range = (int) (charge * 0.25);
HashMultiset<ItemStackWrapper> drops = HashMultiset.create();
BlockPos playerPos = player.getPosition().add(0, -1, 0);
for (int i = -range; i <= range; i++) {
for (int j = -range; j <= range; j++) {
for (int k = -range; k <= range; k++) {
BlockPos blockPos = playerPos.add(i, j, k);
Block block = world.getBlockState(blockPos).getBlock();
int blockMeta = block.getMetaFromState(world.getBlockState(blockPos));
if (block != null && block.getBlockHardness(world, blockPos) != -1) {
float strengthVsBlock = getStrVsBlock(stack, block);
if (strengthVsBlock > 1.1F && world.canMineBlockBody(player, blockPos)) {
if (silkTouch && block.canSilkHarvest(world, blockPos, world.getBlockState(blockPos), player))
drops.add(new ItemStackWrapper(block, 1, blockMeta));
else {
List<ItemStack> itemDrops = block.getDrops(world, blockPos, world.getBlockState(blockPos), fortuneLvl);
if (itemDrops != null)
for (ItemStack stacks : itemDrops)
drops.add(ItemStackWrapper.getHolder(stacks));
}
world.setBlockToAir(blockPos);
}
}
}
}
}
world.createExplosion(player, playerPos.getX(), playerPos.getY(), playerPos.getZ(), 0.5F, false);
dropStacks(drops, world, playerPos.add(0, 1, 0));
}
@Override
public Multimap<String, AttributeModifier> getAttributeModifiers(ItemStack stack) {
Multimap<String, AttributeModifier> multimap = super.getAttributeModifiers(stack);
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(itemModifierUUID, "Weapon modifier", 1, 0));
return multimap;
}
}

View file

@ -0,0 +1,137 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.event.BoundToolEvent;
import WayofTime.bloodmagic.api.util.helper.BindableHelper;
import WayofTime.bloodmagic.api.util.helper.NBTHelper;
import WayofTime.bloodmagic.registry.ModItems;
import WayofTime.bloodmagic.util.helper.TextHelper;
import com.google.common.base.Strings;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.StatCollector;
import net.minecraft.world.Explosion;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
public class ItemBoundSword extends ItemSword {
private int lpUsed;
public ItemBoundSword() {
super(ModItems.boundToolMaterial);
setUnlocalizedName(Constants.Mod.MODID + ".bound.sword");
setHasSubtypes(true);
setNoRepair();
setCreativeTab(BloodMagic.tabBloodMagic);
this.lpUsed = 50;
}
@Override
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityPlayer playerIn, int timeLeft) {
if (!playerIn.isSneaking() && getActivated(stack)) {
int i = this.getMaxItemUseDuration(stack) - timeLeft;
BoundToolEvent.Release event = new BoundToolEvent.Release(playerIn, stack, i);
if (MinecraftForge.EVENT_BUS.post(event))
return;
i = event.charge;
//TODO Make conical charge blast
Explosion explosion = new Explosion(worldIn, playerIn, playerIn.posX, playerIn.posY, playerIn.posZ, (float) (i * 0.5), true, true);
if (net.minecraftforge.event.ForgeEventFactory.onExplosionStart(worldIn, explosion)) return;
explosion.doExplosionA();
explosion.doExplosionB(true);
}
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
BindableHelper.checkAndSetItemOwner(stack, player);
// if (!world.isRemote)
{
if (player.isSneaking())
setActivated(stack, !getActivated(stack));
if (getActivated(stack) && ItemBindable.syphonBatteries(stack, player, lpUsed))
return stack;
if (!player.isSneaking() && getActivated(stack)) {
BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack);
if (MinecraftForge.EVENT_BUS.post(event))
return event.result;
player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
}
}
return stack;
}
@Override
public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase attacker) {
if (getActivated(stack)) {
if (target != null || attacker != null) {
if (target instanceof EntityLiving) {
if (!target.isPotionActive(Potion.weakness))
target.addPotionEffect(new PotionEffect(Potion.weakness.id, 60, 2));
}
}
return true;
}
return false;
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn)
{
return stack;
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.BLOCK;
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List<String> tooltip, boolean advanced) {
NBTHelper.checkNBT(stack);
if (StatCollector.canTranslate("tooltip.BloodMagic.bound.sword.desc"))
tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.bound.sword.desc"));
if (getActivated(stack))
tooltip.add(TextHelper.localize("tooltip.BloodMagic.activated"));
else
tooltip.add(TextHelper.localize("tooltip.BloodMagic.deactivated"));
if (!Strings.isNullOrEmpty(stack.getTagCompound().getString(Constants.NBT.OWNER_UUID)))
tooltip.add(TextHelper.getFormattedText(String.format(StatCollector.translateToLocal("tooltip.BloodMagic.currentOwner"), stack.getTagCompound().getString(Constants.NBT.OWNER_UUID))));
}
private boolean getActivated(ItemStack stack) {
return stack.getItemDamage() > 0;
}
private ItemStack setActivated(ItemStack stack, boolean activated) {
stack.setItemDamage(activated ? 1 : 0);
return stack;
}
}

View file

@ -0,0 +1,196 @@
package WayofTime.bloodmagic.item;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.api.ItemStackWrapper;
import WayofTime.bloodmagic.api.event.BoundToolEvent;
import WayofTime.bloodmagic.api.util.helper.BindableHelper;
import WayofTime.bloodmagic.util.helper.TextHelper;
import com.google.common.collect.Multiset;
import lombok.Getter;
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.List;
import java.util.Set;
@Getter
public class ItemBoundTool extends ItemBindable {
private Set<Block> effectiveBlocks;
protected final String tooltipBase;
private final String name;
public boolean beingHeldDown;
private int heldDownCount;
public final int chargeTime = 30;
public ItemBoundTool(String name, int lpUsed, Set<Block> effectiveBlocks) {
super();
setUnlocalizedName(Constants.Mod.MODID + ".bound." + name);
setHasSubtypes(true);
setLPUsed(lpUsed);
setFull3D();
this.name = name;
this.tooltipBase = "tooltip.BloodMagic.bound." + name + ".";
this.effectiveBlocks = effectiveBlocks;
}
public ItemBoundTool(String name, int lpUsed) {
this(name, lpUsed, null);
}
@Override
public float getStrVsBlock(ItemStack stack, Block block) {
return this.effectiveBlocks.contains(block) ? 8.0F : 1.0F;
}
@Override
public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) {
if (entityIn instanceof EntityPlayer && getActivated(stack) && isSelected && isBeingHeldDown() && stack == ((EntityPlayer) entityIn).getCurrentEquippedItem()) {
EntityPlayer player = (EntityPlayer) entityIn;
heldDownCount = Math.min(player.getItemInUseDuration(), chargeTime);
}
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
BindableHelper.checkAndSetItemOwner(stack, player);
// if (!world.isRemote)
{
if (player.isSneaking())
setActivated(stack, !getActivated(stack));
// if (getActivated(stack) && ItemBindable.syphonBatteries(stack, player, getLPUsed()))
// return stack;
if (!player.isSneaking() && getActivated(stack)) {
BoundToolEvent.Charge event = new BoundToolEvent.Charge(player, stack);
if (MinecraftForge.EVENT_BUS.post(event))
return event.result;
player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
beingHeldDown = true;
}
}
return stack;
}
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) {
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getLPUsed()))
return false;
return false;
}
@Override
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ) {
this.onItemRightClick(stack, world, player);
return false;
}
@Override
public void onPlayerStoppedUsing(ItemStack stack, World worldIn, EntityPlayer playerIn, int timeLeft) {
if (!playerIn.isSneaking() && getActivated(stack)) {
int i = this.getMaxItemUseDuration(stack) - timeLeft;
BoundToolEvent.Release event = new BoundToolEvent.Release(playerIn, stack, i);
if (MinecraftForge.EVENT_BUS.post(event))
return;
i = event.charge;
onBoundRelease(stack, worldIn, playerIn, Math.min(i, chargeTime));
beingHeldDown = false;
}
}
protected void onBoundRelease(ItemStack stack, World world, EntityPlayer player, int charge) {
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, EntityPlayer playerIn) {
return stack;
}
@Override
public int getMaxItemUseDuration(ItemStack stack) {
return 72000;
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.BOW;
}
@Override
public int getItemEnchantability() {
return 50;
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, EntityPlayer player, List<String> tooltip, boolean advanced) {
if (StatCollector.canTranslate(tooltipBase + "desc"))
tooltip.add(TextHelper.localizeEffect(tooltipBase + "desc"));
if (getActivated(stack))
tooltip.add(TextHelper.localize("tooltip.BloodMagic.activated"));
else
tooltip.add(TextHelper.localize("tooltip.BloodMagic.deactivated"));
super.addInformation(stack, player, tooltip, advanced);
}
@Override
public boolean showDurabilityBar(ItemStack stack) {
return getActivated(stack) && beingHeldDown;
}
@Override
public double getDurabilityForDisplay(ItemStack stack) {
return ((double) -Math.min(getHeldDownCount(), chargeTime) / chargeTime) + 1;
}
protected static void dropStacks(Multiset<ItemStackWrapper> drops, World world, BlockPos posToDrop) {
for (Multiset.Entry<ItemStackWrapper> entry : drops.entrySet()) {
int count = entry.getCount();
ItemStackWrapper stack = entry.getElement();
int maxStackSize = stack.item.getItemStackLimit(stack.toStack(1));
while (count >= maxStackSize) {
world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(maxStackSize)));
count -= maxStackSize;
}
if (count > 0)
world.spawnEntityInWorld(new EntityItem(world, posToDrop.getX(), posToDrop.getY(), posToDrop.getZ(), stack.toStack(count)));
}
}
public boolean getActivated(ItemStack stack) {
return stack.getItemDamage() > 0;
}
public ItemStack setActivated(ItemStack stack, boolean activated) {
stack.setItemDamage(activated ? 1 : 0);
return stack;
}
}

View file

@ -24,7 +24,7 @@ public class ItemInscriptionTool extends ItemBindable {
public ItemInscriptionTool() {
super();
setEnergyUsed(100);
setLPUsed(100);
setUnlocalizedName(Constants.Mod.MODID + ".scribe.");
setHasSubtypes(true);
}

View file

@ -31,7 +31,7 @@ public class ItemSigilAir extends ItemSigilBase {
player.fallDistance = 0;
if (!player.capabilities.isCreativeMode)
this.setUnusable(stack, !syphonBatteries(stack, player, getEnergyUsed()));
this.setUnusable(stack, !syphonBatteries(stack, player, getLPUsed()));
}
return super.onItemRightClick(stack, world, player);

View file

@ -24,11 +24,11 @@ public class ItemSigilBase extends ItemBindable implements ISigil {
private final String name;
private boolean toggleable;
public ItemSigilBase(String name, int energyUsed) {
public ItemSigilBase(String name, int lpUsed) {
super();
setUnlocalizedName(Constants.Mod.MODID + ".sigil." + name);
setEnergyUsed(energyUsed);
setLPUsed(lpUsed);
this.name = name;
this.tooltipBase = "tooltip.BloodMagic.sigil." + name + ".";

View file

@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import org.lwjgl.Sys;
public class ItemSigilBloodLight extends ItemSigilBase {
@ -19,7 +18,7 @@ public class ItemSigilBloodLight extends ItemSigilBase {
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getEnergyUsed() * 5) && !world.isRemote)
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getLPUsed() * 5) && !world.isRemote)
world.spawnEntityInWorld(new EntityBloodLight(world, player));
return stack;
@ -29,7 +28,7 @@ public class ItemSigilBloodLight extends ItemSigilBase {
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) {
if (world.isRemote) return false;
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getEnergyUsed())) {
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getLPUsed())) {
BlockPos newPos = blockPos.offset(side);
if (world.isAirBlock(newPos)) {

View file

@ -47,14 +47,14 @@ public class ItemSigilLava extends ItemSigilBase {
return stack;
}
if (this.canPlaceLava(world, blockpos1) && syphonBatteries(stack, player, getEnergyUsed()) && this.tryPlaceLava(world, blockpos1)) {
if (this.canPlaceLava(world, blockpos1) && syphonBatteries(stack, player, getLPUsed()) && this.tryPlaceLava(world, blockpos1)) {
return stack;
}
}
}
if (!player.capabilities.isCreativeMode)
this.setUnusable(stack, !syphonBatteries(stack, player, getEnergyUsed()));
this.setUnusable(stack, !syphonBatteries(stack, player, getLPUsed()));
}
return stack;
@ -74,7 +74,7 @@ public class ItemSigilLava extends ItemSigilBase {
FluidStack fluid = new FluidStack(FluidRegistry.LAVA, 1000);
int amount = ((IFluidHandler) tile).fill(side, fluid, false);
if (amount > 0 && syphonBatteries(stack, player, getEnergyUsed())) {
if (amount > 0 && syphonBatteries(stack, player, getLPUsed())) {
((IFluidHandler) tile).fill(side, fluid, true);
}
@ -90,7 +90,7 @@ public class ItemSigilLava extends ItemSigilBase {
return false;
}
if (this.canPlaceLava(world, newPos) && syphonBatteries(stack, player, getEnergyUsed())) {
if (this.canPlaceLava(world, newPos) && syphonBatteries(stack, player, getLPUsed())) {
return this.tryPlaceLava(world, newPos);
}

View file

@ -37,7 +37,7 @@ public class ItemSigilToggleable extends ItemSigilBase {
if (!world.isRemote && !isUnusable(stack)) {
if (player.isSneaking())
setActivated(stack, !getActivated(stack));
if (getActivated(stack) && ItemBindable.syphonBatteries(stack, player, getEnergyUsed()))
if (getActivated(stack) && ItemBindable.syphonBatteries(stack, player, getLPUsed()))
return stack;
}
@ -46,7 +46,7 @@ public class ItemSigilToggleable extends ItemSigilBase {
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, BlockPos blockPos, EnumFacing side, float hitX, float hitY, float hitZ) {
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getEnergyUsed()))
if (BindableHelper.checkAndSetItemOwner(stack, player) && ItemBindable.syphonBatteries(stack, player, getLPUsed()))
return onSigilUseFirst(stack, player, world, blockPos, side, hitX, hitY, hitZ);
return false;
@ -60,7 +60,7 @@ public class ItemSigilToggleable extends ItemSigilBase {
public void onUpdate(ItemStack stack, World worldIn, Entity entityIn, int itemSlot, boolean isSelected) {
if (!worldIn.isRemote && entityIn instanceof EntityPlayerMP && getActivated(stack)) {
if (worldIn.getWorldTime() % 100 == 0) {
if (!ItemBindable.syphonBatteries(stack, (EntityPlayer) entityIn, getEnergyUsed())) {
if (!ItemBindable.syphonBatteries(stack, (EntityPlayer) entityIn, getLPUsed())) {
setActivated(stack, false);
}
}

View file

@ -42,7 +42,7 @@ public class ItemSigilVoid extends ItemSigilBase {
return stack;
}
if (world.getBlockState(blockpos).getBlock().getMaterial().isLiquid() && syphonBatteries(stack, player, getEnergyUsed())) {
if (world.getBlockState(blockpos).getBlock().getMaterial().isLiquid() && syphonBatteries(stack, player, getLPUsed())) {
world.setBlockToAir(blockpos);
return stack;
}
@ -52,7 +52,7 @@ public class ItemSigilVoid extends ItemSigilBase {
}
if (!player.capabilities.isCreativeMode)
this.setUnusable(stack, !syphonBatteries(stack, player, getEnergyUsed()));
this.setUnusable(stack, !syphonBatteries(stack, player, getLPUsed()));
}
return stack;
@ -72,7 +72,7 @@ public class ItemSigilVoid extends ItemSigilBase {
if (tile instanceof IFluidHandler) {
FluidStack amount = ((IFluidHandler) tile).drain(side, 1000, false);
if (amount != null && amount.amount > 0 && syphonBatteries(stack, player, getEnergyUsed())) {
if (amount != null && amount.amount > 0 && syphonBatteries(stack, player, getLPUsed())) {
((IFluidHandler) tile).drain(side, 1000, true);
return true;
}
@ -86,7 +86,7 @@ public class ItemSigilVoid extends ItemSigilBase {
return false;
}
if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && syphonBatteries(stack, player, getEnergyUsed())) {
if (world.getBlockState(newPos).getBlock() instanceof IFluidBlock && syphonBatteries(stack, player, getLPUsed())) {
world.setBlockToAir(newPos);
return true;
}

View file

@ -47,14 +47,14 @@ public class ItemSigilWater extends ItemSigilBase {
return stack;
}
if (this.canPlaceWater(world, blockpos1) && syphonBatteries(stack, player, getEnergyUsed()) && this.tryPlaceWater(world, blockpos1)) {
if (this.canPlaceWater(world, blockpos1) && syphonBatteries(stack, player, getLPUsed()) && this.tryPlaceWater(world, blockpos1)) {
return stack;
}
}
}
if (!player.capabilities.isCreativeMode)
this.setUnusable(stack, !syphonBatteries(stack, player, getEnergyUsed()));
this.setUnusable(stack, !syphonBatteries(stack, player, getLPUsed()));
}
return stack;
@ -75,7 +75,7 @@ public class ItemSigilWater extends ItemSigilBase {
FluidStack fluid = new FluidStack(FluidRegistry.WATER, 1000);
int amount = ((IFluidHandler) tile).fill(side, fluid, false);
if (amount > 0 && syphonBatteries(stack, player, getEnergyUsed())) {
if (amount > 0 && syphonBatteries(stack, player, getLPUsed())) {
((IFluidHandler) tile).fill(side, fluid, true);
}
@ -91,7 +91,7 @@ public class ItemSigilWater extends ItemSigilBase {
return false;
}
if (this.canPlaceWater(world, newPos) && syphonBatteries(stack, player, getEnergyUsed())) {
if (this.canPlaceWater(world, newPos) && syphonBatteries(stack, player, getLPUsed())) {
return this.tryPlaceWater(world, newPos);
}

View file

@ -1,16 +1,18 @@
package WayofTime.bloodmagic.potion;
import WayofTime.bloodmagic.registry.ModItems;
import WayofTime.bloodmagic.registry.ModPotions;
import net.minecraft.entity.Entity;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.passive.EntityAnimal;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.entity.projectile.EntityThrowable;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.living.EnderTeleportEvent;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.event.entity.living.LivingEvent;
import net.minecraftforge.event.entity.living.*;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@ -101,6 +103,22 @@ public class PotionEventHandlers {
}
}
@SubscribeEvent
public void onEntityDrop(LivingDropsEvent event) {
if (event.source.getDamageType().equals("player")) {
double rand = Math.random();
if (!(event.entityLiving instanceof EntityAnimal)) {
PotionEffect effect = event.entityLiving.getActivePotionEffect(Potion.weakness);
if (effect != null)
if (effect.getAmplifier() >= 2)
if (rand < 0.2)
event.entityLiving.dropItem(ModItems.bloodShard, 1);
}
}
}
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onPlayerDamageEvent(LivingAttackEvent event) {
if (event.entityLiving.isPotionActive(ModPotions.whirlwind) && event.isCancelable() && event.source.isProjectile())

View file

@ -1,6 +1,7 @@
package WayofTime.bloodmagic.registry;
import net.minecraft.item.Item;
import net.minecraftforge.common.util.EnumHelper;
import net.minecraftforge.fml.common.registry.GameRegistry;
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.ConfigHandler;
@ -35,6 +36,11 @@ public class ModItems {
public static Item packSacrifice;
public static Item daggerOfSacrifice;
public static Item boundSword;
public static Item boundPickaxe;
public static Item boundAxe;
public static Item boundShovel;
public static Item sigilDivination;
public static Item sigilAir;
public static Item sigilWater;
@ -54,6 +60,8 @@ public class ModItems {
public static Item sigilCompression;
public static Item itemComponent;
public static Item bloodShard;
public static Item livingArmourHelmet;
public static Item livingArmourChest;
@ -62,6 +70,8 @@ public class ModItems {
public static Item altarMaker;
public static Item.ToolMaterial boundToolMaterial = EnumHelper.addToolMaterial("BoundToolMaterial", 4, 0, 12, 8, 50);
public static void init() {
bloodOrb = registerItem(new ItemBloodOrb());
orbWeak = new BloodOrb("weak", 1, 5000);
@ -88,6 +98,11 @@ public class ModItems {
packSelfSacrifice = registerItem(new ItemPackSelfSacrifice());
daggerOfSacrifice = registerItem(new ItemDaggerOfSacrifice());
boundSword = registerItem(new ItemBoundSword());
boundPickaxe = registerItem(new ItemBoundPickaxe());
boundAxe = registerItem(new ItemBoundAxe());
boundShovel = registerItem(new ItemBoundShovel());
sigilDivination = registerItem(new ItemSigilDivination());
sigilAir = registerItem(new ItemSigilAir());
sigilWater = registerItem(new ItemSigilWater());
@ -107,6 +122,8 @@ public class ModItems {
sigilEnderSeverance = registerItem(new ItemSigilEnderSeverance());
itemComponent = registerItem(new ItemComponent());
bloodShard = registerItem(new ItemBloodShard());
livingArmourHelmet = registerItem(new ItemLivingArmour(0), "ItemLivingArmourHelmet");
livingArmourChest = registerItem(new ItemLivingArmour(1), "ItemLivingArmourChest");
@ -152,6 +169,15 @@ public class ModItems {
renderHelper.itemRender(packSelfSacrifice);
renderHelper.itemRender(daggerOfSacrifice);
renderHelper.itemRender(boundSword, 0);
renderHelper.itemRender(boundSword, 1);
renderHelper.itemRender(boundPickaxe, 0);
renderHelper.itemRender(boundPickaxe, 1);
renderHelper.itemRender(boundAxe, 0);
renderHelper.itemRender(boundAxe, 1);
renderHelper.itemRender(boundShovel, 0);
renderHelper.itemRender(boundShovel, 1);
renderHelper.itemRender(sigilDivination);
renderHelper.itemRender(sigilAir);
renderHelper.itemRender(sigilWater);
@ -183,6 +209,9 @@ public class ModItems {
for(int i = 0 ; i < ItemComponent.getNames().size() ; i++)
renderHelper.itemRender(itemComponent, i);
renderHelper.itemRender(bloodShard, 0);
renderHelper.itemRender(bloodShard, 1);
renderHelper.itemRender(livingArmourHelmet);
renderHelper.itemRender(livingArmourChest);
renderHelper.itemRender(livingArmourLegs);

View file

@ -3,6 +3,7 @@ package WayofTime.bloodmagic.util.handler;
import WayofTime.bloodmagic.api.util.helper.PlayerHelper;
import WayofTime.bloodmagic.block.BlockAltar;
import WayofTime.bloodmagic.item.ItemAltarMaker;
import WayofTime.bloodmagic.item.ItemBoundSword;
import WayofTime.bloodmagic.item.gear.ItemPackSacrifice;
import WayofTime.bloodmagic.registry.ModBlocks;
import WayofTime.bloodmagic.registry.ModItems;
@ -16,6 +17,7 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.player.FillBucketEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.world.BlockEvent;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@ -69,4 +71,13 @@ public class EventHandler {
ChatUtil.sendNoSpam(event.entityPlayer, TextHelper.localizeEffect("chat.BloodMagic.altarMaker.destroy", altarMaker.destroyAltar(event.entityPlayer)));
}
}
@SubscribeEvent
public void onBlockBreak(BlockEvent.BreakEvent event) {
if (!event.world.isRemote && event.getPlayer() != null) {
if (event.getPlayer().capabilities.isCreativeMode && event.getPlayer().getCurrentEquippedItem().getItem() instanceof ItemBoundSword) {
event.setCanceled(true);
}
}
}
}

View file

@ -12,6 +12,11 @@ item.BloodMagic.pack.selfSacrifice.name=Blood Letter's Pack
item.BloodMagic.pack.sacrifice.name=Coat of Arms
item.BloodMagic.daggerOfSacrifice.name=Dagger of Sacrifice
item.BloodMagic.bound.sword.name=Bound Sword
item.BloodMagic.bound.pickaxe.name=Bound Pickaxe
item.BloodMagic.bound.axe.name=Bound Axe
item.BloodMagic.bound.shovel.name=Bound Shovel
item.BloodMagic.bucket.lifeEssence.name=Bucket of Life
item.BloodMagic.scribe.water.name=Elemental Inscription Tool: Water
@ -60,6 +65,9 @@ item.BloodMagic.reagent.virtus.name=Virtus
item.BloodMagic.reagent.reductus.name=Reductus
item.BloodMagic.reagent.potentia.name=Potentia
item.BloodMagic.bloodShard.weak.name=Weak Blood Shard
item.BloodMagic.bloodShard.demon.name=Demon Blood Shard
item.BloodMagic.baseComponent.reagentWater.name=Water Reagent
item.BloodMagic.baseComponent.reagentLava.name=Lava Reagent
item.BloodMagic.baseComponent.reagentAir.name=Air Reagent
@ -156,6 +164,11 @@ tooltip.BloodMagic.sigil.phantomBridge.desc=&oWalking on thin air...
tooltip.BloodMagic.sigil.whirlwind.desc=&oBest not to wear a skirt
tooltip.BloodMagic.sigil.enderSeverance.desc=&oPutting Endermen in Dire situations!
tooltip.BloodMagic.bound.sword.desc=&oCulling the weak
tooltip.BloodMagic.bound.pickaxe.desc=&oDestroying stone without mercy
tooltip.BloodMagic.bound.axe.desc=&oDemonic deforestation
tooltip.BloodMagic.bound.shovel.desc=&oScrubs floors clean of dirt
tooltip.BloodMagic.sacrificialDagger.desc=Just a prick of the finger will suffice...
tooltip.BloodMagic.slate.desc=Infused stone inside of a Blood Altar
tooltip.BloodMagic.inscriber.desc=The writing is on the wall...

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/WeakBloodShard"
}
}

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/DemonBloodShard"
}
}

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/Item_deactivated"
}
}

View file

@ -0,0 +1,18 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/BoundAxe_activated"
},
"display": {
"thirdperson": {
"rotation": [ 0, 90, -35 ],
"translation": [ 0, 1.25, -3.5 ],
"scale": [ 0.85, 0.85, 0.85 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/Item_deactivated"
}
}

View file

@ -0,0 +1,18 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/BoundPickaxe_activated"
},
"display": {
"thirdperson": {
"rotation": [ 0, 90, -35 ],
"translation": [ 0, 1.25, -3.5 ],
"scale": [ 0.85, 0.85, 0.85 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/Item_deactivated"
}
}

View file

@ -0,0 +1,18 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/BoundShovel_activated"
},
"display": {
"thirdperson": {
"rotation": [ 0, 90, -35 ],
"translation": [ 0, 1.25, -3.5 ],
"scale": [ 0.85, 0.85, 0.85 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}

View file

@ -0,0 +1,6 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/Item_deactivated"
}
}

View file

@ -0,0 +1,18 @@
{
"parent":"bloodmagic:item/ItemModelBase",
"textures": {
"layer0":"bloodmagic:items/BoundSword_activated"
},
"display": {
"thirdperson": {
"rotation": [ 0, 90, -35 ],
"translation": [ 0, 1.25, -3.5 ],
"scale": [ 0.85, 0.85, 0.85 ]
},
"firstperson": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}