Fix crash when creating a tank stack with meta > 15 (#1057)

Also finally fixes the tanks so they properly drop themselves.
This commit is contained in:
Nicholas Ignoffo 2017-02-20 14:07:35 -08:00
parent 4ac87f5e8a
commit 1fb221c7f0
5 changed files with 40 additions and 35 deletions

View file

@ -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<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune)
{
ArrayList<ItemStack> list = new ArrayList<ItemStack>();
List<ItemStack> 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);
}
}

View file

@ -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

View file

@ -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));
}
}
}

View file

@ -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<String> 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

View file

@ -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