/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*
* File Created @ [Apr 20, 2014, 3:30:06 PM (GMT)]
*/
package vazkii.botania.common.item.equipment.bauble;
import java.util.List;
import java.util.UUID;
import javax.annotation.Nonnull;
import baubles.api.BaubleType;
import baubles.api.BaublesApi;
import baubles.api.IBauble;
import baubles.api.cap.IBaublesItemHandler;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.SoundCategory;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemHandlerHelper;
import thaumcraft.api.items.IRunicArmor;
import vazkii.botania.api.item.ICosmeticAttachable;
import vazkii.botania.api.item.IPhantomInkable;
import vazkii.botania.api.sound.BotaniaSoundEvents;
import vazkii.botania.common.achievement.ModAchievements;
import vazkii.botania.common.core.helper.ItemNBTHelper;
import vazkii.botania.common.entity.EntityDoppleganger;
import vazkii.botania.common.item.ItemMod;
@Optional.Interface(modid = "Thaumcraft", iface = "thaumcraft.api.items.IRunicArmor")
public abstract class ItemBauble extends ItemMod implements IBauble, ICosmeticAttachable, IPhantomInkable, IRunicArmor {
private static final String TAG_HASHCODE = "playerHashcode";
private static final String TAG_BAUBLE_UUID_MOST = "baubleUUIDMost";
private static final String TAG_BAUBLE_UUID_LEAST = "baubleUUIDLeast";
private static final String TAG_COSMETIC_ITEM = "cosmeticItem";
private static final String TAG_PHANTOM_INK = "phantomInk";
public ItemBauble(String name) {
super(name);
setMaxStackSize(1);
}
@Nonnull
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, @Nonnull EnumHand hand) {
ItemStack stack = player.getHeldItem(hand);
if(!EntityDoppleganger.isTruePlayer(player))
return ActionResult.newResult(EnumActionResult.FAIL, stack);
ItemStack toEquip = stack.copy();
toEquip.setCount(1);
if(canEquip(toEquip, player)) {
if(world.isRemote)
return ActionResult.newResult(EnumActionResult.SUCCESS, stack);
IBaublesItemHandler baubles = BaublesApi.getBaublesHandler(player);
for(int i = 0; i < baubles.getSlots(); i++) {
if(baubles.isItemValidForSlot(i, toEquip, player)) {
ItemStack stackInSlot = baubles.getStackInSlot(i);
if(stackInSlot.isEmpty() || ((IBauble) stackInSlot.getItem()).canUnequip(stackInSlot, player)) {
baubles.setStackInSlot(i, toEquip);
stack.shrink(1);
if(!stackInSlot.isEmpty()) {
((IBauble) stackInSlot.getItem()).onUnequipped(stackInSlot, player);
if(stack.isEmpty()) {
return ActionResult.newResult(EnumActionResult.SUCCESS, stackInSlot);
} else {
ItemHandlerHelper.giveItemToPlayer(player, stackInSlot);
}
}
return ActionResult.newResult(EnumActionResult.SUCCESS, stack);
}
}
}
}
return ActionResult.newResult(EnumActionResult.PASS, stack);
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack par1ItemStack, EntityPlayer player, List<String> stacks, boolean par4) {
if(GuiScreen.isShiftKeyDown())
addHiddenTooltip(par1ItemStack, player, stacks, par4);
else addStringToTooltip(I18n.format("botaniamisc.shiftinfo"), stacks);
}
@SideOnly(Side.CLIENT)
public void addHiddenTooltip(ItemStack par1ItemStack, EntityPlayer player, List<String> stacks, boolean par4) {
String key = vazkii.botania.client.core.helper.RenderHelper.getKeyDisplayString("Baubles Inventory");
if(key != null)
addStringToTooltip(I18n.format("botania.baubletooltip", key), stacks);
ItemStack cosmetic = getCosmeticItem(par1ItemStack);
if(!cosmetic.isEmpty())
addStringToTooltip(I18n.format("botaniamisc.hasCosmetic", cosmetic.getDisplayName()), stacks);
if(hasPhantomInk(par1ItemStack))
addStringToTooltip(I18n.format("botaniamisc.hasPhantomInk"), stacks);
}
void addStringToTooltip(String s, List<String> tooltip) {
tooltip.add(s.replaceAll("&", "\u00a7"));
}
@Override
public boolean canEquip(ItemStack stack, EntityLivingBase player) {
return true;
}
@Override
public boolean canUnequip(ItemStack stack, EntityLivingBase player) {
return true;
}
@Override
public void onWornTick(ItemStack stack, EntityLivingBase player) {
if(getLastPlayerHashcode(stack) != player.hashCode()) {
onEquippedOrLoadedIntoWorld(stack, player);
setLastPlayerHashcode(stack, player.hashCode());
}
}
@Override
public void onEquipped(ItemStack stack, EntityLivingBase player) {
if(player != null) {
if(!player.world.isRemote)
player.world.playSound(null, player.posX, player.posY, player.posZ, BotaniaSoundEvents.equipBauble, SoundCategory.PLAYERS, 0.1F, 1.3F);
if(player instanceof EntityPlayer)
((EntityPlayer) player).addStat(ModAchievements.baubleWear, 1);
onEquippedOrLoadedIntoWorld(stack, player);
setLastPlayerHashcode(stack, player.hashCode());
}
}
public void onEquippedOrLoadedIntoWorld(ItemStack stack, EntityLivingBase player) {}
@Override
public void onUnequipped(ItemStack stack, EntityLivingBase player) { }
@Override
public ItemStack getCosmeticItem(ItemStack stack) {
NBTTagCompound cmp = ItemNBTHelper.getCompound(stack, TAG_COSMETIC_ITEM, true);
if(cmp == null)
return ItemStack.EMPTY;
return new ItemStack(cmp);
}
@Override
public void setCosmeticItem(ItemStack stack, ItemStack cosmetic) {
NBTTagCompound cmp = new NBTTagCompound();
if(!cosmetic.isEmpty())
cmp = cosmetic.writeToNBT(cmp);
ItemNBTHelper.setCompound(stack, TAG_COSMETIC_ITEM, cmp);
}
@Override
public boolean hasContainerItem(ItemStack stack) {
return !getContainerItem(stack).isEmpty();
}
@Nonnull
@Override
public ItemStack getContainerItem(@Nonnull ItemStack itemStack) {
return getCosmeticItem(itemStack);
}
public static UUID getBaubleUUID(ItemStack stack) {
long most = ItemNBTHelper.getLong(stack, TAG_BAUBLE_UUID_MOST, 0);
if(most == 0) {
UUID uuid = UUID.randomUUID();
ItemNBTHelper.setLong(stack, TAG_BAUBLE_UUID_MOST, uuid.getMostSignificantBits());
ItemNBTHelper.setLong(stack, TAG_BAUBLE_UUID_LEAST, uuid.getLeastSignificantBits());
return getBaubleUUID(stack);
}
long least = ItemNBTHelper.getLong(stack, TAG_BAUBLE_UUID_LEAST, 0);
return new UUID(most, least);
}
public static int getLastPlayerHashcode(ItemStack stack) {
return ItemNBTHelper.getInt(stack, TAG_HASHCODE, 0);
}
public static void setLastPlayerHashcode(ItemStack stack, int hash) {
ItemNBTHelper.setInt(stack, TAG_HASHCODE, hash);
}
@Override
public boolean hasPhantomInk(ItemStack stack) {
return ItemNBTHelper.getBoolean(stack, TAG_PHANTOM_INK, false);
}
@Override
public void setPhantomInk(ItemStack stack, boolean ink) {
ItemNBTHelper.setBoolean(stack, TAG_PHANTOM_INK, ink);
}
@Override
@Optional.Method(modid = "Thaumcraft")
public int getRunicCharge(ItemStack itemstack) {
return 0;
}
}