/**
* This class was created by <PowerCrystals>. 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 @ [? (GMT)]
*/
package vazkii.botania.common.item;
import java.util.List;
import javax.annotation.Nonnull;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import vazkii.botania.api.internal.VanillaPacketDispatcher;
import vazkii.botania.common.Botania;
import vazkii.botania.common.achievement.ModAchievements;
import vazkii.botania.common.lib.LibItemNames;
public class ItemSpawnerMover extends ItemMod {
public static final String TAG_SPAWNER = "spawner";
private static final String TAG_PLACE_DELAY = "placeDelay";
public ItemSpawnerMover() {
super(LibItemNames.SPAWNER_MOVER);
setMaxStackSize(1);
addPropertyOverride(new ResourceLocation("botania", "full"), (stack, worldIn, entityIn) -> hasData(stack) ? 1 : 0);
}
public static NBTTagCompound getSpawnerTag(ItemStack stack) {
NBTTagCompound tag = stack.getTagCompound();
if(tag != null) {
if(tag.hasKey(TAG_SPAWNER))
return tag.getCompoundTag(TAG_SPAWNER);
if(tag.hasKey("EntityId"))
return tag;
}
return null;
}
private static String getEntityId(ItemStack stack) {
NBTTagCompound tag = getSpawnerTag(stack);
if(tag != null)
return tag.getString("EntityId");
return null;
}
public static boolean hasData(ItemStack stack) {
return getEntityId(stack) != null;
}
private static int getDelay(ItemStack stack) {
NBTTagCompound tag = stack.getTagCompound();
if(tag != null)
return tag.getInteger(TAG_PLACE_DELAY);
return 0;
}
@SideOnly(Side.CLIENT)
@Override
public void addInformation(ItemStack stack, EntityPlayer player, List<String> infoList, boolean advancedTooltips) {
String id = getEntityId(stack);
if (id != null)
infoList.add(I18n.format("entity." + id + ".name"));
}
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) {
NBTTagCompound tag = stack.getTagCompound();
if(tag != null && tag.hasKey(TAG_PLACE_DELAY) && tag.getInteger(TAG_PLACE_DELAY) > 0)
tag.setInteger(TAG_PLACE_DELAY, tag.getInteger(TAG_PLACE_DELAY) - 1);
}
@Nonnull
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing side, float xOffset, float yOffset, float zOffset) {
ItemStack itemstack = player.getHeldItem(hand);
if(getEntityId(itemstack) == null) {
if(world.getBlockState(pos).getBlock().equals(Blocks.MOB_SPAWNER)) {
TileEntity te = world.getTileEntity(pos);
NBTTagCompound tag = new NBTTagCompound();
tag.setTag(TAG_SPAWNER, new NBTTagCompound());
te.writeToNBT(tag.getCompoundTag(TAG_SPAWNER));
tag.setInteger(TAG_PLACE_DELAY, 20);
itemstack.setTagCompound(tag);
world.setBlockToAir(pos);
player.renderBrokenItemStack(itemstack);
for(int i = 0; i < 50; i++) {
float red = (float) Math.random();
float green = (float) Math.random();
float blue = (float) Math.random();
Botania.proxy.wispFX(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, red, green, blue, (float) Math.random() * 0.1F + 0.05F, (float) (Math.random() - 0.5F) * 0.15F, (float) (Math.random() - 0.5F) * 0.15F, (float) (Math.random() - 0.5F) * 0.15F);
}
return EnumActionResult.SUCCESS;
} else return EnumActionResult.PASS;
} else {
return getDelay(itemstack) <= 0 && placeBlock(itemstack, player, world, pos, side, xOffset, yOffset, zOffset) ? EnumActionResult.SUCCESS : EnumActionResult.PASS;
}
}
// Adapted from ItemBlock.onItemUse
private boolean placeBlock(ItemStack itemstack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float xOffset, float yOffset, float zOffset) {
IBlockState iblockstate = world.getBlockState(pos);
Block block = iblockstate.getBlock();
if(!block.isReplaceable(world, pos)) {
pos = pos.offset(side);
}
if(itemstack.isEmpty()) {
return false;
} else if(!player.canPlayerEdit(pos, side, itemstack)) {
return false;
} else if(world.mayPlace(Blocks.MOB_SPAWNER, pos, false, side, null)) {
int meta = this.getMetadata(itemstack.getMetadata());
IBlockState iblockstate1 = Blocks.MOB_SPAWNER.getStateForPlacement(world, pos, side, xOffset, yOffset, zOffset, meta, player);
if (placeBlockAt(itemstack, player, world, pos, side, xOffset, yOffset, zOffset, iblockstate1)) {
world.playSound(null, pos, Blocks.MOB_SPAWNER.getSoundType().getPlaceSound(), SoundCategory.BLOCKS, (Blocks.MOB_SPAWNER.getSoundType().getVolume() + 1.0F) / 2.0F, Blocks.MOB_SPAWNER.getSoundType().getPitch() * 0.8F);
player.renderBrokenItemStack(itemstack);
itemstack.shrink(1);
player.addStat(ModAchievements.spawnerMoverUse, 1);
for(int i = 0; i < 100; i++)
Botania.proxy.sparkleFX(pos.getX() + Math.random(), pos.getY() + Math.random(), pos.getZ() + Math.random(), (float) Math.random(), (float) Math.random(), (float) Math.random(), 0.45F + 0.2F * (float) Math.random(), 6);
}
return true;
} else {
return false;
}
}
// Adapted from ItemBlock.placeBlockAt
private boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ, IBlockState state) {
if (!world.setBlockState(pos, state, 3))
return false;
Block block = world.getBlockState(pos).getBlock();
if(block.equals(Blocks.MOB_SPAWNER)) {
TileEntity te = world.getTileEntity(pos);
NBTTagCompound tag = stack.getTagCompound();
if (tag.hasKey(TAG_SPAWNER))
tag = tag.getCompoundTag(TAG_SPAWNER);
tag.setInteger("x", pos.getX());
tag.setInteger("y", pos.getY());
tag.setInteger("z", pos.getZ());
te.readFromNBT(tag);
VanillaPacketDispatcher.dispatchTEToNearbyPlayers(world, pos);
}
return true;
}
}