public Vector3 GetCollision() { Vector3 collisionVector = Vector3.Zero; float distanceToCover = IsNavigatingToDestination ? 0f : 100f; var CollisionMapForEachPositionBodyLocation = GetCollisionMapForEachPositionBodyLocation(distanceToCover); if (CollisionMapForEachPositionBodyLocation.Count > 0) { float minDistance = CollisionMapForEachPositionBodyLocation.Values.Max(x => x.Item2); Vector3 offset = Vector3.Zero; PositionBodyLocation collidingLocation = PositionBodyLocation.None; if (this.Direction == Direction.Upward) { collisionVector = CollisionMapForEachPositionBodyLocation[PositionBodyLocation.Top].Item1; offset = PositionBeingNavigated.BodyLocations[PositionBodyLocation.Top].OffsetVector; collidingLocation = PositionBodyLocation.Top; } else if (this.Direction == Direction.Downward) { collisionVector = CollisionMapForEachPositionBodyLocation[PositionBodyLocation.Bottom].Item1; offset = PositionBeingNavigated.BodyLocations[PositionBodyLocation.Bottom].OffsetVector; collidingLocation = PositionBodyLocation.Bottom; } else { foreach (var part in CollisionMapForEachPositionBodyLocation .Where(m => !(this.IsKnockbackNavigation && (m.Key == PositionBodyLocation.Bottom || m.Key == PositionBodyLocation.BottomSemiMiddle || m.Key == PositionBodyLocation.BottomMiddle)))) { if (part.Value.Item2 < minDistance || part.Value.Item2 == minDistance) { minDistance = part.Value.Item2; collisionVector = CollisionMapForEachPositionBodyLocation[part.Key].Item1; offset = PositionBeingNavigated.BodyLocations[part.Key].OffsetVector; collidingLocation = part.Key; } } } collisionVector = new Vector3(collisionVector.X, collisionVector.Y, collisionVector.Z); if (IsKnockbackNavigation && collisionVector != Vector3.Zero) { collisionVector = GetKnockbackCollision(collisionVector); } CollidingBodyPart = collidingLocation; } return(collisionVector); }
public PositionLocationPartImpl(PositionBodyLocation part, Position position) { Part = part; ParentPosition = position; }