internal List <GeoTerrainTriangle> GetTrianglesForHitbox(Hitbox hb, Vector3 offset, Vector3 collisionOffset) { resultlist.Clear(); coarse.Clear(); hbTestVector.X = hb.GetCenter().X + collisionOffset.X; hbTestVector.Y = 0; hbTestVector.Z = hb.GetCenter().Z + collisionOffset.Z; collisionSectors.Clear(); fineSectors.Clear(); foreach (Sector coarseSector in mSectorsCoarse) { if (hbTestVector.X >= coarseSector.Left + offset.X && hbTestVector.X <= coarseSector.Right + offset.X && hbTestVector.Z >= coarseSector.Back + offset.Z && hbTestVector.Z <= coarseSector.Front + offset.Z) { if (!coarse.Contains(coarseSector)) { coarse.Add(coarseSector); } } } if (coarse.Count > 0) { foreach (Sector cs in coarse) { fineSectors.AddRange(mSectorCoarseMap[cs]); foreach (Sector fineSector in fineSectors) { if (hbTestVector.X >= fineSector.Left + offset.X && hbTestVector.X <= fineSector.Right + offset.X && hbTestVector.Z >= fineSector.Back + offset.Z && hbTestVector.Z <= fineSector.Front + offset.Z) { foreach (GeoTerrainTriangle t in mSectorTriangleMap[fineSector.ID]) { if (hbTestVector.X >= t.boundLeft + offset.X && hbTestVector.X <= t.boundRight + offset.X && hbTestVector.Z >= t.boundBack + offset.Z && hbTestVector.Z <= t.boundFront + offset.Z) { resultlist.Add(t); } } } } } } else { throw new Exception("No coarse sector found for hitbox of " + hb.Owner.Name); } return(resultlist); }