changeset 6136:f05e23ab634f draft

(svn r8878) -Fix -Fix: Do a better job when checking the parameters of CmdMoveRailVehicle() NOTE: 0.5 candidate
author tron <tron@openttd.org>
date Sat, 24 Feb 2007 14:36:14 +0000
parents b7dd9b8d1c54
children 8b6c1572b707
files src/train_cmd.cpp
diffstat 1 files changed, 6 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -1007,13 +1007,15 @@
 
 	src = GetVehicle(s);
 
-	if (src->type != VEH_Train) return CMD_ERROR;
+	if (src->type != VEH_Train || !CheckOwnership(src->owner)) return CMD_ERROR;
 
 	// if nothing is selected as destination, try and find a matching vehicle to drag to.
 	if (d == INVALID_VEHICLE) {
 		dst = IsTrainEngine(src) ? NULL : FindGoodVehiclePos(src);
 	} else {
+		if (!IsValidVehicleID(d)) return CMD_ERROR;
 		dst = GetVehicle(d);
+		if (dst->type != VEH_Train || !CheckOwnership(dst->owner)) return CMD_ERROR;
 	}
 
 	// if an articulated part is being handled, deal with its parent vehicle
@@ -1025,17 +1027,15 @@
 	// don't move the same vehicle..
 	if (src == dst) return 0;
 
-	/* the player must be the owner */
-	if (!CheckOwnership(src->owner) || (dst != NULL && !CheckOwnership(dst->owner)))
-		return CMD_ERROR;
-
 	/* locate the head of the two chains */
 	src_head = GetFirstVehicleInChain(src);
-	dst_head = NULL;
 	if (dst != NULL) {
 		dst_head = GetFirstVehicleInChain(dst);
+		if (dst_head->tile != src_head->tile) return CMD_ERROR;
 		// Now deal with articulated part of destination wagon
 		dst = GetLastEnginePart(dst);
+	} else {
+		dst_head = NULL;
 	}
 
 	if (dst != NULL && IsMultiheaded(dst) && !IsTrainEngine(dst) && IsTrainWagon(src)) {
@@ -1092,8 +1092,6 @@
 				// check if all vehicles in the dest train are stopped.
 				dst_len = CheckTrainStoppedInDepot(dst_head);
 				if (dst_len < 0) return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
-
-				assert(dst_head->tile == src_head->tile);
 			}
 
 			// We are moving between rows, so only count the wagons from the source