]> git.lizzy.rs Git - BoundingBoxOutlineReloaded.git/commitdiff
Fix weirdness with village center point and golem spawn area 1.0.0-beta16
authorirtimaled <irtimaled@gmail.com>
Sat, 28 Jan 2017 11:29:18 +0000 (11:29 +0000)
committerirtimaled <irtimaled@gmail.com>
Sat, 28 Jan 2017 11:29:18 +0000 (11:29 +0000)
java/com/irtimaled/bbor/BoundingBoxVillage.java
java/com/irtimaled/bbor/ClientProxy.java

index 97ab1e1a18e80a0b766920b0661e3c55a51038d4..a5269716862d3024e6005d55a86c1d74c9b2c667 100644 (file)
@@ -10,6 +10,8 @@ public class BoundingBoxVillage extends BoundingBox {
     private final Integer radius;
     private final boolean spawnsIronGolems;
     private Set<BlockPos> doors;
+    private Double centerOffsetX;
+    private Double centerOffsetZ;
 
     protected BoundingBoxVillage(BlockPos center, Integer radius, Color color, boolean spawnsIronGolems, Set<BlockPos> doors, BlockPos minBlockPos, BlockPos maxBlockPos) {
         super(minBlockPos, maxBlockPos, color);
@@ -17,6 +19,7 @@ public class BoundingBoxVillage extends BoundingBox {
         this.radius = radius;
         this.spawnsIronGolems = spawnsIronGolems;
         this.doors = doors;
+        calculateCenterOffsets(doors);
     }
 
     public static BoundingBoxVillage from(BlockPos center, Integer radius, int population, Set<BlockPos> doors) {
@@ -40,6 +43,33 @@ public class BoundingBoxVillage extends BoundingBox {
         return new BoundingBoxVillage(center, radius, color, spawnsIronGolems, doors, minBlockPos, maxBlockPos);
     }
 
+    private void calculateCenterOffsets(Set<BlockPos> doors)
+    {
+        boolean processedFirstDoor = false;
+        int minX = 0;
+        int maxX = 0;
+        int minZ = 0;
+        int maxZ = 0;
+        for (BlockPos door : doors) {
+            if (!processedFirstDoor ||
+                    (minX > door.getX()))
+                minX = door.getX();
+            if (!processedFirstDoor ||
+                    maxX < door.getX())
+                maxX = door.getX();
+            if (!processedFirstDoor ||
+                    minZ > door.getZ())
+                minZ = door.getZ();
+            if (!processedFirstDoor ||
+                    maxZ < door.getZ())
+                maxZ = door.getZ();
+
+            processedFirstDoor = true;
+        }
+        centerOffsetX = Math.abs(maxX-minX) % 2 == 0 ? 0.5 : (minX < 0 ? 0 : 1);
+        centerOffsetZ = Math.abs(maxZ-minZ) % 2 == 0 ? 0.5 : (minZ < 0 ? 0 : 1);
+    }
+
     @Override
     public String toString() {
         return "(" + center.toString() + "; " + radius.toString() + ")";
@@ -53,6 +83,14 @@ public class BoundingBoxVillage extends BoundingBox {
         return center;
     }
 
+    public Double getCenterOffsetX() {
+        return centerOffsetX;
+    }
+
+    public Double getCenterOffsetZ() {
+        return centerOffsetZ;
+    }
+
     @Override
     public int hashCode()
     { final int prime = 31;
index dfa523b31b23b5aa0c82d3874550127503c1578c..f6bad9e391c951954519ae1c7db85087811a26f8 100644 (file)
@@ -386,12 +386,15 @@ public class ClientProxy extends CommonProxy {
                 center.getZ() - 8),
                 new BlockPos(center.getX() + 8,
                         center.getY() + 3,
-                        center.getZ() + 8));
-        renderCuboid(abb.addCoord(1, 1, 1), villageBB.getColor(), false);
+                        center.getZ() + 8))
+                .offset(villageBB.getCenterOffsetX(), 0.0, villageBB.getCenterOffsetZ());
+
+        renderCuboid(abb, villageBB.getColor(), false);
     }
 
     private void renderVillageDoors(BoundingBoxVillage villageBB) {
-        OffsetPoint center = new OffsetPoint(villageBB.getCenter());
+        OffsetPoint center = new OffsetPoint(villageBB.getCenter())
+                .add(villageBB.getCenterOffsetX(), 0.0, villageBB.getCenterOffsetZ());
         Color color = villageBB.getColor();
         GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
         Tessellator tessellator = Tessellator.getInstance();
@@ -403,7 +406,7 @@ public class ClientProxy extends CommonProxy {
 
         worldRenderer.begin(GL11.GL_LINES, worldRenderer.getVertexFormat());
         for (BlockPos door : villageBB.getDoors()) {
-            OffsetPoint point = new OffsetPoint(door);
+            OffsetPoint point = new OffsetPoint(door).add(0.5, 0, 0.5);
 
             worldRenderer.pos(point.getX(), point.getY(), point.getZ()).color(colorR, colorG, colorB, 255).endVertex();
             worldRenderer.pos(center.getX(), center.getY(), center.getZ()).color(colorR, colorG, colorB, 255).endVertex();
@@ -537,13 +540,14 @@ public class ClientProxy extends CommonProxy {
     }
 
     private void renderBoundingBoxVillageAsSphere(BoundingBoxVillage bb) {
-        BlockPos center = bb.getCenter();
+        OffsetPoint center = new OffsetPoint(bb.getCenter())
+                .add(bb.getCenterOffsetX(), 0.0, bb.getCenterOffsetZ());;
         int radius = bb.getRadius();
         Color color = bb.getColor();
         renderSphere(center, radius, color);
     }
 
-    private void renderSphere(BlockPos center, double radius, Color color) {
+    private void renderSphere(OffsetPoint center, double radius, Color color) {
         GL11.glEnable(GL11.GL_POINT_SMOOTH);
         GL11.glPointSize(2f);
 
@@ -592,13 +596,12 @@ public class ClientProxy extends CommonProxy {
         }
     }
 
-    private Set<OffsetPoint> buildPoints(BlockPos center, double radius) {
+    private Set<OffsetPoint> buildPoints(OffsetPoint center, double radius) {
         Set<OffsetPoint> points = new HashSet<OffsetPoint>(1200);
 
         double tau = 6.283185307179586D;
         double pi = tau / 2D;
         double segment = tau / 48D;
-        OffsetPoint centerPoint = new OffsetPoint(center);
 
         for (double t = 0.0D; t < tau; t += segment)
             for (double theta = 0.0D; theta < pi; theta += segment) {
@@ -606,7 +609,7 @@ public class ClientProxy extends CommonProxy {
                 double dz = radius * Math.sin(t) * Math.sin(theta);
                 double dy = radius * Math.cos(t);
 
-                points.add(centerPoint.add(dx, dy, dz));
+                points.add(center.add(dx, dy, dz));
             }
         return points;
     }