Changeset ca44f82 in network-game for server/server.cpp


Ignore:
Timestamp:
Feb 24, 2013, 1:28:32 AM (12 years ago)
Author:
dportnoy <dmp1488@…>
Branches:
master
Children:
7b43385
Parents:
3a79253 (diff), 8f85180 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Updated files to correctly compile on Windows

File:
1 edited

Legend:

Unmodified
Added
Removed
  • server/server.cpp

    r3a79253 rca44f82  
    66#include <sstream>
    77#include <cstring>
     8#include <cmath>
    89
    910#include <vector>
     
    1415#include <netinet/in.h>
    1516#include <arpa/inet.h>
     17
     18#include <crypt.h>
    1619
    1720/*
     
    2427#include "../common/Common.h"
    2528#include "../common/Message.h"
     29#include "../common/WorldMap.h"
    2630#include "../common/Player.h"
    2731
     
    3034using namespace std;
    3135
    32 bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG &serverMsg);
    33 
    34 void updateUnusedId(unsigned int& id);
     36bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap, unsigned int& unusedId, NETWORK_MSG &serverMsg);
     37
     38void updateUnusedId(unsigned int& id, map<unsigned int, Player>& mapPlayers);
    3539
    3640// this should probably go somewhere in the common folder
     
    9498   NETWORK_MSG clientMsg, serverMsg;
    9599   map<unsigned int, Player> mapPlayers;
    96    unsigned int unusedId = 0;
     100   unsigned int unusedId = 1;
    97101
    98102   //SSL_load_error_strings();
     
    104108      exit(1);
    105109   }
     110
     111   WorldMap* gameMap = NULL; //WorldMap::createDefaultMap();
    106112 
    107113   sock = socket(AF_INET, SOCK_DGRAM, 0);
     
    127133         cout << "Got a message" << endl;
    128134
    129          broadcastResponse = processMessage(clientMsg, from, mapPlayers, unusedId, serverMsg);
    130 
     135         broadcastResponse = processMessage(clientMsg, from, mapPlayers, gameMap, unusedId, serverMsg);
     136
     137         // probably replace this with a function that prints based on the
     138         // message type
    131139         cout << "msg: " << serverMsg.buffer << endl;
    132 
     140         cout << "broadcastResponse: " << broadcastResponse << endl;
    133141         if (broadcastResponse)
    134142         {
     
    136144
    137145            map<unsigned int, Player>::iterator it;
    138 
    139146            for (it = mapPlayers.begin(); it != mapPlayers.end(); it++)
    140147            {
     
    151158         }
    152159
     160         // update player positions
     161         map<unsigned int, Player>::iterator it;
     162         for (it = mapPlayers.begin(); it != mapPlayers.end(); it++)
     163         {
     164            it->second.move();
     165         }
     166
    153167         broadcastPlayerPositions(mapPlayers, sock);
    154168      }
     
    158172}
    159173
    160 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG& serverMsg)
     174bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap, unsigned int& unusedId, NETWORK_MSG& serverMsg)
    161175{
    162176   DataAccess da;
     
    195209      case MSG_TYPE_LOGIN:
    196210      {
     211         cout << "Got login message" << endl;
     212
    197213         string username(clientMsg.buffer);
    198214         string password(strchr(clientMsg.buffer, '\0')+1);
    199          cout << "Player logging in: " << username << endl;
    200215
    201216         Player* p = da.getPlayer(username);
    202217
    203          if (p == NULL || p->password != password)
     218         if (p == NULL || !da.verifyPassword(password, p->password))
    204219         {
    205220            strcpy(serverMsg.buffer, "Incorrect username or password");
     
    212227         {
    213228            p->setAddr(from);
     229            updateUnusedId(unusedId, mapPlayers);
    214230            p->id = unusedId;
    215231            mapPlayers[unusedId] = *p;
    216             updateUnusedId(unusedId);
    217 
    218             strcpy(serverMsg.buffer, "Login successful. Enjoy chatting with other players.");
     232
     233            // sendd back the new player info to the user
     234            p->serialize(serverMsg.buffer);
    219235         }
    220236
     
    235251         {
    236252            strcpy(serverMsg.buffer, "That player is not logged in. This is either a bug, or you're trying to hack the server.");
     253            cout << "Player not logged in" << endl;
    237254         }
    238255         else if ( p->addr.sin_addr.s_addr != from.sin_addr.s_addr ||
     
    240257         {
    241258            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.");
     259            cout << "Player logged in using a different connection" << endl;
    242260         }
    243261         else
     
    247265            mapPlayers.erase(p->id);
    248266            strcpy(serverMsg.buffer, "You have successfully logged out.");
    249          }
     267            cout << "Player logged out successfuly" << endl;
     268         }
     269
     270         // should really be serverMsg.type = MSG_TYPE_LOGOUT;
     271         serverMsg.type = MSG_TYPE_LOGIN;
    250272
    251273         break;
     
    265287            broadcastResponse = true;
    266288
    267             stringstream ss;
    268             ss << p->name << ": " << clientMsg.buffer;
    269 
    270             strcpy(serverMsg.buffer, ss.str().c_str());
     289            ostringstream oss;
     290            oss << p->name << ": " << clientMsg.buffer;
     291
     292            strcpy(serverMsg.buffer, oss.str().c_str());
    271293         }     
    272294
     
    275297         break;
    276298      }
     299      case MSG_TYPE_PLAYER_MOVE:
     300      {
     301         cout << "Got a move message" << endl;
     302
     303         istringstream iss;
     304         iss.str(clientMsg.buffer);
     305
     306         cout << "PLAYER_MOVE" << endl;
     307
     308         int id, x, y;
     309
     310         memcpy(&id, clientMsg.buffer, 4);
     311         memcpy(&x, clientMsg.buffer+4, 4);
     312         memcpy(&y, clientMsg.buffer+8, 4);
     313         
     314         cout << "x: " << x << endl;
     315         cout << "y: " << y << endl;
     316         cout << "id: " << id << endl;
     317
     318         if ( mapPlayers[id].addr.sin_addr.s_addr == from.sin_addr.s_addr &&
     319              mapPlayers[id].addr.sin_port == from.sin_port )
     320         {
     321            // we need to make sure the player can move here
     322            if (0 <= x && x < 300 && 0 <= y && y < 300 &&
     323               gameMap->getElement(x/25, y/25) == WorldMap::TERRAIN_GRASS)
     324            {
     325               // first we get the correct vector
     326               mapPlayers[id].target.x = x;
     327               mapPlayers[id].target.y = y;
     328               int xDiff = mapPlayers[id].target.x - mapPlayers[id].pos.x;
     329               int yDiff = mapPlayers[id].target.y - mapPlayers[id].pos.y;
     330               cout << "xDiff: " << xDiff << endl;               
     331               cout << "yDiff: " << yDiff << endl;               
     332
     333               // then we get the correct angle
     334               double angle = atan2(yDiff, xDiff);
     335               cout << "angle: " << angle << endl;               
     336
     337               // finally we use the angle to determine
     338               // how much the player moves
     339               // the player will move 50 pixels in the correct direction
     340               mapPlayers[id].pos.x += cos(angle)*50;
     341               mapPlayers[id].pos.y += sin(angle)*50;
     342               cout << "new x: " << mapPlayers[id].pos.x << endl;               
     343               cout << "new y: " << mapPlayers[id].pos.y << endl;               
     344
     345               serverMsg.type = MSG_TYPE_PLAYER_MOVE;
     346               
     347               memcpy(serverMsg.buffer, &id, 4);
     348               memcpy(serverMsg.buffer+4, &mapPlayers[id].pos.x, 4);
     349               memcpy(serverMsg.buffer+8, &mapPlayers[id].pos.y, 4);
     350               //memcpy(serverMsg.buffer, clientMsg.buffer, 12);
     351
     352               broadcastResponse = true;
     353            }
     354            else
     355               cout << "Bad terrain detected" << endl;
     356         }
     357         else  // nned to send back a message indicating failure
     358            cout << "Player id (" << id << ") doesn't match sender" << endl;
     359
     360         break;
     361      }
    277362      default:
    278363      {
     
    285370   }
    286371
     372   cout << "Got to the end of the switch" << endl;
     373
    287374   return broadcastResponse;
    288375}
    289376
    290 void updateUnusedId(unsigned int& id)
    291 {
    292    id = 5;
    293 }
     377void updateUnusedId(unsigned int& id, map<unsigned int, Player>& mapPlayers)
     378{
     379   while (mapPlayers.find(id) != mapPlayers.end())
     380      id++;
     381}
Note: See TracChangeset for help on using the changeset viewer.