From 1fb221c7f01af52e7b889442ee1791862d839b49 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Mon, 20 Feb 2017 14:07:35 -0800 Subject: [PATCH] Fix crash when creating a tank stack with meta > 15 (#1057) Also finally fixes the tanks so they properly drop themselves. --- .../bloodmagic/block/BlockBloodTank.java | 28 ++++++++++++++----- .../compat/jei/BloodMagicPlugin.java | 3 +- .../waila/provider/DataProviderBloodTank.java | 13 ++++----- .../item/block/ItemBlockBloodTank.java | 25 ++++++----------- .../assets/bloodmagic/lang/en_US.lang | 6 ++-- 5 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java index 4b6ab6f4..2f597d0c 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockBloodTank.java @@ -5,6 +5,7 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.base.BlockInteger; import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.tile.TileBloodTank; +import com.google.common.collect.Lists; import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -88,6 +89,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider return false; } + @Override + public void harvestBlock(World world, EntityPlayer player, BlockPos pos, IBlockState state, @Nullable TileEntity tile, ItemStack stack) { + super.harvestBlock(world, player, pos, state, tile, stack); + world.setBlockToAir(pos); + } + + @Override + public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) { + return willHarvest || super.removedByPlayer(state, world, pos, player, willHarvest); + } + @Override public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) { @@ -114,34 +126,36 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider @Override public List getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) { - ArrayList list = new ArrayList(); + List list = Lists.newArrayList(); TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { TileBloodTank bloodTank = (TileBloodTank) tile; - ItemStack drop = new ItemStack(this); + ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata()); NBTTagCompound tag = new NBTTagCompound(); - bloodTank.serialize(tag); + + if (bloodTank.getTank().getFluid() != null) + bloodTank.getTank().getFluid().writeToNBT(tag); + drop.setTagCompound(tag); - drop.setItemDamage(getMetaFromState(blockState)); list.add(drop); } return list; } - @Override public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack) { TileEntity tile = world.getTileEntity(pos); if (tile instanceof TileBloodTank) { + TileBloodTank bloodTank = (TileBloodTank) tile; NBTTagCompound tag = stack.getTagCompound(); if (tag != null) { - ((TileBloodTank) tile).deserialize(tag); - blockState.withProperty(getProperty(), stack.getMetadata()); + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); + bloodTank.getTank().setFluid(fluidStack); } } diff --git a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java index 07ba2d0c..09923177 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java +++ b/src/main/java/WayofTime/bloodmagic/compat/jei/BloodMagicPlugin.java @@ -5,7 +5,6 @@ import java.util.Map; import javax.annotation.Nonnull; import mezz.jei.api.*; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import WayofTime.bloodmagic.api.Constants; @@ -91,7 +90,7 @@ public class BloodMagicPlugin extends BlankModPlugin @Override public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { - subtypeRegistry.useNbtForSubtypes(Item.getItemFromBlock(ModBlocks.BLOOD_TANK)); + } @Override diff --git a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java index 6f381db5..f7aee7f8 100644 --- a/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/compat/waila/provider/DataProviderBloodTank.java @@ -44,16 +44,15 @@ public class DataProviderBloodTank implements IWailaDataProvider { TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); NBTTagCompound tag = accessor.getNBTData(); - int capacity = tag.getInteger(Constants.NBT.ALTAR_CAPACITY); + int capacity = accessor.getNBTData().getInteger(Constants.NBT.ALTAR_CAPACITY); currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.tier", bloodTank.getBlockMetadata() + 1)); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity") + ": " + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity", capacity)); - tag = tag.getCompoundTag(Constants.NBT.TANK); - FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); - if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag(Constants.NBT.TANK)); + if (fluidStack != null) { - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + capacity + "mB"); + currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type", fluidStack.getLocalizedName())); + currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount", fluidStack.amount, capacity)); } } } diff --git a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java index d9baff09..477a04b3 100644 --- a/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java +++ b/src/main/java/WayofTime/bloodmagic/item/block/ItemBlockBloodTank.java @@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.util.helper.TextHelper; -import com.google.common.base.Strings; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -38,10 +37,10 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem @Override public String getItemStackDisplayName(ItemStack stack) { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) + FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(stack.getTagCompound()); + if (fluidStack != null) { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1) + " (" + FluidStack.loadFluidStackFromNBT(tag).getLocalizedName() + ")"; + return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1) + " (" + fluidStack.getLocalizedName() + ")"; } else { @@ -53,15 +52,15 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem public void addInformation(ItemStack stack, EntityPlayer entityPlayer, List tooltip, boolean advanced) { tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1)); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity") + ": " + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.capacity", getCapacity(stack))); if (stack.hasTagCompound()) { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); + NBTTagCompound tag = stack.getTagCompound(); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); - if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null) + if (fluidStack != null) { - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type") + ": " + fluidStack.getLocalizedName()); - tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + getCapacity(stack) + "mB"); + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type", fluidStack.getLocalizedName())); + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount", fluidStack.amount, getCapacity(stack))); } } } @@ -77,13 +76,7 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem @Override public FluidStack getFluid(ItemStack stack) { - if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) - { - NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); - return FluidStack.loadFluidStackFromNBT(tag); - } - - return null; + return FluidStack.loadFluidStackFromNBT(stack.getTagCompound()); } @Override diff --git a/src/main/resources/assets/bloodmagic/lang/en_US.lang b/src/main/resources/assets/bloodmagic/lang/en_US.lang index 5c3409ad..577be153 100644 --- a/src/main/resources/assets/bloodmagic/lang/en_US.lang +++ b/src/main/resources/assets/bloodmagic/lang/en_US.lang @@ -539,9 +539,9 @@ tooltip.BloodMagic.itemFilter.oreDict=Used to filter through the Ore Dictionary tooltip.BloodMagic.itemFilter.exact=Filters the fluid input/output -tooltip.BloodMagic.fluid.type=Fluid Contained -tooltip.BloodMagic.fluid.amount=Amount -tooltip.BloodMagic.fluid.capacity=Capacity +tooltip.BloodMagic.fluid.type=Fluid Contained: %s +tooltip.BloodMagic.fluid.amount=Amount: %d / %d mB +tooltip.BloodMagic.fluid.capacity=Capacity: %d mB tooltip.BloodMagic.ghost.everything=Everything tooltip.BloodMagic.ghost.amount=Ghost item amount: %d