utilize min and max Y values for meshes
This commit is contained in:
@@ -7,7 +7,7 @@ import java.awt.*;
|
|||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
|
|
||||||
public class CollisionManager {
|
public class CollisionManager {
|
||||||
public static boolean CollisionDetected(Building building, Line2D travelLine, float charHeight){
|
public static boolean CollisionDetected(Building building, Line2D travelLine, float charHeight, float charY){
|
||||||
Rectangle.Float boundsRect = new Rectangle.Float();
|
Rectangle.Float boundsRect = new Rectangle.Float();
|
||||||
Vector3f topLeft = new Vector3f(building.loc.x - building.getBounds().getHalfExtents().x,building.loc.y,building.loc.z - building.getBounds().getHalfExtents().y);
|
Vector3f topLeft = new Vector3f(building.loc.x - building.getBounds().getHalfExtents().x,building.loc.y,building.loc.z - building.getBounds().getHalfExtents().y);
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@ public class CollisionManager {
|
|||||||
if(travelLine.intersects(boundsRect)){
|
if(travelLine.intersects(boundsRect)){
|
||||||
//collided with building
|
//collided with building
|
||||||
for(Mesh mesh : building.buildingMeshes) {
|
for(Mesh mesh : building.buildingMeshes) {
|
||||||
if (mesh.MeshCollides(travelLine,charHeight)) {
|
if (mesh.MeshCollides(travelLine,charHeight, charY)) {
|
||||||
//ChatManager.chatSystemInfo(pc, "Collision Detected");
|
//ChatManager.chatSystemInfo(pc, "Collision Detected");
|
||||||
//MovementManager.movement(msg, pc);
|
//MovementManager.movement(msg, pc);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ public class Mesh {
|
|||||||
public ArrayList<Triangle> triangles;
|
public ArrayList<Triangle> triangles;
|
||||||
public ArrayList<Line2D> BoundingLines;
|
public ArrayList<Line2D> BoundingLines;
|
||||||
public Rectangle2D boundsRect;
|
public Rectangle2D boundsRect;
|
||||||
public float meshHeight;
|
public float maxY;
|
||||||
|
public float minY;
|
||||||
|
|
||||||
public boolean BoundsCollides(Line2D line){
|
public boolean BoundsCollides(Line2D line){
|
||||||
for(Line2D side : BoundingLines)
|
for(Line2D side : BoundingLines)
|
||||||
@@ -19,14 +20,15 @@ public class Mesh {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean MeshCollides(Line2D line, float charHeight){
|
public boolean MeshCollides(Line2D line, float charHeight, float charY){
|
||||||
|
|
||||||
//movement path does not intersect this mesh
|
//movement path does not intersect this mesh
|
||||||
if(line.intersects(boundsRect) == false)
|
//if(line.intersects(boundsRect) == false)
|
||||||
|
if(!this.BoundsCollides(line))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
//character moving is higher than the max Y of this mesh
|
//character moving is higher than the max Y of this mesh
|
||||||
if(charHeight > this.meshHeight)
|
if(charY > this.maxY && charHeight + charY < this.minY)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for(Triangle tri : triangles)
|
for(Triangle tri : triangles)
|
||||||
|
|||||||
@@ -923,7 +923,8 @@ public class dbBuildingHandler extends dbHandlerBase {
|
|||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
|
|
||||||
if(BuildingManager.mesh_heights.containsKey(rs.getInt("meshID")) == false){
|
if(BuildingManager.mesh_heights.containsKey(rs.getInt("meshID")) == false){
|
||||||
BuildingManager.mesh_heights.put(rs.getInt("meshID"),rs.getFloat("maxY"));
|
Vector2f heights = new Vector2f(rs.getFloat("maxY"),rs.getFloat("minY"));
|
||||||
|
BuildingManager.mesh_heights.put(rs.getInt("meshID"),heights);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ public class RegionCmd extends AbstractDevCmd {
|
|||||||
if(building != null){
|
if(building != null){
|
||||||
for(Mesh mesh : building.buildingMeshes){
|
for(Mesh mesh : building.buildingMeshes){
|
||||||
if(mesh.boundsRect.contains(new Point2D.Float(((AbstractCharacter) target).loc.x,((AbstractCharacter) target).loc.z))){
|
if(mesh.boundsRect.contains(new Point2D.Float(((AbstractCharacter) target).loc.x,((AbstractCharacter) target).loc.z))){
|
||||||
if(((AbstractCharacter) target).loc.y < mesh.meshHeight) {
|
if(((AbstractCharacter) target).loc.y < mesh.maxY) {
|
||||||
this.throwbackInfo(pc, "Inside Mesh Bounds");
|
this.throwbackInfo(pc, "Inside Mesh Bounds");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import engine.job.JobContainer;
|
|||||||
import engine.job.JobScheduler;
|
import engine.job.JobScheduler;
|
||||||
import engine.jobs.UpgradeBuildingJob;
|
import engine.jobs.UpgradeBuildingJob;
|
||||||
import engine.math.Bounds;
|
import engine.math.Bounds;
|
||||||
|
import engine.math.Vector2f;
|
||||||
import engine.math.Vector3f;
|
import engine.math.Vector3f;
|
||||||
import engine.math.Vector3fImmutable;
|
import engine.math.Vector3fImmutable;
|
||||||
import engine.net.client.ClientConnection;
|
import engine.net.client.ClientConnection;
|
||||||
@@ -45,7 +46,7 @@ public enum BuildingManager {
|
|||||||
BUILDINGMANAGER;
|
BUILDINGMANAGER;
|
||||||
|
|
||||||
public static HashMap<Integer,ArrayList<Integer>> prop_meshes = new HashMap<>();
|
public static HashMap<Integer,ArrayList<Integer>> prop_meshes = new HashMap<>();
|
||||||
public static HashMap<Integer,Float> mesh_heights = new HashMap<>();
|
public static HashMap<Integer, Vector2f> mesh_heights = new HashMap<>();
|
||||||
public static HashMap<Integer,ArrayList<ArrayList<Vector3f>>> mesh_triangle_points = 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, Rectangle2D> mesh_bounding_boxes = new HashMap<>();
|
||||||
@@ -993,7 +994,8 @@ public enum BuildingManager {
|
|||||||
return; //no data for this mesh
|
return; //no data for this mesh
|
||||||
|
|
||||||
Mesh generatedMesh = new Mesh();
|
Mesh generatedMesh = new Mesh();
|
||||||
generatedMesh.meshHeight = building.loc.y + mesh_heights.get(mesh);
|
generatedMesh.maxY = building.loc.y + mesh_heights.get(mesh).x;
|
||||||
|
generatedMesh.minY = building.loc.y + mesh_heights.get(mesh).y;
|
||||||
ArrayList<ArrayList<Vector3f>> triPoints = mesh_triangle_points.get(mesh);
|
ArrayList<ArrayList<Vector3f>> triPoints = mesh_triangle_points.get(mesh);
|
||||||
|
|
||||||
if (mesh_bounding_boxes.containsKey(mesh)) {
|
if (mesh_bounding_boxes.containsKey(mesh)) {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class MoveToPointHandler extends AbstractClientMsgHandler {
|
|||||||
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(pc.loc, movementDistance, MBServerStatics.MASK_BUILDING);
|
HashSet<AbstractWorldObject> awoList = WorldGrid.getObjectsInRangePartial(pc.loc, movementDistance, MBServerStatics.MASK_BUILDING);
|
||||||
for(AbstractWorldObject awo : awoList){
|
for(AbstractWorldObject awo : awoList){
|
||||||
Building building = (Building)awo;
|
Building building = (Building)awo;
|
||||||
if(CollisionManager.CollisionDetected(building, travelLine,pc.getCharacterHeight())){
|
if(CollisionManager.CollisionDetected(building, travelLine,pc.getCharacterHeight(),pc.loc.y)){
|
||||||
ChatManager.chatSystemInfo(pc, "Collision Detected");
|
ChatManager.chatSystemInfo(pc, "Collision Detected");
|
||||||
//msg.setEndCoord();
|
//msg.setEndCoord();
|
||||||
MovementManager.movement(msg, pc);
|
MovementManager.movement(msg, pc);
|
||||||
|
|||||||
Reference in New Issue
Block a user