|
|
|
@ -14,10 +14,13 @@ import engine.Enum.BuildingGroup;
@@ -14,10 +14,13 @@ import engine.Enum.BuildingGroup;
|
|
|
|
|
import engine.Enum.GameObjectType; |
|
|
|
|
import engine.InterestManagement.InterestManager; |
|
|
|
|
import engine.InterestManagement.WorldGrid; |
|
|
|
|
import engine.collision.Mesh; |
|
|
|
|
import engine.collision.Triangle; |
|
|
|
|
import engine.job.JobContainer; |
|
|
|
|
import engine.job.JobScheduler; |
|
|
|
|
import engine.jobs.UpgradeBuildingJob; |
|
|
|
|
import engine.math.Bounds; |
|
|
|
|
import engine.math.Vector3f; |
|
|
|
|
import engine.math.Vector3fImmutable; |
|
|
|
|
import engine.net.client.ClientConnection; |
|
|
|
|
import engine.net.client.msg.ErrorPopupMsg; |
|
|
|
@ -27,6 +30,10 @@ import engine.objects.*;
@@ -27,6 +30,10 @@ import engine.objects.*;
|
|
|
|
|
import engine.server.MBServerStatics; |
|
|
|
|
import org.pmw.tinylog.Logger; |
|
|
|
|
|
|
|
|
|
import java.awt.*; |
|
|
|
|
import java.awt.geom.Line2D; |
|
|
|
|
import java.awt.geom.Point2D; |
|
|
|
|
import java.awt.geom.Rectangle2D; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.time.ZoneId; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
@ -38,6 +45,12 @@ public enum BuildingManager {
@@ -38,6 +45,12 @@ public enum BuildingManager {
|
|
|
|
|
|
|
|
|
|
BUILDINGMANAGER; |
|
|
|
|
|
|
|
|
|
public static HashMap<Integer,ArrayList<Integer>> prop_meshes = new HashMap<>(); |
|
|
|
|
public static HashMap<Integer,Float> mesh_heights = new HashMap<>(); |
|
|
|
|
public static HashMap<Integer,ArrayList<ArrayList<Vector3f>>> mesh_triangle_points = new HashMap<>(); |
|
|
|
|
|
|
|
|
|
public static HashMap<Integer, Rectangle2D> mesh_bounding_boxes = new HashMap<>(); |
|
|
|
|
|
|
|
|
|
public static HashMap<Integer, ArrayList<BuildingLocation>> _stuckLocations = new HashMap<>(); |
|
|
|
|
public static HashMap<Integer, ArrayList<BuildingLocation>> _slotLocations = new HashMap<>(); |
|
|
|
|
|
|
|
|
@ -942,6 +955,9 @@ public enum BuildingManager {
@@ -942,6 +955,9 @@ public enum BuildingManager {
|
|
|
|
|
|
|
|
|
|
cleanupHirelings(building); |
|
|
|
|
|
|
|
|
|
//rebake colliders for change in rank
|
|
|
|
|
BuildingManager.BakeBuildingMeshes(building); |
|
|
|
|
|
|
|
|
|
building.isDeranking.compareAndSet(true, false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -960,4 +976,63 @@ public enum BuildingManager {
@@ -960,4 +976,63 @@ public enum BuildingManager {
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void BakeBuildingMeshes(Building building){ |
|
|
|
|
|
|
|
|
|
if(building == null) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
building.buildingMeshes = new ArrayList<>(); |
|
|
|
|
float rotation = building.getRot().getRotation(); |
|
|
|
|
Vector3f buildingLoc = new Vector3f(building.loc.x,building.loc.y,building.loc.z); |
|
|
|
|
if(!prop_meshes.containsKey(building.getBlueprint().getMeshForRank(building.getRank()))) |
|
|
|
|
return; //no data for this prop ID
|
|
|
|
|
ArrayList<Integer> meshes = prop_meshes.get(building.getBlueprint().getMeshForRank(building.getRank())); |
|
|
|
|
for(int mesh : meshes){ |
|
|
|
|
|
|
|
|
|
if(!mesh_heights.containsKey(mesh) || !mesh_triangle_points.containsKey(mesh)) |
|
|
|
|
return; //no data for this mesh
|
|
|
|
|
|
|
|
|
|
Mesh generatedMesh = new Mesh(); |
|
|
|
|
generatedMesh.meshHeight = mesh_heights.get(mesh); |
|
|
|
|
ArrayList<ArrayList<Vector3f>> triPoints = mesh_triangle_points.get(mesh); |
|
|
|
|
|
|
|
|
|
if(mesh_bounding_boxes.containsKey(mesh)){ |
|
|
|
|
Rectangle2D boundingBox = mesh_bounding_boxes.get(mesh); |
|
|
|
|
generatedMesh.BoundingLines = new ArrayList<>(); |
|
|
|
|
float maxX = building.loc.x + (float)boundingBox.getMaxX(); |
|
|
|
|
float minX = building.loc.x + (float)boundingBox.getMinX(); |
|
|
|
|
float maxY = building.loc.z + (float)boundingBox.getMaxY(); |
|
|
|
|
float minY = building.loc.z + (float)boundingBox.getMinY(); |
|
|
|
|
|
|
|
|
|
Point2D.Float p1 = new Point2D.Float(minX,maxY); |
|
|
|
|
Point2D.Float p2 = new Point2D.Float(maxX,maxY); |
|
|
|
|
Point2D.Float p3 = new Point2D.Float(maxX,minY); |
|
|
|
|
Point2D.Float p4 = new Point2D.Float(minX,minY); |
|
|
|
|
generatedMesh.BoundingLines.add(new Line2D.Float(p1,p2)); |
|
|
|
|
generatedMesh.BoundingLines.add(new Line2D.Float(p2,p3)); |
|
|
|
|
generatedMesh.BoundingLines.add(new Line2D.Float(p3,p4)); |
|
|
|
|
generatedMesh.BoundingLines.add(new Line2D.Float(p4,p1)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for(ArrayList<Vector3f> pointList : triPoints){ |
|
|
|
|
|
|
|
|
|
ArrayList<Vector3f> rotatedPoints = new ArrayList<>(); |
|
|
|
|
for(Vector3f point : pointList) |
|
|
|
|
rotatedPoints.add(Vector3f.rotateAroundPoint(buildingLoc,point,rotation)); |
|
|
|
|
|
|
|
|
|
Point2D.Float p1 = new Point2D.Float(rotatedPoints.get(0).x,rotatedPoints.get(0).z); |
|
|
|
|
Point2D.Float p2 = new Point2D.Float(rotatedPoints.get(1).x,rotatedPoints.get(1).z); |
|
|
|
|
Point2D.Float p3 = new Point2D.Float(rotatedPoints.get(2).x,rotatedPoints.get(2).z); |
|
|
|
|
|
|
|
|
|
Triangle tri = new Triangle(); |
|
|
|
|
tri.sides = new ArrayList<>(); |
|
|
|
|
tri.sides.add(new Line2D.Float(p1,p2)); |
|
|
|
|
tri.sides.add(new Line2D.Float(p2,p3)); |
|
|
|
|
tri.sides.add(new Line2D.Float(p3,p1)); |
|
|
|
|
generatedMesh.triangles.add(tri); |
|
|
|
|
} |
|
|
|
|
building.buildingMeshes.add(generatedMesh); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|