Index: code/parse/sexp.cpp
===================================================================
--- code/parse/sexp.cpp	(revision 9096)
+++ code/parse/sexp.cpp	(working copy)
@@ -6664,7 +6664,13 @@
 		case OSWPT_TYPE_WAYPOINT:
 		{
 			oswpt.objp->pos = target_vec;
-			set_object_for_clients(oswpt.objp);
+			oswpt.waypointp->set_pos(&target_vec);
+			multi_start_callback();
+			multi_send_int(OBJ_INDEX(oswpt.objp));
+			multi_send_float(target_vec.xyz.x);
+			multi_send_float(target_vec.xyz.y);
+			multi_send_float(target_vec.xyz.z);
+			multi_end_callback();		
 			return;
 		}
 
@@ -6693,6 +6699,24 @@
 	}
 }
 
+// only for waypoints cause they don't get transferred the normal way
+void multi_sexp_set_object_position()
+{
+	object *objp;
+	vec3d wp_vec;
+	int objnum;
+	multi_get_int(objnum);
+	multi_get_float(wp_vec.xyz.x);
+	multi_get_float(wp_vec.xyz.y);
+	multi_get_float(wp_vec.xyz.z);
+	objp = &Objects[objnum];
+	if (objp->type == OBJ_WAYPOINT) {
+		objp->pos = wp_vec;
+		waypoint *wpt = find_waypoint_with_objnum(OBJ_INDEX(objp));
+		wpt->set_pos(&wp_vec);
+	}
+}
+
 // Goober5000
 void sexp_set_object_orientation(int n) 
 {
@@ -22829,6 +22853,9 @@
 			case OP_SET_OBJECT_SPEED_Z:
 				multi_sexp_set_object_speed();
 				break;
+			case OP_SET_OBJECT_POSITION:
+				multi_sexp_set_object_position();
+				break;
 
 			// bad sexp in the packet
 			default: 
