Changes in server/server.cpp [8f85180:01d0d00] in network-game
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
server/server.cpp
r8f85180 r01d0d00 6 6 #include <sstream> 7 7 #include <cstring> 8 #include <cmath>9 8 10 9 #include <vector> … … 15 14 #include <netinet/in.h> 16 15 #include <arpa/inet.h> 17 18 #include <crypt.h>19 16 20 17 /* … … 27 24 #include "../common/Common.h" 28 25 #include "../common/Message.h" 29 #include "../common/WorldMap.h"30 26 #include "../common/Player.h" 31 27 … … 34 30 using namespace std; 35 31 36 bool processMessage(const NETWORK_MSG &clientMsg, const struct sockaddr_in &from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap,unsigned int& unusedId, NETWORK_MSG &serverMsg);37 38 void updateUnusedId(unsigned int& id , map<unsigned int, Player>& mapPlayers);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); 39 35 40 36 // this should probably go somewhere in the common folder … … 98 94 NETWORK_MSG clientMsg, serverMsg; 99 95 map<unsigned int, Player> mapPlayers; 100 unsigned int unusedId = 1;96 unsigned int unusedId = 0; 101 97 102 98 //SSL_load_error_strings(); … … 108 104 exit(1); 109 105 } 110 111 WorldMap* gameMap = NULL; //WorldMap::createDefaultMap();112 106 113 107 sock = socket(AF_INET, SOCK_DGRAM, 0); … … 133 127 cout << "Got a message" << endl; 134 128 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 129 broadcastResponse = processMessage(clientMsg, from, mapPlayers, unusedId, serverMsg); 130 139 131 cout << "msg: " << serverMsg.buffer << endl; 140 cout << "broadcastResponse: " << broadcastResponse << endl; 132 141 133 if (broadcastResponse) 142 134 { … … 144 136 145 137 map<unsigned int, Player>::iterator it; 138 146 139 for (it = mapPlayers.begin(); it != mapPlayers.end(); it++) 147 140 { … … 158 151 } 159 152 160 // update player positions161 map<unsigned int, Player>::iterator it;162 for (it = mapPlayers.begin(); it != mapPlayers.end(); it++)163 {164 it->second.move();165 }166 167 153 broadcastPlayerPositions(mapPlayers, sock); 168 154 } … … 172 158 } 173 159 174 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, WorldMap* gameMap,unsigned int& unusedId, NETWORK_MSG& serverMsg)160 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG& serverMsg) 175 161 { 176 162 DataAccess da; … … 209 195 case MSG_TYPE_LOGIN: 210 196 { 211 cout << "Got login message" << endl;212 213 197 string username(clientMsg.buffer); 214 198 string password(strchr(clientMsg.buffer, '\0')+1); 199 cout << "Player logging in: " << username << endl; 215 200 216 201 Player* p = da.getPlayer(username); 217 202 218 if (p == NULL || !da.verifyPassword(password, p->password))203 if (p == NULL || p->password != password) 219 204 { 220 205 strcpy(serverMsg.buffer, "Incorrect username or password"); … … 227 212 { 228 213 p->setAddr(from); 229 updateUnusedId(unusedId, mapPlayers);230 214 p->id = unusedId; 231 215 mapPlayers[unusedId] = *p; 232 233 // sendd back the new player info to the user 234 p->serialize(serverMsg.buffer);216 updateUnusedId(unusedId); 217 218 strcpy(serverMsg.buffer, "Login successful. Enjoy chatting with other players."); 235 219 } 236 220 … … 251 235 { 252 236 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;254 237 } 255 238 else if ( p->addr.sin_addr.s_addr != from.sin_addr.s_addr || … … 257 240 { 258 241 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;260 242 } 261 243 else … … 265 247 mapPlayers.erase(p->id); 266 248 strcpy(serverMsg.buffer, "You have successfully logged out."); 267 cout << "Player logged out successfuly" << endl; 268 } 269 270 // should really be serverMsg.type = MSG_TYPE_LOGOUT; 271 serverMsg.type = MSG_TYPE_LOGIN; 249 } 272 250 273 251 break; … … 287 265 broadcastResponse = true; 288 266 289 ostringstream oss;290 oss << p->name << ": " << clientMsg.buffer;291 292 strcpy(serverMsg.buffer, oss.str().c_str());267 stringstream ss; 268 ss << p->name << ": " << clientMsg.buffer; 269 270 strcpy(serverMsg.buffer, ss.str().c_str()); 293 271 } 294 272 … … 297 275 break; 298 276 } 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 here322 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 vector326 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 angle334 double angle = atan2(yDiff, xDiff);335 cout << "angle: " << angle << endl;336 337 // finally we use the angle to determine338 // how much the player moves339 // the player will move 50 pixels in the correct direction340 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 else355 cout << "Bad terrain detected" << endl;356 }357 else // nned to send back a message indicating failure358 cout << "Player id (" << id << ") doesn't match sender" << endl;359 360 break;361 }362 277 default: 363 278 { … … 370 285 } 371 286 372 cout << "Got to the end of the switch" << endl;373 374 287 return broadcastResponse; 375 288 } 376 289 377 void updateUnusedId(unsigned int& id, map<unsigned int, Player>& mapPlayers) 378 { 379 while (mapPlayers.find(id) != mapPlayers.end()) 380 id++; 381 } 290 void updateUnusedId(unsigned int& id) 291 { 292 id = 5; 293 }
Note:
See TracChangeset
for help on using the changeset viewer.