/**
* 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, 10:58:00 PM (GMT)]
*/
package vazkii.botania.common.item.equipment.bauble;
import java.util.List;
import com.google.common.base.Predicates;
import baubles.api.BaubleType;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import vazkii.botania.api.internal.IManaBurst;
import vazkii.botania.api.item.IBaubleRender;
import vazkii.botania.api.mana.ITinyPlanetExcempt;
import vazkii.botania.common.block.ModBlocks;
import vazkii.botania.common.core.helper.Vector3;
import vazkii.botania.common.lib.LibItemNames;
public class ItemTinyPlanet extends ItemBauble implements IBaubleRender {
public static final String TAG_ORBIT = "orbit";
public ItemTinyPlanet() {
super(LibItemNames.TINY_PLANET);
}
@Override
public BaubleType getBaubleType(ItemStack itemstack) {
return BaubleType.CHARM;
}
@Override
public void onWornTick(ItemStack stack, EntityLivingBase player) {
super.onWornTick(stack, player);
double x = player.posX;
double y = player.posY + 1.2F;
double z = player.posZ;
if(player.world.isRemote)
y -= 1.62F;
applyEffect(player.world, x, y, z);
}
public static void applyEffect(World world, double x, double y, double z) {
int range = 8;
List<Entity> entities = world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(x - range, y - range, z - range, x + range, y + range, z + range), Predicates.instanceOf(IManaBurst.class));
for(Entity entity : entities) {
IManaBurst burst = (IManaBurst) entity;
ItemStack lens = burst.getSourceLens();
if(lens != null && lens.getItem() instanceof ITinyPlanetExcempt && !((ITinyPlanetExcempt) lens.getItem()).shouldPull(lens))
continue;
int orbitTime = getEntityOrbitTime(entity);
if(orbitTime == 0)
burst.setMinManaLoss(burst.getMinManaLoss() * 3);
float radius = Math.min(7.5F, (Math.max(40, orbitTime) - 40) / 40F + 1.5F);
int angle = orbitTime % 360;
float xTarget = (float) (x + Math.cos(angle * 10 * Math.PI / 180F) * radius);
float yTarget = (float) y;
float zTarget = (float) (z + Math.sin(angle * 10 * Math.PI / 180F) * radius);
Vector3 targetVec = new Vector3(xTarget, yTarget, zTarget);
Vector3 currentVec = new Vector3(entity.posX, entity.posY, entity.posZ);
Vector3 moveVector = targetVec.subtract(currentVec);
burst.setMotion(moveVector.x, moveVector.y, moveVector.z);
incrementOrbitTime(entity);
}
}
public static int getEntityOrbitTime(Entity entity) {
NBTTagCompound cmp = entity.getEntityData();
if(cmp.hasKey(TAG_ORBIT))
return cmp.getInteger(TAG_ORBIT);
else return 0;
}
public static void incrementOrbitTime(Entity entity) {
NBTTagCompound cmp = entity.getEntityData();
int time = getEntityOrbitTime(entity);
cmp.setInteger(TAG_ORBIT, time + 1);
}
@Override
@SideOnly(Side.CLIENT)
public void onPlayerBaubleRender(ItemStack stack, EntityPlayer player, RenderType type, float partialTicks) {
if(type == RenderType.HEAD) {
Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
GlStateManager.scale(0.5F, 0.5F, 0.5F);
GlStateManager.translate(0, -1.5F, 0.5F);
Minecraft.getMinecraft().getBlockRendererDispatcher().renderBlockBrightness(ModBlocks.tinyPlanet.getDefaultState(), 1.0F);
}
}
}