Empty flasks can now be refilled (#976)

Right click a water source (any block that uses Material.WATER, same as vanilla potions) to refill it. This removes all potion effects. The model will display without the fluid inside as a visual indicator.
This commit is contained in:
Nicholas Ignoffo 2016-12-30 18:27:16 -08:00
parent b6eae2fc67
commit 4c614df15e
4 changed files with 75 additions and 16 deletions

View file

@ -1,31 +1,36 @@
package WayofTime.bloodmagic.potion.item;
package WayofTime.bloodmagic.item;
import java.util.ArrayList;
import java.util.List;
import WayofTime.bloodmagic.api.util.helper.NBTHelper;
import WayofTime.bloodmagic.client.IMeshProvider;
import WayofTime.bloodmagic.util.helper.TextHelper;
import com.google.common.collect.Lists;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.ItemMeshDefinition;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;
import net.minecraft.potion.PotionUtils;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import WayofTime.bloodmagic.BloodMagic;
import WayofTime.bloodmagic.api.Constants;
import WayofTime.bloodmagic.client.IVariantProvider;
public class ItemPotionFlask extends Item implements IVariantProvider
import javax.annotation.Nullable;
public class ItemPotionFlask extends Item implements IMeshProvider
{
public ItemPotionFlask()
{
@ -44,6 +49,8 @@ public class ItemPotionFlask extends Item implements IVariantProvider
int remainingUses = stack.getMaxDamage() - stack.getItemDamage();
if (remainingUses <= 0)
{
NBTHelper.checkNBT(stack);
stack.getTagCompound().setBoolean("empty", true);
return stack;
}
@ -75,12 +82,33 @@ public class ItemPotionFlask extends Item implements IVariantProvider
return EnumAction.DRINK;
}
@Override
public EnumActionResult onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
{
int remainingUses = stack.getMaxDamage() - stack.getItemDamage();
if (remainingUses > 0 || !stack.hasTagCompound() || !stack.getTagCompound().hasKey("empty"))
return EnumActionResult.PASS;
RayTraceResult trace = rayTrace(world, player, true);
if (trace.typeOfHit == RayTraceResult.Type.BLOCK && world.getBlockState(trace.getBlockPos()).getMaterial() == Material.WATER)
{
world.playSound(player, player.posX, player.posY, player.posZ, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.NEUTRAL, 1.0F, 1.0F);
player.setHeldItem(hand, new ItemStack(this));
return EnumActionResult.SUCCESS;
}
return super.onItemUse(stack, player, world, pos, hand, facing, hitX, hitY, hitZ);
}
@Override
public ActionResult<ItemStack> onItemRightClick(ItemStack stack, World world, EntityPlayer player, EnumHand hand)
{
int remainingUses = stack.getMaxDamage() - stack.getItemDamage();
if (remainingUses <= 0)
{
NBTHelper.checkNBT(stack);
stack.getTagCompound().setBoolean("empty", true);
return new ActionResult<ItemStack>(EnumActionResult.PASS, stack);
}
player.setActiveHand(hand);
@ -106,11 +134,34 @@ public class ItemPotionFlask extends Item implements IVariantProvider
// }
// }
@SideOnly(Side.CLIENT)
@Override
public List<Pair<Integer, String>> getVariants()
public ItemMeshDefinition getMeshDefinition()
{
List<Pair<Integer, String>> ret = new ArrayList<Pair<Integer, String>>();
ret.add(new ImmutablePair<Integer, String>(0, "type=normal"));
return ret;
return new ItemMeshDefinition()
{
@Override
public ModelResourceLocation getModelLocation(ItemStack stack)
{
boolean full = true;
if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty"))
full = false;
return new ModelResourceLocation(new ResourceLocation(Constants.Mod.MODID, "item/" + getRegistryName().getResourcePath()), "full=" + (full ? "true" : "false"));
}
};
}
@Nullable
@Override
public ResourceLocation getCustomLocation()
{
return null;
}
@Override
public List<String> getVariants()
{
return Lists.newArrayList("full=true", "full=false");
}
}

View file

@ -163,6 +163,9 @@ public class ClientProxy extends CommonProxy
if (tintIndex != 0 && tintIndex != 2)
return -1;
if (stack.hasTagCompound() && stack.getTagCompound().hasKey("empty"))
return -1;
return PotionUtils.getPotionColorFromEffectList(PotionUtils.getEffectsFromStack(stack));
}
}, ModItems.POTION_FLASK);

View file

@ -82,7 +82,7 @@ import WayofTime.bloodmagic.item.soul.ItemSentientShovel;
import WayofTime.bloodmagic.item.soul.ItemSentientSword;
import WayofTime.bloodmagic.item.soul.ItemSoulGem;
import WayofTime.bloodmagic.item.soul.ItemSoulSnare;
import WayofTime.bloodmagic.potion.item.ItemPotionFlask;
import WayofTime.bloodmagic.item.ItemPotionFlask;
import WayofTime.bloodmagic.util.helper.InventoryRenderHelper;
public class ModItems

View file

@ -5,13 +5,18 @@
"transform": "forge:default-item"
},
"variants": {
"type": {
"normal": {
"full": {
"true": {
"textures": {
"layer0": "bloodmagic:items/PotionFlask_underlay",
"layer1": "bloodmagic:items/PotionFlask_outline",
"layer2": "bloodmagic:items/PotionFlask_overlay"
}
},
"false": {
"textures": {
"layer0": "bloodmagic:items/PotionFlask_outline"
}
}
}
}