import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class OChunkProviderServer implements OIChunkProvider {
private Set a = new HashSet();
private OChunk b;
private OIChunkProvider c;
private OIChunkLoader d;
private Map e = new HashMap();
private List f = new ArrayList();
private OWorldServer g;
public OChunkProviderServer(OWorldServer paramOWorldServer, OIChunkLoader paramOIChunkLoader, OIChunkProvider paramOIChunkProvider) {
b = new OEmptyChunk(paramOWorldServer, new byte[32768], 0, 0);
g = paramOWorldServer;
d = paramOIChunkLoader;
c = paramOIChunkProvider;
}
public boolean a(int paramInt1, int paramInt2) {
return e.containsKey(Integer.valueOf(OChunkCoordIntPair.a(paramInt1, paramInt2)));
}
public void d(int paramInt1, int paramInt2) {
OChunkCoordinates localOChunkCoordinates = g.m();
int i = paramInt1 * 16 + 8 - localOChunkCoordinates.a;
int j = paramInt2 * 16 + 8 - localOChunkCoordinates.c;
int k = 128;
if ((i < -k) || (i > k) || (j < -k) || (j > k))
a.add(Integer.valueOf(OChunkCoordIntPair.a(paramInt1, paramInt2)));
}
public OChunk c(int paramInt1, int paramInt2) {
int i = OChunkCoordIntPair.a(paramInt1, paramInt2);
a.remove(Integer.valueOf(i));
OChunk localOChunk = (OChunk) e.get(Integer.valueOf(i));
if (localOChunk == null) {
localOChunk = e(paramInt1, paramInt2);
if (localOChunk == null)
if (c == null)
localOChunk = b;
else
localOChunk = c.b(paramInt1, paramInt2);
e.put(Integer.valueOf(i), localOChunk);
f.add(localOChunk);
if (localOChunk != null) {
localOChunk.c();
localOChunk.d();
}
if ((!localOChunk.n) && (a(paramInt1 + 1, paramInt2 + 1)) && (a(paramInt1, paramInt2 + 1)) && (a(paramInt1 + 1, paramInt2)))
a(this, paramInt1, paramInt2);
if ((a(paramInt1 - 1, paramInt2)) && (!b(paramInt1 - 1, paramInt2).n) && (a(paramInt1 - 1, paramInt2 + 1)) && (a(paramInt1, paramInt2 + 1)) && (a(paramInt1 - 1, paramInt2)))
a(this, paramInt1 - 1, paramInt2);
if ((a(paramInt1, paramInt2 - 1)) && (!b(paramInt1, paramInt2 - 1).n) && (a(paramInt1 + 1, paramInt2 - 1)) && (a(paramInt1, paramInt2 - 1)) && (a(paramInt1 + 1, paramInt2)))
a(this, paramInt1, paramInt2 - 1);
if ((a(paramInt1 - 1, paramInt2 - 1)) && (!b(paramInt1 - 1, paramInt2 - 1).n) && (a(paramInt1 - 1, paramInt2 - 1)) && (a(paramInt1, paramInt2 - 1)) && (a(paramInt1 - 1, paramInt2)))
a(this, paramInt1 - 1, paramInt2 - 1);
}
return localOChunk;
}
public OChunk b(int paramInt1, int paramInt2) {
OChunk localOChunk = (OChunk) e.get(Integer.valueOf(OChunkCoordIntPair.a(paramInt1, paramInt2)));
if (localOChunk == null) {
if (g.r)
return c(paramInt1, paramInt2);
return b;
}
return localOChunk;
}
private OChunk e(int paramInt1, int paramInt2) {
if (d == null)
return null;
try {
OChunk localOChunk = d.a(g, paramInt1, paramInt2);
if (localOChunk != null)
localOChunk.r = g.l();
return localOChunk;
} catch (Exception localException) {
localException.printStackTrace();
}
return null;
}
private void a(OChunk paramOChunk) {
if (d == null)
return;
try {
d.b(g, paramOChunk);
} catch (Exception localException) {
localException.printStackTrace();
}
}
private void b(OChunk paramOChunk) {
if (d == null)
return;
paramOChunk.r = g.l();
d.a(g, paramOChunk);
}
public void a(OIChunkProvider paramOIChunkProvider, int paramInt1, int paramInt2) {
OChunk localOChunk = b(paramInt1, paramInt2);
if (!localOChunk.n) {
localOChunk.n = true;
if (c != null) {
c.a(paramOIChunkProvider, paramInt1, paramInt2);
localOChunk.f();
}
}
}
// hMod: load status
boolean loaded = false;
public boolean a(boolean paramBoolean, OIProgressUpdate paramOIProgressUpdate) {
// hMod: load once!
if (!loaded) {
etc.getLoader().loadPlugins();
loaded = true;
}
int i = 0;
for (int j = 0; j < f.size(); j++) {
OChunk localOChunk = (OChunk) f.get(j);
if ((paramBoolean) && (!localOChunk.p))
a(localOChunk);
if (localOChunk.a(paramBoolean)) {
b(localOChunk);
localOChunk.o = false;
i++;
if ((i == 24) && (!paramBoolean))
return false;
}
}
if (paramBoolean) {
if (d == null)
return true;
d.b();
}
return true;
}
public boolean a() {
if (!g.w) {
for (int i = 0; i < 100; i++)
if (!a.isEmpty()) {
Integer localInteger = (Integer) a.iterator().next();
OChunk localOChunk = (OChunk) e.get(localInteger);
localOChunk.e();
b(localOChunk);
a(localOChunk);
a.remove(localInteger);
e.remove(localInteger);
f.remove(localOChunk);
}
if (d != null)
d.a();
}
return c.a();
}
public boolean b() {
return !g.w;
}
}