Changeset ca44f82 in network-game for server/server.cpp
- Timestamp:
- Feb 24, 2013, 1:28:32 AM (12 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
server/server.cpp
r3a79253 rca44f82 6 6 #include <sstream> 7 7 #include <cstring> 8 #include <cmath> 8 9 9 10 #include <vector> … … 14 15 #include <netinet/in.h> 15 16 #include <arpa/inet.h> 17 18 #include <crypt.h> 16 19 17 20 /* … … 24 27 #include "../common/Common.h" 25 28 #include "../common/Message.h" 29 #include "../common/WorldMap.h" 26 30 #include "../common/Player.h" 27 31 … … 30 34 using namespace std; 31 35 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 );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); 35 39 36 40 // this should probably go somewhere in the common folder … … 94 98 NETWORK_MSG clientMsg, serverMsg; 95 99 map<unsigned int, Player> mapPlayers; 96 unsigned int unusedId = 0;100 unsigned int unusedId = 1; 97 101 98 102 //SSL_load_error_strings(); … … 104 108 exit(1); 105 109 } 110 111 WorldMap* gameMap = NULL; //WorldMap::createDefaultMap(); 106 112 107 113 sock = socket(AF_INET, SOCK_DGRAM, 0); … … 127 133 cout << "Got a message" << endl; 128 134 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 131 139 cout << "msg: " << serverMsg.buffer << endl; 132 140 cout << "broadcastResponse: " << broadcastResponse << endl; 133 141 if (broadcastResponse) 134 142 { … … 136 144 137 145 map<unsigned int, Player>::iterator it; 138 139 146 for (it = mapPlayers.begin(); it != mapPlayers.end(); it++) 140 147 { … … 151 158 } 152 159 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 153 167 broadcastPlayerPositions(mapPlayers, sock); 154 168 } … … 158 172 } 159 173 160 bool processMessage(const NETWORK_MSG& clientMsg, const struct sockaddr_in& from, map<unsigned int, Player>& mapPlayers, unsigned int& unusedId, NETWORK_MSG& serverMsg)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) 161 175 { 162 176 DataAccess da; … … 195 209 case MSG_TYPE_LOGIN: 196 210 { 211 cout << "Got login message" << endl; 212 197 213 string username(clientMsg.buffer); 198 214 string password(strchr(clientMsg.buffer, '\0')+1); 199 cout << "Player logging in: " << username << endl;200 215 201 216 Player* p = da.getPlayer(username); 202 217 203 if (p == NULL || p->password != password)218 if (p == NULL || !da.verifyPassword(password, p->password)) 204 219 { 205 220 strcpy(serverMsg.buffer, "Incorrect username or password"); … … 212 227 { 213 228 p->setAddr(from); 229 updateUnusedId(unusedId, mapPlayers); 214 230 p->id = unusedId; 215 231 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); 219 235 } 220 236 … … 235 251 { 236 252 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; 237 254 } 238 255 else if ( p->addr.sin_addr.s_addr != from.sin_addr.s_addr || … … 240 257 { 241 258 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; 242 260 } 243 261 else … … 247 265 mapPlayers.erase(p->id); 248 266 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; 250 272 251 273 break; … … 265 287 broadcastResponse = true; 266 288 267 stringstreamss;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()); 271 293 } 272 294 … … 275 297 break; 276 298 } 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 } 277 362 default: 278 363 { … … 285 370 } 286 371 372 cout << "Got to the end of the switch" << endl; 373 287 374 return broadcastResponse; 288 375 } 289 376 290 void updateUnusedId(unsigned int& id) 291 { 292 id = 5; 293 } 377 void 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.