/******************************************************************************* * AbyssalCraft * Copyright (c) 2012 - 2017 Shinoow. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0.txt * * Contributors: * Shinoow - implementation ******************************************************************************/ package com.shinoow.abyssalcraft.common.items; import java.util.List; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ActionResult; import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.translation.I18n; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.shinoow.abyssalcraft.AbyssalCraft; import com.shinoow.abyssalcraft.api.energy.IEnergyTransporterItem; import com.shinoow.abyssalcraft.api.item.ACItems; import com.shinoow.abyssalcraft.common.blocks.BlockRitualAltar; import com.shinoow.abyssalcraft.common.network.PacketDispatcher; import com.shinoow.abyssalcraft.common.network.client.NecroDataCapMessage; import com.shinoow.abyssalcraft.lib.ACAchievements; import com.shinoow.abyssalcraft.lib.ACLib; import com.shinoow.abyssalcraft.lib.ACSounds; import com.shinoow.abyssalcraft.lib.util.RitualUtil; import com.shinoow.abyssalcraft.lib.util.SpecialTextUtil; import com.shinoow.abyssalcraft.lib.util.blocks.IRitualAltar; public class ItemNecronomicon extends ItemACBasic implements IEnergyTransporterItem { private int bookType; public ItemNecronomicon(String par1, int type){ super(par1); setMaxStackSize(1); bookType = type; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override @SideOnly(Side.CLIENT) public void getSubItems(Item par1Item, CreativeTabs par2CreativeTab, NonNullList<ItemStack> par3List){ par3List.add(new ItemStack(par1Item)); ItemStack stack = new ItemStack(par1Item); addEnergy(stack, getMaxEnergy(stack)); par3List.add(stack); } @Override public ActionResult<ItemStack> onItemRightClick(World par2World, EntityPlayer par3EntityPlayer, EnumHand hand) { ItemStack par1ItemStack = par3EntityPlayer.getHeldItem(hand); if(!par1ItemStack.hasTagCompound()) par1ItemStack.setTagCompound(new NBTTagCompound()); if(!par1ItemStack.getTagCompound().hasKey("owner")){ par1ItemStack.getTagCompound().setString("owner", par3EntityPlayer.getName()); if(!par3EntityPlayer.isSneaking()){ if(!par2World.isRemote) PacketDispatcher.sendTo(new NecroDataCapMessage(par3EntityPlayer), (EntityPlayerMP)par3EntityPlayer); par3EntityPlayer.openGui(AbyssalCraft.instance, ACLib.necronmiconGuiID, par2World, 0, 0, 0); return new ActionResult(EnumActionResult.SUCCESS, par1ItemStack); } } if(par1ItemStack.getTagCompound().getString("owner").equals(par3EntityPlayer.getName())){ if(!par3EntityPlayer.isSneaking()){ if(!par2World.isRemote) PacketDispatcher.sendTo(new NecroDataCapMessage(par3EntityPlayer), (EntityPlayerMP)par3EntityPlayer); par3EntityPlayer.openGui(AbyssalCraft.instance, ACLib.necronmiconGuiID, par2World, 0, 0, 0); return new ActionResult(EnumActionResult.SUCCESS, par1ItemStack); } } else if(par2World.isRemote) SpecialTextUtil.JzaharText(I18n.translateToLocal("message.necronomicon.nope")); return new ActionResult(EnumActionResult.PASS, par1ItemStack); } @Override public EnumActionResult onItemUse(EntityPlayer player, World w, BlockPos pos, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ){ ItemStack is = player.getHeldItem(hand); if(player.isSneaking()) if(!(w.getBlockState(pos).getBlock() instanceof BlockRitualAltar)){ if(isOwner(player, is)) if(RitualUtil.tryAltar(w, pos, bookType)){ w.playSound(player, pos, ACSounds.remnant_scream, player.getSoundCategory(), 3F, 1F); player.addStat(ACAchievements.ritual_altar, 1); return EnumActionResult.SUCCESS; } } else if(w.getTileEntity(pos) instanceof IRitualAltar) if(isOwner(player, is)){ IRitualAltar altar = (IRitualAltar) w.getTileEntity(pos); altar.performRitual(w, pos, player); return EnumActionResult.SUCCESS; } return EnumActionResult.PASS; } public boolean isOwner(EntityPlayer player, ItemStack stack){ if(!stack.hasTagCompound()) return false; return stack.getTagCompound().getString("owner").equals(player.getName()); } @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public void addInformation(ItemStack is, EntityPlayer player, List l, boolean B){ if(is.hasTagCompound() && is.getTagCompound().hasKey("owner")) l.add("Owner: " + is.getTagCompound().getString("owner")); l.add(String.format("%d/%d PE", (int)getContainedEnergy(is), getMaxEnergy(is))); } @Override public boolean getShareTag() { return true; } public int getBookType(){ return bookType; } @Override public float getContainedEnergy(ItemStack stack) { float energy; if(!stack.hasTagCompound()) stack.setTagCompound(new NBTTagCompound()); if(stack.getTagCompound().hasKey("PotEnergy")) energy = stack.getTagCompound().getFloat("PotEnergy"); else { energy = 0; stack.getTagCompound().setFloat("PotEnergy", energy); } return energy; } @Override public int getMaxEnergy(ItemStack stack) { if(this == ACItems.necronomicon) return 5000; if(this == ACItems.abyssal_wasteland_necronomicon) return 10000; if(this == ACItems.dreadlands_necronomicon) return 20000; if(this == ACItems.omothol_necronomicon) return 40000; if(this == ACItems.abyssalnomicon) return 100000; return 0; } @Override public void addEnergy(ItemStack stack, float energy) { float contained = getContainedEnergy(stack); if(contained + energy >= getMaxEnergy(stack)) stack.getTagCompound().setFloat("PotEnergy", getMaxEnergy(stack)); else stack.getTagCompound().setFloat("PotEnergy", contained += energy); } @Override public float consumeEnergy(ItemStack stack, float energy) { float contained = getContainedEnergy(stack); if(energy < contained){ stack.getTagCompound().setFloat("PotEnergy", contained -= energy); return energy; } else { stack.getTagCompound().setFloat("PotEnergy", 0); return contained; } } @Override public boolean canAcceptPE(ItemStack stack) { return getContainedEnergy(stack) < getMaxEnergy(stack); } @Override public boolean canTransferPE(ItemStack stack) { return getContainedEnergy(stack) > 0; } @Override public boolean canAcceptPEExternally(ItemStack stack) { return getContainedEnergy(stack) < getMaxEnergy(stack); } @Override public boolean canTransferPEExternally(ItemStack stack) { return getContainedEnergy(stack) > 0; } }