diff --git a/src/engine/objects/Building.java b/src/engine/objects/Building.java index d9e40496..1fef5296 100644 --- a/src/engine/objects/Building.java +++ b/src/engine/objects/Building.java @@ -25,6 +25,7 @@ import engine.job.JobScheduler; import engine.jobs.DoorCloseJob; import engine.jobs.SiegeSpireWithdrawlJob; import engine.math.Bounds; +import engine.math.Vector2f; import engine.math.Vector3f; import engine.math.Vector3fImmutable; import engine.net.ByteBufferWriter; @@ -34,8 +35,8 @@ import engine.net.client.msg.UpdateObjectMsg; import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; -import java.awt.*; import java.awt.geom.Area; +import java.awt.geom.Path2D; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; @@ -1535,17 +1536,31 @@ public class Building extends AbstractWorldObject { } - public void updateNavMesh(){ - Polygon area = new Polygon(); - for(Colliders collider : this.getBounds().colliders){ - area.addPoint((int) collider.startX, (int) collider.startY); - area.addPoint((int) collider.endX, (int) collider.endY); + public void updateNavMesh() { + + // Build up navmesh by stencil of the + // prop's convex hull + + ArrayList> convexHullList; + convexHullList = BuildingManager._hull_data.get(this.meshUUID); + + for (ArrayList meshEntry : convexHullList) { + + Path2D.Float stencil = new Path2D.Float(); + + for (Vector2f vertex : meshEntry) + stencil.moveTo(vertex.x, vertex.y); + + // enclose polygon + + stencil.moveTo(meshEntry.get(0).x, meshEntry.get(0).y); + + Area stencilArea = new Area(stencil); + this.parentZone.navMesh.subtract(stencilArea); } - Area blocked = new Area(area); - this.parentZone.navMesh.subtract(blocked); //add in all the regions to the navMesh - for(Regions region : this.getBounds().getRegions()) + for (Regions region : this.getBounds().getRegions()) this.parentZone.navMesh.add(region.getArea()); } }