package minefantasy.mf2.mechanics;
import java.util.List;
import mods.battlegear2.api.weapons.IExtendedReachWeapon;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.Vec3;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
/**
* This class exists because minecraft hunger seems to decrease faster than windows stock
*/
public class ExtendedReachMF
{
//SPRINT JUMPING
//DEFAULT:= 0:22 (50seconds till starve, 35s till nosprint) (16m in MC time for 4 missing bars)
//SLOW=5: = 2:20 (5mins till starve, 3:30 till nosprint) (1h 40m in MC time for 4 missing bars)
//EXHAUSTION SCALE = 3.0F = 1hunger
@SubscribeEvent
public void onPlayerTick(TickEvent.PlayerTickEvent event)
{
if(event.phase == TickEvent.Phase.END)
{
tickEnd(event.player);
}
}
public void tickEnd(EntityPlayer entityPlayer)
{
//If we JUST swung an Item
if (entityPlayer.swingProgressInt == 1)
{
ItemStack mainhand = entityPlayer.getCurrentEquippedItem();
if (mainhand != null && mainhand.getItem() instanceof IExtendedReachWeapon)
{
float extendedReach = ((IExtendedReachWeapon) mainhand.getItem()).getReachModifierInBlocks(mainhand);
if(extendedReach > 0){
MovingObjectPosition mouseOver = getMouseOver(0, extendedReach + 4);
if (mouseOver != null && mouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY)
{
Entity target = mouseOver.entityHit;
if (target instanceof EntityLiving && target != entityPlayer)
{
if (target.hurtResistantTime != ((EntityLiving) target).maxHurtResistantTime)
{
FMLClientHandler.instance().getClient().playerController.attackEntity(entityPlayer, target);
}
}
}
}
}
}
}
public MovingObjectPosition getMouseOver(float tickPart, float maxDist)
{
Minecraft mc = FMLClientHandler.instance().getClient();
if (mc.renderViewEntity != null)
{
if (mc.theWorld != null)
{
mc.pointedEntity = null;
double d0 = maxDist;
MovingObjectPosition objectMouseOver = mc.renderViewEntity.rayTrace(d0, tickPart);
double d1 = d0;
Vec3 vec3 = mc.renderViewEntity.getPosition(tickPart);
if (objectMouseOver != null)
{
d1 = objectMouseOver.hitVec.distanceTo(vec3);
}
Vec3 vec31 = mc.renderViewEntity.getLook(tickPart);
Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
Entity pointedEntity = null;
float f1 = 1.0F;
List list = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.renderViewEntity, mc.renderViewEntity.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand(f1, f1, f1));
double d2 = d1;
for (int i = 0; i < list.size(); ++i)
{
Entity entity = (Entity)list.get(i);
if (entity.canBeCollidedWith())
{
float f2 = entity.getCollisionBorderSize();
AxisAlignedBB axisalignedbb = entity.boundingBox.expand(f2, f2, f2);
MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);
if (axisalignedbb.isVecInside(vec3))
{
if (0.0D < d2 || d2 == 0.0D)
{
pointedEntity = entity;
d2 = 0.0D;
}
}
else if (movingobjectposition != null)
{
double d3 = vec3.distanceTo(movingobjectposition.hitVec);
if (d3 < d2 || d2 == 0.0D)
{
pointedEntity = entity;
d2 = d3;
}
}
}
}
if (pointedEntity != null && (d2 < d1 || objectMouseOver == null))
{
objectMouseOver = new MovingObjectPosition(pointedEntity);
}
return objectMouseOver;
}
}
return null;
}
}