Index: src/action.c
===================================================================
--- src/action.c	(revision 6001)
+++ src/action.c	(working copy)
@@ -256,23 +256,25 @@
 }
 
 
-
 // check if a target is inside minimum weapon range
-BOOL actionInsideMinRange(DROID *psDroid, BASE_OBJECT *psObj, int weapon_slot)
+BOOL actionInsideMinRange(DROID *psDroid, BASE_OBJECT *psObj, WEAPON_STATS *psStats)
 {
-	SDWORD			dx, dy, dz, radSq, rangeSq, minRange;
-	WEAPON_STATS	*psStats;
+	SDWORD	dx, dy, dz, radSq, rangeSq, minRange;
 
 	CHECK_DROID(psDroid);
+	CHECK_OBJECT(psObj);
 
+	if (!psStats)
+	{
+		psStats = getWeaponStats(psDroid, 0);
+	}
+
 	/* Watermelon:if I am a multi-turret droid */
 	if (psDroid->asWeaps[0].nStat == 0)
 	{
 		return false;
 	}
 
-	psStats = asWeaponStats + psDroid->asWeaps[weapon_slot].nStat;
-
 	dx = (SDWORD)psDroid->pos.x - (SDWORD)psObj->pos.x;
 	dy = (SDWORD)psDroid->pos.y - (SDWORD)psObj->pos.y;
 	dz = (SDWORD)psDroid->pos.z - (SDWORD)psObj->pos.z;
@@ -557,19 +559,11 @@
 	}
 
 	/* set muzzle pitch if direct fire */
-//	if ( asWeaponStats[psAttacker->asWeaps->nStat].direct == true )
-	if ( psWeapStats != NULL &&
-		 ( proj_Direct( psWeapStats ) ||
-		 ( (psAttacker->type == OBJ_DROID) &&
-			!proj_Direct( psWeapStats ) &&
-			actionInsideMinRange(psDroid, psTarget, weapon_slot) ) ) )
+	if (psWeapStats && (proj_Direct(psWeapStats) || ((psAttacker->type == OBJ_DROID) && !proj_Direct(psWeapStats) 
+	                                                  && actionInsideMinRange(psDroid, psTarget, psWeapStats))))
 	{
-// difference between muzzle position and droid origin is unlikely to affect aiming
-// particularly as target origin is used
-//		calcDroidMuzzleLocation( psAttacker, &muzzle);
 		dx = psTarget->pos.x - psAttacker->pos.x;//muzzle.x;
 		dy = psTarget->pos.y - psAttacker->pos.y;//muzzle.y;
-//		dz = map_Height(psTarget->pos.x, psTarget->pos.y) - psAttacker->pos.z;//muzzle.z;
 		dz = psTarget->pos.z - psAttacker->pos.z;//muzzle.z;
 
 		/* get target distance */
@@ -1570,7 +1564,6 @@
 		break;
 
 	case DACTION_MOVETOATTACK:
-
 		// don't wan't formations for this one
 		if (psDroid->sMove.psFormation)
 		{
@@ -1680,14 +1673,15 @@
 			{
 				/* Stopped moving but haven't reached the target - possibly move again */
 
+				//Watermelon:'hack' to make the droid to check the primary turrent instead of all
+				psWeapStats = asWeaponStats + psDroid->asWeaps[0].nStat;
+
 				if (psDroid->order == DORDER_ATTACKTARGET && secondaryGetState(psDroid, DSO_HALTTYPE, &state) && (state == DSS_HALT_HOLD))
 				{
 					psDroid->action = DACTION_NONE;			// on hold, give up.
 				}
-				else if ( actionInsideMinRange(psDroid, psDroid->psActionTarget[0], 0) )
+				else if (actionInsideMinRange(psDroid, psDroid->psActionTarget[0], psWeapStats))
 				{
-					//Watermelon:'hack' to make the droid to check the primary turrent instead of all
-					psWeapStats = asWeaponStats + psDroid->asWeaps[0].nStat;
 					if ( proj_Direct( psWeapStats ) )
 					{
 						// try and extend the range
@@ -2454,7 +2448,7 @@
 {
 	SECONDARY_STATE			state;
 	SDWORD			pbx,pby;
-	WEAPON_STATS	*psWeapStats;
+	WEAPON_STATS		*psWeapStats = getWeaponStats(psDroid, 0);
 	UDWORD			droidX,droidY;
 	BASE_OBJECT		*psTarget;
 	//Watermelon:added MinRangeResult;
@@ -2542,9 +2536,8 @@
 		{
 			psDroid->action = DACTION_ATTACK;		// holding, try attack straightaway
 		}
-		else if (actionInsideMinRange(psDroid, psAction->psObj, 0))
+		else if (actionInsideMinRange(psDroid, psAction->psObj, psWeapStats))
 		{
-			psWeapStats = &asWeaponStats[psDroid->asWeaps[0].nStat];
 			if ( !proj_Direct( psWeapStats ) )
 			{
 				if (psWeapStats->rotate)
Index: src/action.h
===================================================================
--- src/action.h	(revision 6001)
+++ src/action.h	(working copy)
@@ -125,7 +125,7 @@
 extern BOOL actionInRange(DROID *psDroid, BASE_OBJECT *psObj, int weapon_slot);
 
 /** Check if a target is inside minimum weapon range. */
-extern BOOL actionInsideMinRange(DROID *psDroid, BASE_OBJECT *psObj, int weapon_slot);
+extern BOOL actionInsideMinRange(DROID *psDroid, BASE_OBJECT *psObj, WEAPON_STATS *psWeapStats);
 
 /** Return whether a droid can see a target to fire on it. */
 BOOL actionVisibleTarget(DROID *psDroid, BASE_OBJECT *psTarget, int weapon_slot);
Index: src/combat.c
===================================================================
--- src/combat.c	(revision 6001)
+++ src/combat.c	(working copy)
@@ -183,10 +183,8 @@
 	}
 
 	/* Check we can see the target */
-	if ( (psAttacker->type == OBJ_DROID) &&
-		 !isVtolDroid((DROID *)psAttacker) &&
-		 (proj_Direct(psStats) ||
-		 actionInsideMinRange(psDroid, psTarget, weapon_slot)) )
+	if (psAttacker->type == OBJ_DROID && !isVtolDroid((DROID *)psAttacker)
+	    && (proj_Direct(psStats) || actionInsideMinRange(psDroid, psTarget, psStats)))
 	{
 		if(!visibleObject(psAttacker, psTarget, true))
 		{
@@ -264,7 +262,7 @@
 			 ( (distSquared >= psStats->minRange * psStats->minRange) ||
 			   ((psAttacker->type == OBJ_DROID) &&
 			   !proj_Direct(psStats) &&
-			   actionInsideMinRange(psDroid, psTarget, weapon_slot)) ))
+			   actionInsideMinRange(psDroid, psTarget, psStats))))
 	{
 		// get weapon chance to hit in the long range
 		baseHitChance = weaponLongHit(psStats,psAttacker->player);
Index: src/order.c
===================================================================
--- src/order.c	(revision 6001)
+++ src/order.c	(working copy)
@@ -1593,7 +1593,7 @@
 			psDroid->order = psOrder->order;
 
 			if (isVtolDroid(psDroid)
-			    || actionInsideMinRange(psDroid, psOrder->psObj, 0)
+			    || actionInsideMinRange(psDroid, psOrder->psObj, NULL)
 			    || (psOrder->order == DORDER_ATTACKTARGET
 			        && secondaryGetState(psDroid, DSO_HALTTYPE, &state) && state == DSS_HALT_HOLD))
 			{
Index: src/droid.h
===================================================================
--- src/droid.h	(revision 6001)
+++ src/droid.h	(working copy)
@@ -470,6 +470,11 @@
 	return asConstructStats + psDroid->asBits[COMP_CONSTRUCT].nStat;
 }
 
+static inline WEAPON_STATS *getWeaponStats(DROID *psDroid, int weapon_slot)
+{
+	return asWeaponStats + psDroid->asWeaps[weapon_slot].nStat;
+}
+
 /** helper functions for future refcount patch **/
 
 #define setDroidTarget(_psDroid, _psNewTarget) _setDroidTarget(_psDroid, _psNewTarget, __LINE__, __FUNCTION__)
