Index: combat.c
===================================================================
--- combat.c	(revision 462)
+++ combat.c	(working copy)
@@ -104,9 +104,15 @@
 	//Watermelon:predicted X,Y offset per sec
 	SDWORD			predictX;
 	SDWORD			predictY;
-	//Watermelon:dirty dist
+	//Watermelon:sqrt dist
 	SDWORD			dist;
+	//Watermelon:vtolDist
+	SDWORD			vtolDist;
+	SDWORD			zDiff;
+	BOOL			bFlyingVTOL;
 
+	bFlyingVTOL = FALSE;
+
 	ASSERT( PTRVALID(psWeap, sizeof(WEAPON)),
 		"combFire: Invalid weapon pointer" );
 	ASSERT( PTRVALID(psAttacker, sizeof(BASE_OBJECT)),
@@ -343,8 +349,20 @@
 	xDiff = abs(psAttacker->x - psTarget->x);
 	yDiff = abs(psAttacker->y - psTarget->y);
 	distSquared = xDiff*xDiff + yDiff*yDiff;
-	//Watermelon:dirty dist
-	dist = dirtySqrt(psAttacker->x,psAttacker->y,psTarget->x,psTarget->y);
+	//Watermelon:actual dist
+	dist = sqrt(distSquared);
+
+	//Watermelon:need to calculate the vtol actual distance(affected by vector z)
+	if (psTarget->type == OBJ_DROID)
+	{
+		if (vtolDroid((DROID *)psTarget) && !(((DROID *)psTarget)->sMove.Status == MOVEINACTIVE))
+		{
+			zDiff = abs(psAttacker->z - psTarget->z);
+			vtolDist = (SDWORD)(sqrt(dist*dist + zDiff*zDiff));
+			bFlyingVTOL = TRUE;
+		}
+	}
+
 	longRange = proj_GetLongRange(psStats, (SDWORD)psAttacker->z-(SDWORD)psTarget->z);
 	if (distSquared <= (psStats->shortRange * psStats->shortRange) AND
 		distSquared >= (psStats->minRange * psStats->minRange))
@@ -367,12 +385,23 @@
 		{
 			/* Kerrrbaaang !!!!! a hit */
 			//Watermelon:Target prediction
-			if(psTarget->type == OBJ_DROID)
+			if (psTarget->type == OBJ_DROID)
 			{
-				predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * sqrt(distSquared)) /psStats->flightSpeed;
-				predictX += psTarget->x;
-				predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * sqrt(distSquared)) /psStats->flightSpeed;
-				predictY += psTarget->y;
+				//Watermelon:If it's a flying VTOL use vtolDist
+				if (bFlyingVTOL)
+				{
+					predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * vtolDist) /psStats->flightSpeed;
+					predictX += psTarget->x;
+					predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * vtolDist) /psStats->flightSpeed;
+					predictY += psTarget->y;
+				}
+				else
+				{
+					predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+					predictX += psTarget->x;
+					predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+					predictY += psTarget->y;
+				}
 			}
 			else
 			{
@@ -418,17 +447,20 @@
 		{
 			/* Kerrrbaaang !!!!! a hit */
 			//Watermelon:Target prediction
-			if(psTarget->type == OBJ_DROID)
+			//Watermelon:If it's a flying VTOL use vtolDist
+			if (bFlyingVTOL)
 			{
-				predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * sqrt(distSquared)) /psStats->flightSpeed;
+				predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * vtolDist) /psStats->flightSpeed;
 				predictX += psTarget->x;
-				predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * sqrt(distSquared)) /psStats->flightSpeed;
+				predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * vtolDist) /psStats->flightSpeed;
 				predictY += psTarget->y;
 			}
 			else
 			{
-				predictX = psTarget->x;
-				predictY = psTarget->y;
+				predictX = (cos(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+				predictX += psTarget->x;
+				predictY = (sin(((DROID *)psTarget)->sMove.dir) * ((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+				predictY += psTarget->y;
 			}
 			DBP3(("Shot hit (%d)\n", dice));
 			if (!proj_SendProjectile(psWeap, psAttacker, psAttacker->player,
Index: projectile.c
===================================================================
--- projectile.c	(revision 462)
+++ projectile.c	(working copy)
@@ -830,18 +830,31 @@
 					continue;
 				}
 			}
-			xdiff = (SDWORD)psObj->x - (SDWORD)psTempObj->x;
-			ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
-			zdiff = (SDWORD)psObj->z - (SDWORD)psTempObj->z;
 
 			//Watermelon:dont apply the 'hitbox' bonus if the target is a building
-			if ( psTempObj->type == OBJ_STRUCTURE )
+			if ( psTempObj->type == OBJ_STRUCTURE || psTempObj->type == OBJ_FEATURE)
 			{
 				wpRadius = 1;
+				//Watermelon:AA weapon shouldnt hit buildings
+				if ( psObj->psWStats->surfaceToAir == SHOOT_IN_AIR )
+				{
+					continue;
+				}
 			}
 
+			xdiff = (SDWORD)psObj->x - (SDWORD)psTempObj->x;
+			ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
+
 			if ((xdiff*xdiff + ydiff*ydiff) < (wpRadius * (SDWORD)(establishTargetRadius(psTempObj)) * (SDWORD)(establishTargetRadius(psTempObj))) )
 			{
+				if ( psObj->psWStats->surfaceToAir == SHOOT_IN_AIR )
+				{
+					if (psTempObj->type == OBJ_DROID && !vtolDroid((DROID *)psTempObj))
+					{
+						continue;
+					}
+				}
+
 				psNewTarget = psTempObj;
 				psObj->psDest = psNewTarget;
 		  		psObj->state = PROJ_IMPACT;
@@ -2324,4 +2337,3 @@
 	}
 }
 
-
