Index: server/server.cpp
===================================================================
--- server/server.cpp	(revision 3b8adee6ca0d66d59fd2b8970def1fb79f71ae5c)
+++ server/server.cpp	(revision 01d0d00fb7dee4cce49bbe592263e06a8f891060)
@@ -5,7 +5,8 @@
 #include <iostream>
 #include <sstream>
+#include <cstring>
+
 #include <vector>
-#include <algorithm>
-#include <cstring>
+#include <map>
 
 #include <sys/socket.h>
@@ -29,5 +30,7 @@
 using namespace std;
 
-bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, vector<Player> &vctPlayers, NETWORK_MSG &serverMsg);
+bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG &serverMsg);
+
+void updateUnusedId(unsigned int& id);
 
 // this should probably go somewhere in the common folder
@@ -38,12 +41,12 @@
 }
 
-Player *findPlayerByName(vector<Player> &vec, string name)
-{
-   vector<Player>::iterator it;
-
-   for (it = vec.begin(); it != vec.end(); it++)
-   {
-      if ( it->name.compare(name) == 0 )
-         return &(*it);
+Player *findPlayerByName(map<unsigned int, Player> &m, string name)
+{
+   map<unsigned int, Player>::iterator it;
+
+   for (it = m.begin(); it != m.end(); it++)
+   {
+      if ( it->second.name.compare(name) == 0 )
+         return &(it->second);
    }
 
@@ -51,13 +54,13 @@
 }
 
-Player *findPlayerByAddr(vector<Player> &vec, const sockaddr_in &addr)
-{
-   vector<Player>::iterator it;
-
-   for (it = vec.begin(); it != vec.end(); it++)
-   {
-      if ( it->addr.sin_addr.s_addr == addr.sin_addr.s_addr &&
-           it->addr.sin_port == addr.sin_port )
-         return &(*it);
+Player *findPlayerByAddr(map<unsigned int, Player> &m, const sockaddr_in &addr)
+{
+   map<unsigned int, Player>::iterator it;
+
+   for (it = m.begin(); it != m.end(); it++)
+   {
+      if ( it->second.addr.sin_addr.s_addr == addr.sin_addr.s_addr &&
+           it->second.addr.sin_port == addr.sin_port )
+         return &(it->second);
    }
 
@@ -65,18 +68,18 @@
 }
 
-void broadcastPlayerPositions(vector<Player> &vec, int sock)
-{
-   vector<Player>::iterator it, it2;
+void broadcastPlayerPositions(map<unsigned int, Player> &m, int sock)
+{
+   map<unsigned int, Player>::iterator it, it2;
    NETWORK_MSG serverMsg;
 
    serverMsg.type = MSG_TYPE_PLAYER;   
 
-   for (it = vec.begin(); it != vec.end(); it++)
-   {
-      it->serialize(serverMsg.buffer);
-
-      for (it2 = vec.begin(); it2 != vec.end(); it2++)
-      {
-         if ( sendMessage(&serverMsg, sock, &(it2->addr)) < 0 )
+   for (it = m.begin(); it != m.end(); it++)
+   {
+      it->second.serialize(serverMsg.buffer);
+
+      for (it2 = m.begin(); it2 != m.end(); it2++)
+      {
+         if ( sendMessage(&serverMsg, sock, &(it2->second.addr)) < 0 )
             error("sendMessage");
       }
@@ -90,5 +93,6 @@
    struct sockaddr_in from; // info of client sending the message
    NETWORK_MSG clientMsg, serverMsg;
-   vector<Player> vctPlayers;
+   map<unsigned int, Player> mapPlayers;
+   unsigned int unusedId = 0;
 
    //SSL_load_error_strings();
@@ -123,5 +127,5 @@
          cout << "Got a message" << endl;
 
-         broadcastResponse = processMessage(clientMsg, from, vctPlayers, serverMsg);
+         broadcastResponse = processMessage(clientMsg, from, mapPlayers, unusedId, serverMsg);
 
          cout << "msg: " << serverMsg.buffer << endl;
@@ -131,9 +135,9 @@
             cout << "Should be broadcasting the message" << endl;
 
-            vector<Player>::iterator it;
-
-            for (it = vctPlayers.begin(); it != vctPlayers.end(); it++)
+            map<unsigned int, Player>::iterator it;
+
+            for (it = mapPlayers.begin(); it != mapPlayers.end(); it++)
             {
-               if ( sendMessage(&serverMsg, sock, &(it->addr)) < 0 )
+               if ( sendMessage(&serverMsg, sock, &(it->second.addr)) < 0 )
                   error("sendMessage");
             }
@@ -147,5 +151,5 @@
          }
 
-         broadcastPlayerPositions(vctPlayers, sock);
+         broadcastPlayerPositions(mapPlayers, sock);
       }
    }
@@ -154,5 +158,5 @@
 }
 
-bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, vector<Player> &vctPlayers, NETWORK_MSG &serverMsg)
+bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG& serverMsg)
 {
    DataAccess da;
@@ -201,5 +205,5 @@
             strcpy(serverMsg.buffer, "Incorrect username or password");
          }
-         else if(findPlayerByName(vctPlayers, username) != NULL)
+         else if(findPlayerByName(mapPlayers, username) != NULL)
          {
             strcpy(serverMsg.buffer, "Player has already logged in.");
@@ -207,8 +211,9 @@
          else
          {
-            Player newP(username, "");
-            newP.setAddr(from);
-
-            vctPlayers.push_back(newP);
+            p->setAddr(from);
+            p->id = unusedId;
+            mapPlayers[unusedId] = *p;
+            updateUnusedId(unusedId);
+
             strcpy(serverMsg.buffer, "Login successful. Enjoy chatting with other players.");
          }
@@ -225,5 +230,5 @@
          cout << "Player logging out: " << name << endl;
 
-         Player *p = findPlayerByName(vctPlayers, name);
+         Player *p = findPlayerByName(mapPlayers, name);
 
          if (p == NULL)
@@ -231,6 +236,6 @@
             strcpy(serverMsg.buffer, "That player is not logged in. This is either a bug, or you're trying to hack the server.");
          }
-         else if( p->addr.sin_addr.s_addr != from.sin_addr.s_addr ||
-                  p->addr.sin_port != from.sin_port )
+         else if ( p->addr.sin_addr.s_addr != from.sin_addr.s_addr ||
+                   p->addr.sin_port != from.sin_port )
          {
             strcpy(serverMsg.buffer, "That player is logged in using a differemt connection. This is either a bug, or you're trying to hack the server.");
@@ -238,5 +243,7 @@
          else
          {
-            vctPlayers.erase((vector<Player>::iterator)p);
+            if (p->id < unusedId)
+               unusedId = p->id;
+            mapPlayers.erase(p->id);
             strcpy(serverMsg.buffer, "You have successfully logged out.");
          }
@@ -248,5 +255,5 @@
          cout << "Got a chat message" << endl;
 
-         Player *p = findPlayerByAddr(vctPlayers, from);
+         Player *p = findPlayerByAddr(mapPlayers, from);
 
          if (p == NULL)
@@ -281,2 +288,6 @@
 }
 
+void updateUnusedId(unsigned int& id)
+{
+   id = 5;
+}
