package net.smart.render.statistics;
import net.minecraft.entity.player.*;
import net.minecraft.util.*;
public class SmartStatistics extends SmartStatisticsContext
{
private final EntityPlayer sp;
private float tickDistance;
public int ticksRiding;
public float prevHorizontalAngle = Float.NaN;
private final static SmartStatisticsDatas dummy = new SmartStatisticsDatas();
private final SmartStatisticsDatas[] datas = new SmartStatisticsDatas[10];
private int currentDataIndex = -1;
public SmartStatistics(EntityPlayer sp)
{
this.sp = sp;
}
public void calculateAllStats()
{
double diffX = sp.posX - sp.prevPosX;
double diffY = sp.posY - sp.prevPosY;
double diffZ = sp.posZ - sp.prevPosZ;
SmartStatisticsDatas previous = get();
currentDataIndex++;
if(currentDataIndex >= datas.length)
currentDataIndex = 0;
SmartStatisticsDatas data = datas[currentDataIndex];
if(data == null)
data = datas[currentDataIndex] = new SmartStatisticsDatas();
data.initialize(previous);
data.horizontal.calcualte(MathHelper.sqrt_double(diffX * diffX + diffZ * diffZ));
data.vertical.calcualte((float)Math.abs(diffY));
tickDistance = data.all.calcualte(MathHelper.sqrt_double(diffX * diffX + diffY * diffY + diffZ * diffZ));
if(calculateHorizontalStats)
data.horizontal.apply(sp);
}
public void calculateRiddenStats()
{
ticksRiding++;
}
public float getHorizontalPrevLegYaw() { return sp.prevLimbSwingAmount; }
public float getHorizontalLegYaw() { return sp.limbSwingAmount; }
public float getHorizontalTotal() { return sp.limbSwing; }
public float getVerticalPrevLegYaw() { return datas[currentDataIndex].vertical.prevLegYaw; }
public float getVerticalLegYaw() { return datas[currentDataIndex].vertical.legYaw; }
public float getVerticalTotal() { return datas[currentDataIndex].vertical.total; }
public float getAllPrevLegYaw() { return datas[currentDataIndex].all.prevLegYaw; }
public float getAllLegYaw() { return datas[currentDataIndex].all.legYaw; }
public float getAllTotal() { return datas[currentDataIndex].all.total; }
public float getTickDistance() { return tickDistance; }
public float getTotalHorizontalDistance(float renderPartialTicks)
{
return get(renderPartialTicks).getTotalHorizontalDistance();
}
public float getTotalVerticalDistance(float renderPartialTicks)
{
return get(renderPartialTicks).getTotalVerticalDistance();
}
public float getTotalDistance(float renderPartialTicks)
{
return get(renderPartialTicks).getTotalDistance();
}
public float getCurrentHorizontalSpeed(float renderPartialTicks)
{
return get(renderPartialTicks).getCurrentHorizontalSpeed();
}
public float getCurrentVerticalSpeed(float renderPartialTicks)
{
return get(renderPartialTicks).getCurrentVerticalSpeed();
}
public float getCurrentSpeed(float renderPartialTicks)
{
return get(renderPartialTicks).getCurrentSpeed();
}
private SmartStatisticsDatas get()
{
return currentDataIndex == -1 ? dummy : datas[currentDataIndex];
}
private SmartStatisticsDatas get(float renderPartialTicks)
{
SmartStatisticsDatas data = get();;
data.setReady(renderPartialTicks);
return data;
}
public float getCurrentHorizontalSpeedFlattened(float renderPartialTicks, int strength)
{
strength = Math.min(strength, datas.length);
if(strength<0)
strength = datas.length;
get(renderPartialTicks);
float sum = 0;
int count = 0;
for(int i=0, dataIndex=currentDataIndex; i<strength; i++, dataIndex--)
{
if(dataIndex<0)
dataIndex = datas.length - 1;
SmartStatisticsDatas data = datas[dataIndex];
if(data == null || !data.isReady())
break;
sum += data.getCurrentHorizontalSpeed();
count++;
}
return sum / count;
}
public float getCurrentVerticalSpeedFlattened(float renderPartialTicks, int strength)
{
strength = Math.min(strength, datas.length);
if(strength<0)
strength = datas.length;
get(renderPartialTicks);
float sum = 0;
int count = 0;
for(int i=0, dataIndex=currentDataIndex; i<strength; i++, dataIndex--)
{
if(dataIndex<0)
dataIndex = datas.length - 1;
SmartStatisticsDatas data = datas[dataIndex];
if(data == null || !data.isReady())
break;
sum += data.getCurrentVerticalSpeed();
count++;
}
return sum / count;
}
public float getCurrentSpeedFlattened(float renderPartialTicks, int strength)
{
strength = Math.min(strength, datas.length);
if(strength<0)
strength = datas.length;
get(renderPartialTicks);
float sum = 0;
int count = 0;
for(int i=0, dataIndex=currentDataIndex; i<strength; i++, dataIndex--)
{
if(dataIndex<0)
dataIndex = datas.length - 1;
SmartStatisticsDatas data = datas[dataIndex];
if(data == null || !data.isReady())
break;
sum += data.getCurrentSpeed();
count++;
}
return sum / count;
}
}