summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft/server/Village.java
diff options
context:
space:
mode:
authorEvilSeph <evilseph@gmail.com>2012-03-08 21:54:29 -0500
committerEvilSeph <evilseph@gmail.com>2012-03-08 21:54:29 -0500
commitf5ce8627c6a1300bbb9a570adac043247735cb18 (patch)
treea3a039c8afc4dc12ec302347f6469ef90fc51448 /src/main/java/net/minecraft/server/Village.java
parent43a00954f562613c0f5176dfff8ab818b61e02c1 (diff)
downloadcraftbukkit-f5ce8627c6a1300bbb9a570adac043247735cb18.tar
craftbukkit-f5ce8627c6a1300bbb9a570adac043247735cb18.tar.gz
craftbukkit-f5ce8627c6a1300bbb9a570adac043247735cb18.tar.lz
craftbukkit-f5ce8627c6a1300bbb9a570adac043247735cb18.tar.xz
craftbukkit-f5ce8627c6a1300bbb9a570adac043247735cb18.zip
Added Village for diff visibility.
Diffstat (limited to 'src/main/java/net/minecraft/server/Village.java')
-rw-r--r--src/main/java/net/minecraft/server/Village.java299
1 files changed, 299 insertions, 0 deletions
diff --git a/src/main/java/net/minecraft/server/Village.java b/src/main/java/net/minecraft/server/Village.java
new file mode 100644
index 00000000..a0ac3ad8
--- /dev/null
+++ b/src/main/java/net/minecraft/server/Village.java
@@ -0,0 +1,299 @@
+package net.minecraft.server;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+public class Village {
+
+ private final World world;
+ private final List doors = new ArrayList();
+ private final ChunkCoordinates c = new ChunkCoordinates(0, 0, 0);
+ private final ChunkCoordinates center = new ChunkCoordinates(0, 0, 0);
+ private int size = 0;
+ private int f = 0;
+ private int time = 0;
+ private int population = 0;
+ private List i = new ArrayList();
+ private int j = 0;
+
+ public Village(World world) {
+ this.world = world;
+ }
+
+ public void tick(int i) {
+ this.time = i;
+ this.k();
+ this.j();
+ if (i % 20 == 0) {
+ this.i();
+ }
+
+ if (i % 30 == 0) {
+ this.countPopulation();
+ }
+
+ int j = this.population / 16;
+
+ if (this.j < j && this.doors.size() > 20 && this.world.random.nextInt(7000) == 0) {
+ Vec3D vec3d = this.a(MathHelper.d((float) this.center.x), MathHelper.d((float) this.center.y), MathHelper.d((float) this.center.z), 2, 4, 2);
+
+ if (vec3d != null) {
+ EntityIronGolem entityirongolem = new EntityIronGolem(this.world);
+
+ entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c);
+ this.world.addEntity(entityirongolem);
+ ++this.j;
+ }
+ }
+ }
+
+ private Vec3D a(int i, int j, int k, int l, int i1, int j1) {
+ for (int k1 = 0; k1 < 10; ++k1) {
+ int l1 = i + this.world.random.nextInt(16) - 8;
+ int i2 = j + this.world.random.nextInt(6) - 3;
+ int j2 = k + this.world.random.nextInt(16) - 8;
+
+ if (this.a(l1, i2, j2) && this.b(l1, i2, j2, l, i1, j1)) {
+ return Vec3D.create((double) l1, (double) i2, (double) j2);
+ }
+ }
+
+ return null;
+ }
+
+ private boolean b(int i, int j, int k, int l, int i1, int j1) {
+ if (!this.world.e(i, j - 1, k)) {
+ return false;
+ } else {
+ int k1 = i - l / 2;
+ int l1 = k - j1 / 2;
+
+ for (int i2 = k1; i2 < k1 + l; ++i2) {
+ for (int j2 = j; j2 < j + i1; ++j2) {
+ for (int k2 = l1; k2 < l1 + j1; ++k2) {
+ if (this.world.e(i2, j2, k2)) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+
+ private void countPopulation() {
+ List list = this.world.a(EntityIronGolem.class, AxisAlignedBB.b((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size)));
+
+ this.j = list.size();
+ }
+
+ private void i() {
+ List list = this.world.a(EntityVillager.class, AxisAlignedBB.b((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size)));
+
+ this.population = list.size();
+ }
+
+ public ChunkCoordinates getCenter() {
+ return this.center;
+ }
+
+ public int getSize() {
+ return this.size;
+ }
+
+ public int getDoorCount() {
+ return this.doors.size();
+ }
+
+ public int d() {
+ return this.time - this.f;
+ }
+
+ public int getPopulationCount() {
+ return this.population;
+ }
+
+ public boolean a(int i, int j, int k) {
+ return this.center.c(i, j, k) < (float) (this.size * this.size);
+ }
+
+ public List getDoors() {
+ return this.doors;
+ }
+
+ public VillageDoor b(int i, int j, int k) {
+ VillageDoor villagedoor = null;
+ int l = Integer.MAX_VALUE;
+ Iterator iterator = this.doors.iterator();
+
+ while (iterator.hasNext()) {
+ VillageDoor villagedoor1 = (VillageDoor) iterator.next();
+ int i1 = villagedoor1.a(i, j, k);
+
+ if (i1 < l) {
+ villagedoor = villagedoor1;
+ l = i1;
+ }
+ }
+
+ return villagedoor;
+ }
+
+ public VillageDoor c(int i, int j, int k) {
+ VillageDoor villagedoor = null;
+ int l = Integer.MAX_VALUE;
+ Iterator iterator = this.doors.iterator();
+
+ while (iterator.hasNext()) {
+ VillageDoor villagedoor1 = (VillageDoor) iterator.next();
+ int i1 = villagedoor1.a(i, j, k);
+
+ if (i1 > 256) {
+ i1 *= 1000;
+ } else {
+ i1 = villagedoor1.f();
+ }
+
+ if (i1 < l) {
+ villagedoor = villagedoor1;
+ l = i1;
+ }
+ }
+
+ return villagedoor;
+ }
+
+ public VillageDoor d(int i, int j, int k) {
+ if (this.center.c(i, j, k) > (float) (this.size * this.size)) {
+ return null;
+ } else {
+ Iterator iterator = this.doors.iterator();
+
+ VillageDoor villagedoor;
+
+ do {
+ if (!iterator.hasNext()) {
+ return null;
+ }
+
+ villagedoor = (VillageDoor) iterator.next();
+ } while (villagedoor.locX != i || villagedoor.locZ != k || Math.abs(villagedoor.locY - j) > 1);
+
+ return villagedoor;
+ }
+ }
+
+ public void addDoor(VillageDoor villagedoor) {
+ this.doors.add(villagedoor);
+ this.c.x += villagedoor.locX;
+ this.c.y += villagedoor.locY;
+ this.c.z += villagedoor.locZ;
+ this.l();
+ this.f = villagedoor.addedTime;
+ }
+
+ public boolean isAbandoned() {
+ return this.doors.isEmpty();
+ }
+
+ public void a(EntityLiving entityliving) {
+ Iterator iterator = this.i.iterator();
+
+ VillageAgressor villageagressor;
+
+ do {
+ if (!iterator.hasNext()) {
+ this.i.add(new VillageAgressor(this, entityliving, this.time));
+ return;
+ }
+
+ villageagressor = (VillageAgressor) iterator.next();
+ } while (villageagressor.a != entityliving);
+
+ villageagressor.b = this.time;
+ }
+
+ public EntityLiving b(EntityLiving entityliving) {
+ double d0 = Double.MAX_VALUE;
+ VillageAgressor villageagressor = null;
+
+ for (int i = 0; i < this.i.size(); ++i) {
+ VillageAgressor villageagressor1 = (VillageAgressor) this.i.get(i);
+ double d1 = villageagressor1.a.j(entityliving);
+
+ if (d1 <= d0) {
+ villageagressor = villageagressor1;
+ d0 = d1;
+ }
+ }
+
+ return villageagressor != null ? villageagressor.a : null;
+ }
+
+ private void j() {
+ Iterator iterator = this.i.iterator();
+
+ while (iterator.hasNext()) {
+ VillageAgressor villageagressor = (VillageAgressor) iterator.next();
+
+ if (!villageagressor.a.isAlive() || Math.abs(this.time - villageagressor.b) > 300) {
+ iterator.remove();
+ }
+ }
+ }
+
+ private void k() {
+ boolean flag = false;
+ boolean flag1 = this.world.random.nextInt(50) == 0;
+ Iterator iterator = this.doors.iterator();
+
+ while (iterator.hasNext()) {
+ VillageDoor villagedoor = (VillageDoor) iterator.next();
+
+ if (flag1) {
+ villagedoor.d();
+ }
+
+ if (!this.isDoor(villagedoor.locX, villagedoor.locY, villagedoor.locZ) || Math.abs(this.time - villagedoor.addedTime) > 1200) {
+ this.c.x -= villagedoor.locX;
+ this.c.y -= villagedoor.locY;
+ this.c.z -= villagedoor.locZ;
+ flag = true;
+ villagedoor.g = true;
+ iterator.remove();
+ }
+ }
+
+ if (flag) {
+ this.l();
+ }
+ }
+
+ private boolean isDoor(int i, int j, int k) {
+ int l = this.world.getTypeId(i, j, k);
+
+ return l <= 0 ? false : l == Block.WOODEN_DOOR.id;
+ }
+
+ private void l() {
+ int i = this.doors.size();
+
+ if (i == 0) {
+ this.center.a(0, 0, 0);
+ this.size = 0;
+ } else {
+ this.center.a(this.c.x / i, this.c.y / i, this.c.z / i);
+ int j = 0;
+
+ VillageDoor villagedoor;
+
+ for (Iterator iterator = this.doors.iterator(); iterator.hasNext(); j = Math.max(villagedoor.a(this.center.x, this.center.y, this.center.z), j)) {
+ villagedoor = (VillageDoor) iterator.next();
+ }
+
+ this.size = Math.max(32, (int) Math.sqrt((double) j));
+ }
+ }
+}