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.block.base.BlockInteger;
import WayofTime.bloodmagic.client.IVariantProvider; import WayofTime.bloodmagic.client.IVariantProvider;
import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank;
import com.google.common.collect.Lists;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material; import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@ -88,6 +89,17 @@ public class BlockBloodTank extends BlockInteger implements IVariantProvider
return false; 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 @Override
public boolean onBlockActivated(World world, BlockPos blockPos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ) 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 @Override
public List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState blockState, int fortune) 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); TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileBloodTank) if (tile instanceof TileBloodTank)
{ {
TileBloodTank bloodTank = (TileBloodTank) tile; TileBloodTank bloodTank = (TileBloodTank) tile;
ItemStack drop = new ItemStack(this); ItemStack drop = new ItemStack(this, 1, bloodTank.getBlockMetadata());
NBTTagCompound tag = new NBTTagCompound(); NBTTagCompound tag = new NBTTagCompound();
bloodTank.serialize(tag);
if (bloodTank.getTank().getFluid() != null)
bloodTank.getTank().getFluid().writeToNBT(tag);
drop.setTagCompound(tag); drop.setTagCompound(tag);
drop.setItemDamage(getMetaFromState(blockState));
list.add(drop); list.add(drop);
} }
return list; return list;
} }
@Override
public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack) public void onBlockPlacedBy(World world, BlockPos pos, IBlockState blockState, EntityLivingBase placer, ItemStack stack)
{ {
TileEntity tile = world.getTileEntity(pos); TileEntity tile = world.getTileEntity(pos);
if (tile instanceof TileBloodTank) if (tile instanceof TileBloodTank)
{ {
TileBloodTank bloodTank = (TileBloodTank) tile;
NBTTagCompound tag = stack.getTagCompound(); NBTTagCompound tag = stack.getTagCompound();
if (tag != null) if (tag != null)
{ {
((TileBloodTank) tile).deserialize(tag); FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag);
blockState.withProperty(getProperty(), stack.getMetadata()); bloodTank.getTank().setFluid(fluidStack);
} }
} }

View file

@ -5,7 +5,6 @@ import java.util.Map;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import mezz.jei.api.*; import mezz.jei.api.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary;
import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.api.Constants;
@ -91,7 +90,7 @@ public class BloodMagicPlugin extends BlankModPlugin
@Override @Override
public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) { public void registerItemSubtypes(ISubtypeRegistry subtypeRegistry) {
subtypeRegistry.useNbtForSubtypes(Item.getItemFromBlock(ModBlocks.BLOOD_TANK));
} }
@Override @Override

View file

@ -44,16 +44,15 @@ public class DataProviderBloodTank implements IWailaDataProvider
{ {
TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity(); TileBloodTank bloodTank = (TileBloodTank) accessor.getTileEntity();
NBTTagCompound tag = accessor.getNBTData(); 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.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.getCompoundTag(Constants.NBT.TANK));
FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); if (fluidStack != null)
if (!Strings.isNullOrEmpty(tag.getString("FluidName")) && fluidStack != null)
{ {
currenttip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.type") + ": " + fluidStack.getLocalizedName()); 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.amount", fluidStack.amount, capacity));
} }
} }
} }

View file

@ -4,7 +4,6 @@ import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.block.BlockBloodTank; import WayofTime.bloodmagic.block.BlockBloodTank;
import WayofTime.bloodmagic.tile.TileBloodTank; import WayofTime.bloodmagic.tile.TileBloodTank;
import WayofTime.bloodmagic.util.helper.TextHelper; import WayofTime.bloodmagic.util.helper.TextHelper;
import com.google.common.base.Strings;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs; import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
@ -38,10 +37,10 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem
@Override @Override
public String getItemStackDisplayName(ItemStack stack) 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.getLocalizedName() + ")";
return super.getItemStackDisplayName(stack) + " " + TextHelper.localizeEffect("tooltip.BloodMagic.tier", stack.getItemDamage() + 1) + " (" + FluidStack.loadFluidStackFromNBT(tag).getLocalizedName() + ")";
} }
else else
{ {
@ -53,15 +52,15 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem
public void addInformation(ItemStack stack, EntityPlayer entityPlayer, List<String> tooltip, boolean advanced) 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.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()) if (stack.hasTagCompound())
{ {
NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK); NBTTagCompound tag = stack.getTagCompound();
FluidStack fluidStack = FluidStack.loadFluidStackFromNBT(tag); 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.type", fluidStack.getLocalizedName()));
tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount") + ": " + tag.getInteger("Amount") + "/" + getCapacity(stack) + "mB"); tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.fluid.amount", fluidStack.amount, getCapacity(stack)));
} }
} }
} }
@ -77,13 +76,7 @@ public class ItemBlockBloodTank extends ItemBlock implements IFluidContainerItem
@Override @Override
public FluidStack getFluid(ItemStack stack) public FluidStack getFluid(ItemStack stack)
{ {
if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK) && !stack.getTagCompound().getCompoundTag(Constants.NBT.TANK).getString("FluidName").equals("")) return FluidStack.loadFluidStackFromNBT(stack.getTagCompound());
{
NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK);
return FluidStack.loadFluidStackFromNBT(tag);
}
return null;
} }
@Override @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.itemFilter.exact=Filters the fluid input/output
tooltip.BloodMagic.fluid.type=Fluid Contained tooltip.BloodMagic.fluid.type=Fluid Contained: %s
tooltip.BloodMagic.fluid.amount=Amount tooltip.BloodMagic.fluid.amount=Amount: %d / %d mB
tooltip.BloodMagic.fluid.capacity=Capacity tooltip.BloodMagic.fluid.capacity=Capacity: %d mB
tooltip.BloodMagic.ghost.everything=Everything tooltip.BloodMagic.ghost.everything=Everything
tooltip.BloodMagic.ghost.amount=Ghost item amount: %d tooltip.BloodMagic.ghost.amount=Ghost item amount: %d