package net.minecraft.world.border;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import net.minecraft.entity.Entity;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.world.ChunkCoordIntPair;
public class WorldBorder
{
private final List listeners = Lists.newArrayList();
private double centerX = 0.0D;
private double centerZ = 0.0D;
private double startDiameter = 6.0E7D;
private double endDiameter;
private long endTime;
private long startTime;
private int worldSize;
private double damageAmount;
private double damageBuffer;
private int warningTime;
private int warningDistance;
private static final String __OBFID = "CL_00002012";
public WorldBorder()
{
this.endDiameter = this.startDiameter;
this.worldSize = 29999984;
this.damageAmount = 0.2D;
this.damageBuffer = 5.0D;
this.warningTime = 15;
this.warningDistance = 5;
}
public boolean contains(BlockPos pos)
{
return (double)(pos.getX() + 1) > this.minX() && (double)pos.getX() < this.maxX() && (double)(pos.getZ() + 1) > this.minZ() && (double)pos.getZ() < this.maxZ();
}
public boolean contains(ChunkCoordIntPair range)
{
return (double)range.getXEnd() > this.minX() && (double)range.getXStart() < this.maxX() && (double)range.getZEnd() > this.minZ() && (double)range.getZStart() < this.maxZ();
}
public boolean contains(AxisAlignedBB bb)
{
return bb.maxX > this.minX() && bb.minX < this.maxX() && bb.maxZ > this.minZ() && bb.minZ < this.maxZ();
}
public double getClosestDistance(Entity p_177745_1_)
{
return this.getClosestDistance(p_177745_1_.posX, p_177745_1_.posZ);
}
public double getClosestDistance(double x, double z)
{
double var5 = z - this.minZ();
double var7 = this.maxZ() - z;
double var9 = x - this.minX();
double var11 = this.maxX() - x;
double var13 = Math.min(var9, var11);
var13 = Math.min(var13, var5);
return Math.min(var13, var7);
}
public EnumBorderStatus getStatus()
{
return this.endDiameter < this.startDiameter ? EnumBorderStatus.SHRINKING : (this.endDiameter > this.startDiameter ? EnumBorderStatus.GROWING : EnumBorderStatus.STATIONARY);
}
public double minX()
{
double var1 = this.getCenterX() - this.getDiameter() / 2.0D;
if (var1 < (double)(-this.worldSize))
{
var1 = (double)(-this.worldSize);
}
return var1;
}
public double minZ()
{
double var1 = this.getCenterZ() - this.getDiameter() / 2.0D;
if (var1 < (double)(-this.worldSize))
{
var1 = (double)(-this.worldSize);
}
return var1;
}
public double maxX()
{
double var1 = this.getCenterX() + this.getDiameter() / 2.0D;
if (var1 > (double)this.worldSize)
{
var1 = (double)this.worldSize;
}
return var1;
}
public double maxZ()
{
double var1 = this.getCenterZ() + this.getDiameter() / 2.0D;
if (var1 > (double)this.worldSize)
{
var1 = (double)this.worldSize;
}
return var1;
}
public double getCenterX()
{
return this.centerX;
}
public double getCenterZ()
{
return this.centerZ;
}
public void setCenter(double x, double z)
{
this.centerX = x;
this.centerZ = z;
Iterator var5 = this.getListeners().iterator();
while (var5.hasNext())
{
IBorderListener var6 = (IBorderListener)var5.next();
var6.onCenterChanged(this, x, z);
}
}
public double getDiameter()
{
if (this.getStatus() != EnumBorderStatus.STATIONARY)
{
double var1 = (double)((float)(System.currentTimeMillis() - this.startTime) / (float)(this.endTime - this.startTime));
if (var1 < 1.0D)
{
return this.startDiameter + (this.endDiameter - this.startDiameter) * var1;
}
this.setTransition(this.endDiameter);
}
return this.startDiameter;
}
public long getTimeUntilTarget()
{
return this.getStatus() != EnumBorderStatus.STATIONARY ? this.endTime - System.currentTimeMillis() : 0L;
}
public double getTargetSize()
{
return this.endDiameter;
}
public void setTransition(double newSize)
{
this.startDiameter = newSize;
this.endDiameter = newSize;
this.endTime = System.currentTimeMillis();
this.startTime = this.endTime;
Iterator var3 = this.getListeners().iterator();
while (var3.hasNext())
{
IBorderListener var4 = (IBorderListener)var3.next();
var4.onSizeChanged(this, newSize);
}
}
public void setTransition(double p_177738_1_, double p_177738_3_, long p_177738_5_)
{
this.startDiameter = p_177738_1_;
this.endDiameter = p_177738_3_;
this.startTime = System.currentTimeMillis();
this.endTime = this.startTime + p_177738_5_;
Iterator var7 = this.getListeners().iterator();
while (var7.hasNext())
{
IBorderListener var8 = (IBorderListener)var7.next();
var8.func_177692_a(this, p_177738_1_, p_177738_3_, p_177738_5_);
}
}
protected List getListeners()
{
return Lists.newArrayList(this.listeners);
}
public void addListener(IBorderListener listener)
{
this.listeners.add(listener);
}
public void setSize(int size)
{
this.worldSize = size;
}
public int getSize()
{
return this.worldSize;
}
public double getDamageBuffer()
{
return this.damageBuffer;
}
public void setDamageBuffer(double p_177724_1_)
{
this.damageBuffer = p_177724_1_;
Iterator var3 = this.getListeners().iterator();
while (var3.hasNext())
{
IBorderListener var4 = (IBorderListener)var3.next();
var4.func_177695_c(this, p_177724_1_);
}
}
public double func_177727_n()
{
return this.damageAmount;
}
public void func_177744_c(double p_177744_1_)
{
this.damageAmount = p_177744_1_;
Iterator var3 = this.getListeners().iterator();
while (var3.hasNext())
{
IBorderListener var4 = (IBorderListener)var3.next();
var4.func_177696_b(this, p_177744_1_);
}
}
public int getWarningTime()
{
return this.warningTime;
}
public void setWarningTime(int warningTime)
{
this.warningTime = warningTime;
Iterator var2 = this.getListeners().iterator();
while (var2.hasNext())
{
IBorderListener var3 = (IBorderListener)var2.next();
var3.onWarningTimeChanged(this, warningTime);
}
}
public int getWarningDistance()
{
return this.warningDistance;
}
public void setWarningDistance(int warningDistance)
{
this.warningDistance = warningDistance;
Iterator var2 = this.getListeners().iterator();
while (var2.hasNext())
{
IBorderListener var3 = (IBorderListener)var2.next();
var3.onWarningDistanceChanged(this, warningDistance);
}
}
}