package net.minecraft.server;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
public class WorldBorder {
private final List<IWorldBorderListener> a = Lists.newArrayList();
private double b;
private double c;
private double d = 6.0E7D;
private double e;
private long f;
private long g;
private int h;
private double i;
private double j;
private int k;
private int l;
public WorldServer world; // CraftBukkit
public WorldBorder() {
this.e = this.d;
this.h = 29999984;
this.i = 0.2D;
this.j = 5.0D;
this.k = 15;
this.l = 5;
}
public boolean isInBounds(BlockPosition blockposition) { return a(blockposition); }public boolean a(BlockPosition blockposition) { // Paper - OBFHELPER
return (double) (blockposition.getX() + 1) > this.b() && (double) blockposition.getX() < this.d() && (double) (blockposition.getZ() + 1) > this.c() && (double) blockposition.getZ() < this.e();
}
// Paper start
private final BlockPosition.MutableBlockPosition mutPos = new BlockPosition.MutableBlockPosition();
public boolean isBlockInBounds(int chunkX, int chunkZ) {
mutPos.setValues(chunkX, 64, chunkZ);
return isInBounds(mutPos);
}
public boolean isChunkInBounds(int chunkX, int chunkZ) {
mutPos.setValues(((chunkX << 4) + 15), 64, (chunkZ << 4) + 15);
return isInBounds(mutPos);
}
// Paper end
public boolean isInBounds(ChunkCoordIntPair chunkcoordintpair) {
return (double) chunkcoordintpair.e() > this.b() && (double) chunkcoordintpair.c() < this.d() && (double) chunkcoordintpair.f() > this.c() && (double) chunkcoordintpair.d() < this.e();
}
public boolean a(AxisAlignedBB axisalignedbb) {
return axisalignedbb.d > this.b() && axisalignedbb.a < this.d() && axisalignedbb.f > this.c() && axisalignedbb.c < this.e();
}
public double a(Entity entity) {
return this.b(entity.locX, entity.locZ);
}
public double b(double d0, double d1) {
double d2 = d1 - this.c();
double d3 = this.e() - d1;
double d4 = d0 - this.b();
double d5 = this.d() - d0;
double d6 = Math.min(d4, d5);
d6 = Math.min(d6, d2);
return Math.min(d6, d3);
}
public EnumWorldBorderState getState() {
return this.e < this.d ? EnumWorldBorderState.SHRINKING : (this.e > this.d ? EnumWorldBorderState.GROWING : EnumWorldBorderState.STATIONARY);
}
public double b() {
double d0 = this.getCenterX() - this.getSize() / 2.0D;
if (d0 < (double) (-this.h)) {
d0 = (double) (-this.h);
}
return d0;
}
public double c() {
double d0 = this.getCenterZ() - this.getSize() / 2.0D;
if (d0 < (double) (-this.h)) {
d0 = (double) (-this.h);
}
return d0;
}
public double d() {
double d0 = this.getCenterX() + this.getSize() / 2.0D;
if (d0 > (double) this.h) {
d0 = (double) this.h;
}
return d0;
}
public double e() {
double d0 = this.getCenterZ() + this.getSize() / 2.0D;
if (d0 > (double) this.h) {
d0 = (double) this.h;
}
return d0;
}
public double getCenterX() {
return this.b;
}
public double getCenterZ() {
return this.c;
}
public void setCenter(double d0, double d1) {
this.b = d0;
this.c = d1;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.a(this, d0, d1);
}
}
public double getSize() {
if (this.getState() != EnumWorldBorderState.STATIONARY) {
double d0 = (double) ((float) (System.currentTimeMillis() - this.g) / (float) (this.f - this.g));
if (d0 < 1.0D) {
return this.d + (this.e - this.d) * d0;
}
this.setSize(this.e);
}
return this.d;
}
public long i() {
return this.getState() == EnumWorldBorderState.STATIONARY ? 0L : this.f - System.currentTimeMillis();
}
public double j() {
return this.e;
}
public void setSize(double d0) {
this.d = d0;
this.e = d0;
this.f = System.currentTimeMillis();
this.g = this.f;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.a(this, d0);
}
}
public void transitionSizeBetween(double d0, double d1, long i) {
this.d = d0;
this.e = d1;
this.g = System.currentTimeMillis();
this.f = this.g + i;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.a(this, d0, d1, i);
}
}
protected List<IWorldBorderListener> k() {
return Lists.newArrayList(this.a);
}
public void a(IWorldBorderListener iworldborderlistener) {
if (a.contains(iworldborderlistener)) return; // CraftBukkit
this.a.add(iworldborderlistener);
}
public void a(int i) {
this.h = i;
}
public int l() {
return this.h;
}
public double getDamageBuffer() {
return this.j;
}
public void setDamageBuffer(double d0) {
this.j = d0;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.c(this, d0);
}
}
public double getDamageAmount() {
return this.i;
}
public void setDamageAmount(double d0) {
this.i = d0;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.b(this, d0);
}
}
public int getWarningTime() {
return this.k;
}
public void setWarningTime(int i) {
this.k = i;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.a(this, i);
}
}
public int getWarningDistance() {
return this.l;
}
public void setWarningDistance(int i) {
this.l = i;
Iterator iterator = this.k().iterator();
while (iterator.hasNext()) {
IWorldBorderListener iworldborderlistener = (IWorldBorderListener) iterator.next();
iworldborderlistener.b(this, i);
}
}
}