diff --git a/src/game/trigger.cpp b/src/game/trigger.cpp
index 89cea89d4..53acc521b 100644
--- a/src/game/trigger.cpp
+++ b/src/game/trigger.cpp
@@ -178,6 +178,13 @@ static int CclGetNumUnitsAt(lua_State *l)
 	CclGetPos(l, &minPos.x, &minPos.y, 3);
 	CclGetPos(l, &maxPos.x, &maxPos.y, 4);
 
+	if (minPos.x > maxPos.x) {
+		std::swap(minPos.x, maxPos.x);
+	}
+	if (minPos.y > maxPos.y) {
+		std::swap(minPos.y, maxPos.y);
+	}
+
 	std::vector<CUnit *> units;
 
 	Select(minPos, maxPos, units);
diff --git a/src/stratagus/script_player.cpp b/src/stratagus/script_player.cpp
index 681f79aa6..20589a931 100644
--- a/src/stratagus/script_player.cpp
+++ b/src/stratagus/script_player.cpp
@@ -361,6 +361,13 @@ static int CclChangeUnitsOwner(lua_State *l)
     Vec2i pos2;
     CclGetPos(l, &pos1.x, &pos1.y, 1);
     CclGetPos(l, &pos2.x, &pos2.y, 2);
+	if (pos1.x > pos2.x) {
+		std::swap(pos1.x, pos2.x);
+	}
+	if (pos1.y > pos2.y) {
+		std::swap(pos1.y, pos2.y);
+	}
+
     const int oldp = LuaToNumber(l, 3);
     const int newp = LuaToNumber(l, 4);
     std::vector<CUnit *> table;
@@ -450,6 +457,12 @@ static int CclGiveUnitsToPlayer(lua_State *l)
 			Vec2i pos2;
 			CclGetPos(l, &pos1.x, &pos1.y, 3);
 			CclGetPos(l, &pos2.x, &pos2.y, 4);
+			if (pos1.x > pos2.x) {
+				std::swap(pos1.x, pos2.x);
+			}
+			if (pos1.y > pos2.y) {
+				std::swap(pos1.y, pos2.y);
+			}
 			if (any) {
 				Select(pos1, pos2, table, HasSamePlayerAs(Players[oldp]));
 			} else if (onlyUnits) {
diff --git a/src/unit/script_unit.cpp b/src/unit/script_unit.cpp
index 31cda4480..9d8d595dc 100644
--- a/src/unit/script_unit.cpp
+++ b/src/unit/script_unit.cpp
@@ -1024,6 +1024,12 @@ static int CclKillUnitAt(lua_State *l)
 	Vec2i pos2;
 	CclGetPos(l, &pos1.x, &pos1.y, 4);
 	CclGetPos(l, &pos2.x, &pos2.y, 5);
+	if (pos1.x > pos2.x) {
+		std::swap(pos1.x, pos2.x);
+	}
+	if (pos1.y > pos2.y) {
+		std::swap(pos1.y, pos2.y);
+	}
 
 	std::vector<CUnit *> table;