Index: server/server.cpp
===================================================================
--- server/server.cpp	(revision b07eeac0258a8440bdd8dfc2331130f1c005ba4b)
+++ server/server.cpp	(revision e487381875396bdaf64765cbdc022477e1238ac0)
@@ -161,8 +161,8 @@
                }
 
-               vector<WorldMap::Object> vctObjects = gameMap->getObjects();
+               vector<WorldMap::Object>* vctObjects = gameMap->getObjects();
                vector<WorldMap::Object>::iterator itObjects;
 
-               for (itObjects = vctObjects.begin(); itObjects != vctObjects.end(); itObjects++) {
+               for (itObjects = vctObjects->begin(); itObjects != vctObjects->end();) {
                   POSITION pos = itObjects->pos;
                   if (posDistance(it->second.pos, pos.toFloat()) < 10) {
@@ -180,5 +180,4 @@
                      }
 
-                     // send a MSG_TYPE_REMOVE_OBJECT message
                      serverMsg.type = MSG_TYPE_REMOVE_OBJECT;
                      memcpy(serverMsg.buffer, &itObjects->id, 4);
@@ -190,5 +189,12 @@
                            error("sendMessage");
                      }
+
+                     // remove the object form the server-side map
+                     cout << "size before: " << gameMap->getObjects()->size() << endl;
+                     itObjects = vctObjects->erase(itObjects);
+                     cout << "size after: " << gameMap->getObjects()->size() << endl;
                   }
+                  else
+                     itObjects++;
                }
 
@@ -323,8 +329,8 @@
             // (currently just the flags)
             serverMsg.type = MSG_TYPE_OBJECT;
-            vector<WorldMap::Object> vctObjects = gameMap->getObjects();
+            vector<WorldMap::Object>* vctObjects = gameMap->getObjects();
             vector<WorldMap::Object>::iterator itObjects;
             cout << "sending items" << endl;
-            for (itObjects = vctObjects.begin(); itObjects != vctObjects.end(); itObjects++) {
+            for (itObjects = vctObjects->begin(); itObjects != vctObjects->end(); itObjects++) {
                itObjects->serialize(serverMsg.buffer);
                cout << "sending item id " << itObjects->id  << endl;
@@ -408,7 +414,4 @@
       case MSG_TYPE_PLAYER_MOVE:
       {
-         istringstream iss;
-         iss.str(clientMsg.buffer);
-
          cout << "PLAYER_MOVE" << endl;
 
@@ -451,4 +454,44 @@
          break;
       }
+      case MSG_TYPE_DROP_FLAG:
+      {
+         // may want to check the id matches the sender, just like for PLAYER_NOVE
+         cout << "DROP_FLAG" << endl;
+
+         int id;
+
+         memcpy(&id, clientMsg.buffer, 4);
+         cout << "id: " << id << endl;
+
+         WorldMap::ObjectType flagType = WorldMap::OBJECT_NONE;
+         if (mapPlayers[id].hasBlueFlag)
+            flagType = WorldMap::OBJECT_BLUE_FLAG;
+         else if (mapPlayers[id].hasRedFlag)
+            flagType = WorldMap::OBJECT_RED_FLAG;
+
+         gameMap->addObject(flagType, mapPlayers[id].pos.x, mapPlayers[id].pos.y);
+
+         // need to send the OBJECT message too
+         serverMsg.type = MSG_TYPE_OBJECT;
+         gameMap->getObjects()->back().serialize(serverMsg.buffer);
+
+         map<unsigned int, Player>::iterator it;
+         for (it = mapPlayers.begin(); it != mapPlayers.end(); it++)
+         {
+            if ( sendMessage(&serverMsg, sock, &(it->second.addr)) < 0 )
+               error("sendMessage");
+         }
+
+         mapPlayers[id].hasBlueFlag = false;
+         mapPlayers[id].hasRedFlag = false;
+
+         serverMsg.type = MSG_TYPE_PLAYER;
+         mapPlayers[id].serialize(serverMsg.buffer);
+
+         map<unsigned int, Player>::iterator it2;
+         broadcastResponse = true;
+
+         break;
+      }
       default:
       {
