Changes in / [3a79253:ca44f82] in network-game
- Files:
-
- 3 added
- 4 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
client/Client/Client.vcxproj
r3a79253 rca44f82 47 47 <GenerateDebugInformation>true</GenerateDebugInformation> 48 48 <AdditionalLibraryDirectories>c:\allegro\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> 49 <AdditionalDependencies>allegro-5.0. 7-monolith-md-debug.lib;%(AdditionalDependencies)</AdditionalDependencies>49 <AdditionalDependencies>allegro-5.0.8-monolith-md-debug.lib;%(AdditionalDependencies)</AdditionalDependencies> 50 50 </Link> 51 51 </ItemDefinitionGroup> … … 65 65 <ItemGroup> 66 66 <ClCompile Include="..\..\common\Common.cpp" /> 67 <ClCompile Include="..\..\common\WorldMap.cpp" /> 67 68 <ClCompile Include="..\..\common\Message.cpp" /> 68 69 <ClCompile Include="..\..\common\Player.cpp" /> … … 77 78 <ClInclude Include="..\..\common\Common.h" /> 78 79 <ClInclude Include="..\..\common\Compiler.h" /> 80 <ClInclude Include="..\..\common\WorldMap.h" /> 79 81 <ClInclude Include="..\..\common\Message.h" /> 80 82 <ClInclude Include="..\..\common\Player.h" /> -
client/Client/Client.vcxproj.filters
r3a79253 rca44f82 55 55 <Filter>Source Files\common</Filter> 56 56 </ClCompile> 57 <ClCompile Include="..\..\common\WorldMap.cpp"> 58 <Filter>Source Files\common</Filter> 59 </ClCompile> 57 60 </ItemGroup> 58 61 <ItemGroup> … … 84 87 <Filter>Header Files\common</Filter> 85 88 </ClInclude> 89 <ClInclude Include="..\..\common\WorldMap.h"> 90 <Filter>Header Files\common</Filter> 91 </ClInclude> 86 92 </ItemGroup> 87 93 <ItemGroup> -
client/Client/main.cpp
r3a79253 rca44f82 14 14 15 15 #include <sys/types.h> 16 #include < stdio.h>17 #include < stdlib.h>16 #include <cstdio> 17 #include <cstdlib> 18 18 #include <string> 19 19 #include <iostream> 20 #include <sstream> 21 22 #include <map> 20 23 21 24 #include <map> … … 24 27 #include <allegro5/allegro_font.h> 25 28 #include <allegro5/allegro_ttf.h> 29 #include <allegro5/allegro_primitives.h> 26 30 27 31 #include "../../common/Message.h" 28 32 #include "../../common/Common.h" 33 #include "../../common/WorldMap.h" 29 34 #include "../../common/Player.h" 30 35 … … 42 47 void initWinSock(); 43 48 void shutdownWinSock(); 44 void processMessage(NETWORK_MSG &msg, int &state, chat &chatConsole); 49 void processMessage(NETWORK_MSG &msg, int &state, chat &chatConsole, map<unsigned int, Player>& mapPlayers, unsigned int& curPlayerId); 50 void drawMap(WorldMap* gameMap); 51 void drawPlayers(map<unsigned int, Player>& mapPlayers, unsigned int curPlayerId); 52 POSITION screenToMap(POSITION pos); 53 POSITION mapToScreen(POSITION pos); 45 54 46 55 // callbacks … … 99 108 bool redraw = true; 100 109 doexit = false; 110 map<unsigned int, Player> mapPlayers; 111 unsigned int curPlayerId = -1; 101 112 102 113 float bouncer_x = SCREEN_W / 2.0 - BOUNCER_SIZE / 2.0; … … 110 121 } 111 122 112 al_init_primitives_addon(); 123 if (al_init_primitives_addon()) 124 cout << "Primitives initialized" << endl; 125 else 126 cout << "Primitives not initialized" << endl; 127 113 128 al_init_font_addon(); 114 129 al_init_ttf_addon(); 115 130 116 ALLEGRO_FONT *font = al_load_ttf_font("../pirulen.ttf", 12, 0); 117 131 #if defined WINDOWS 132 ALLEGRO_FONT *font = al_load_ttf_font("../pirulen.ttf", 12, 0); 133 #elif defined LINUX 134 ALLEGRO_FONT *font = al_load_ttf_font("pirulen.ttf", 12, 0); 135 #endif 136 118 137 if (!font) { 119 138 fprintf(stderr, "Could not load 'pirulen.ttf'.\n"); … … 144 163 return -1; 145 164 } 165 166 WorldMap* gameMap = WorldMap::loadMapFromFile("../../data/map.txt"); 167 //delete gameMap; 168 //gameMap = WorldMap::createDefaultMap(); 146 169 147 170 wndLogin = new Window(0, 0, SCREEN_W, SCREEN_H); … … 291 314 } 292 315 } 316 else if(ev.type == ALLEGRO_EVENT_MOUSE_BUTTON_UP) { 317 if(wndCurrent == wndMain) { 318 msgTo.type = MSG_TYPE_PLAYER_MOVE; 319 320 POSITION pos; 321 pos.x = ev.mouse.x; 322 pos.y = ev.mouse.y; 323 pos = screenToMap(pos); 324 325 if (pos.x != -1) 326 { 327 memcpy(msgTo.buffer, &curPlayerId, 4); 328 memcpy(msgTo.buffer+4, &pos.x, 4); 329 memcpy(msgTo.buffer+8, &pos.y, 4); 330 331 sendMessage(&msgTo, sock, &server); 332 } 333 else 334 cout << "Invalid point: User did not click on the map" << endl; 335 } 336 } 293 337 294 338 if (receiveMessage(&msgFrom, sock, &from) >= 0) 295 339 { 296 processMessage(msgFrom, state, chatConsole );340 processMessage(msgFrom, state, chatConsole, mapPlayers, curPlayerId); 297 341 cout << "state: " << state << endl; 298 342 } … … 301 345 { 302 346 redraw = false; 303 347 304 348 wndCurrent->draw(display); 305 306 al_draw_bitmap(bouncer, bouncer_x, bouncer_y, 0);307 349 308 350 chatConsole.draw(font, al_map_rgb(255,255,255)); … … 314 356 else if(wndCurrent == wndMain) { 315 357 al_draw_text(font, al_map_rgb(0, 255, 0), 4, 43, ALLEGRO_ALIGN_LEFT, "Message:"); 358 359 drawMap(gameMap); 360 drawPlayers(mapPlayers, curPlayerId); 316 361 } 317 362 … … 330 375 delete wndLogin; 331 376 delete wndMain; 377 378 delete gameMap; 332 379 333 380 al_destroy_event_queue(event_queue); … … 372 419 } 373 420 374 void processMessage(NETWORK_MSG &msg, int &state, chat &chatConsole) 421 POSITION screenToMap(POSITION pos) 422 { 423 pos.x = pos.x-300; 424 pos.y = pos.y-100; 425 426 if (pos.x < 0 || pos.y < 0) 427 { 428 pos.x = -1; 429 pos.y = -1; 430 } 431 432 return pos; 433 } 434 435 POSITION mapToScreen(POSITION pos) 436 { 437 pos.x = pos.x+300; 438 pos.y = pos.y+100; 439 440 return pos; 441 } 442 443 POSITION mapToScreen(FLOAT_POSITION pos) 444 { 445 POSITION p; 446 p.x = pos.x+300; 447 p.y = pos.y+100; 448 449 return p; 450 } 451 452 void processMessage(NETWORK_MSG &msg, int &state, chat &chatConsole, map<unsigned int, Player>& mapPlayers, unsigned int& curPlayerId) 375 453 { 376 454 string response = string(msg.buffer); … … 383 461 { 384 462 cout << "In STATE_START" << endl; 385 386 chatConsole.addLine(response);387 463 388 464 switch(msg.type) … … 408 484 state = STATE_LOGIN; 409 485 wndCurrent = wndMain; 410 cout << "User login successful" << endl; 486 487 Player p("", ""); 488 p.deserialize(msg.buffer); 489 mapPlayers[p.id] = p; 490 curPlayerId = p.id; 491 492 cout << "Got a valid login response with the player" << endl; 493 cout << "Player id: " << curPlayerId << endl; 411 494 } 495 412 496 break; 413 497 } … … 418 502 case STATE_LOGIN: 419 503 { 420 chatConsole.addLine(response); 421 422 switch(msg.type) 504 switch(msg.type) 423 505 { 424 506 case MSG_TYPE_REGISTER: … … 428 510 case MSG_TYPE_LOGIN: 429 511 { 512 chatConsole.addLine(response); 513 430 514 if (response.compare("You have successfully logged out.") == 0) 431 515 { … … 448 532 449 533 cout << "p.id: " << p.id << endl; 450 cout << "p.name: " << p.name << endl;451 cout << "p.pos.x: " << p.pos.x << endl;452 cout << "p.pos.y: " << p.pos.y << endl;453 534 454 535 break; 455 536 } 456 } 457 537 case MSG_TYPE_CHAT: 538 { 539 chatConsole.addLine(response); 540 541 break; 542 } 543 } 544 458 545 break; 459 546 } … … 467 554 } 468 555 556 void drawMap(WorldMap* gameMap) 557 { 558 POSITION mapPos; 559 mapPos.x = 0; 560 mapPos.y = 0; 561 mapPos = mapToScreen(mapPos); 562 for (int x=0; x<12; x++) 563 { 564 for (int y=0; y<12; y++) 565 { 566 WorldMap::TerrainType el = gameMap->getElement(x, y); 567 568 if (el == WorldMap::TERRAIN_GRASS) 569 al_draw_filled_rectangle(x*25+mapPos.x, y*25+mapPos.y, x*25+25+mapPos.x, y*25+25+mapPos.y, al_map_rgb(0, 255, 0)); 570 else if (el == WorldMap::TERRAIN_OCEAN) 571 al_draw_filled_rectangle(x*25+mapPos.x, y*25+mapPos.y, x*25+25+mapPos.x, y*25+25+mapPos.y, al_map_rgb(0, 0, 255)); 572 else if (el == WorldMap::TERRAIN_ROCK) 573 al_draw_filled_rectangle(x*25+mapPos.x, y*25+mapPos.y, x*25+25+mapPos.x, y*25+25+mapPos.y, al_map_rgb(100, 100, 0)); 574 } 575 } 576 } 577 578 void drawPlayers(map<unsigned int, Player>& mapPlayers, unsigned int curPlayerId) 579 { 580 map<unsigned int, Player>::iterator it; 581 582 Player* p; 583 POSITION pos; 584 585 for(it = mapPlayers.begin(); it != mapPlayers.end(); it++) 586 { 587 p = &it->second; 588 pos = mapToScreen(p->pos); 589 590 if (p->id == curPlayerId) 591 al_draw_filled_circle(pos.x, pos.y, 12, al_map_rgb(255, 0, 0)); 592 else 593 al_draw_filled_circle(pos.x, pos.y, 12, al_map_rgb(191, 0, 0)); 594 } 595 } 596 469 597 void registerAccount() 470 598 { -
client/makefile
r3a79253 rca44f82 3 3 FLAGS = $(LIB_FLAGS) 4 4 COMMON_PATH = ../common 5 DEPENDENCIES = Message.o Player.o chat.o GuiComponent.o Window.o Textbox.o Button.o5 DEPENDENCIES = Common.o Message.o Player.o chat.o GuiComponent.o Window.o Textbox.o Button.o 6 6 7 7 gameClient : Client/main.cpp $(DEPENDENCIES) 8 8 $(CC) -o $@ $+ $(FLAGS) 9 10 Common.o : $(COMMON_PATH)/Common.cpp 11 $(CC) -c -o $@ $? $(FLAGS) 9 12 10 13 Message.o : $(COMMON_PATH)/Message.cpp -
common/Common.cpp
r3a79253 rca44f82 1 1 #include "Common.h" 2 3 #include <iostream> 4 using namespace std; 5 6 #if defined WINDOWS 7 #include <Windows.h> 8 #elif defined LINUX 9 #include <time.h> 10 #endif 2 11 3 12 void set_nonblock(int sock) … … 13 22 #endif 14 23 } 24 25 unsigned long long getCurrentMillis() 26 { 27 unsigned long long numMilliseconds; 28 29 #if defined WINDOWS 30 numMilliseconds = GetTickCount(); 31 #elif defined LINUX 32 timespec curTime; 33 clock_gettime(CLOCK_REALTIME, &curTime); 34 35 numMilliseconds = curTime.tv_sec*(unsigned long long)1000+curTime.tv_nsec/(unsigned long long)1000000; 36 #endif 37 38 return numMilliseconds; 39 } -
common/Common.h
r3a79253 rca44f82 13 13 14 14 void set_nonblock(int sock); 15 unsigned long long getCurrentMillis(); 15 16 16 17 typedef struct … … 18 19 int x; 19 20 int y; 20 } PLAYER_POS; 21 } POSITION; 22 23 typedef struct 24 { 25 float x; 26 float y; 27 } FLOAT_POSITION; 21 28 22 29 #endif -
common/Message.cpp
r3a79253 rca44f82 11 11 #endif 12 12 13 #include <iostream> 14 15 using namespace std; 16 13 17 int sendMessage(NETWORK_MSG *msg, int sock, struct sockaddr_in *dest) 14 18 { 15 return sendto(sock, (char*)msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)dest, sizeof(struct sockaddr_in)); 19 int ret = sendto(sock, (char*)msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)dest, sizeof(struct sockaddr_in)); 20 21 cout << "Sent message of type " << msg->type << endl; 22 23 return ret; 16 24 } 17 25 … … 21 29 22 30 // assume we don't care about the value of socklen 23 return recvfrom(sock, (char*)msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)dest, &socklen); 31 int ret = recvfrom(sock, (char*)msg, sizeof(NETWORK_MSG), 0, (struct sockaddr *)dest, &socklen); 32 33 if (ret > -1) 34 cout << "Received message of type " << msg->type << endl; 35 36 return ret; 24 37 } -
common/Message.h
r3a79253 rca44f82 6 6 #define MSG_TYPE_LOGOUT 3 7 7 #define MSG_TYPE_CHAT 4 8 #define MSG_TYPE_PLAYER 5 8 #define MSG_TYPE_PLAYER 5 // server sends this to update player positions 9 #define MSG_TYPE_PLAYER_MOVE 6 // client sends this when a player wants to move 9 10 10 11 typedef struct -
common/Player.cpp
r3a79253 rca44f82 4 4 #include <sstream> 5 5 #include <cstring> 6 #include <cmath> 6 7 7 8 using namespace std; … … 12 13 this->name = ""; 13 14 this->password = ""; 14 this->pos.x = 0; 15 this->pos.y = 0; 15 this->pos.x = this->target.x = 0; 16 this->pos.y = this->target.y = 0; 17 this->timeLastUpdated = 0; 16 18 } 17 19 … … 23 25 this->pos.x = p.pos.x; 24 26 this->pos.y = p.pos.y; 27 this->target.x = p.target.x; 28 this->target.y = p.target.y; 25 29 this->addr = p.addr; 26 30 } … … 31 35 this->name = name; 32 36 this->password = password; 33 this->pos.x = 200;34 this->pos.y = 200;37 this->pos.x = this->target.x = 200; 38 this->pos.y = this->target.y = 200; 35 39 } 36 40 … … 40 44 this->name = name; 41 45 this->password = ""; 42 this->pos.x = 200;43 this->pos.y = 200;46 this->pos.x = this->target.x = 200; 47 this->pos.y = this->target.y = 200; 44 48 this->addr = addr; 45 49 } … … 51 55 void Player::serialize(char* buffer) 52 56 { 53 ostringstream oss; 54 55 oss.write((char*)&(this->id), sizeof(int)); 56 oss << this->name; 57 oss.write("\0", 1); 58 oss.write((char*)&(this->pos.x), sizeof(int)); 59 oss.write((char*)&(this->pos.y), sizeof(int)); 60 61 memcpy(buffer, oss.str().c_str(), this->name.length()+1+2*sizeof(int)); 57 memcpy(buffer, &this->id, 4); 58 memcpy(buffer+4, &this->pos.x, 4); 59 memcpy(buffer+8, &this->pos.y, 4); 60 memcpy(buffer+12, &this->target.x, 4); 61 memcpy(buffer+16, &this->target.y, 4); 62 strcpy(buffer+20, this->name.c_str()); 62 63 } 63 64 64 65 void Player::deserialize(char* buffer) 65 66 { 66 istringstream iss; 67 iss.str(buffer); 67 memcpy(&this->id, buffer, 4); 68 memcpy(&this->pos.x, buffer+4, 4); 69 memcpy(&this->pos.y, buffer+8, 4); 70 memcpy(&this->target.x, buffer+12, 4); 71 memcpy(&this->target.y, buffer+16, 4); 72 this->name.assign(buffer+20); 68 73 69 iss.read((char*)&(this->id), sizeof(int)); 70 iss >> this->name; 71 iss.read((char*)&(this->pos.x), sizeof(int)); 72 iss.read((char*)&(this->pos.y), sizeof(int)); 74 cout << "id: " << this->id << endl; 75 cout << "pos x: " << this->pos.x << endl; 76 cout << "pos y: " << this->pos.y << endl; 77 cout << "target x: " << this->target.x << endl; 78 cout << "target y: " << this->target.y << endl; 79 cout << "name: " << this->name << endl; 73 80 } 74 81 … … 82 89 this->addr = addr; 83 90 } 91 92 void Player::move(void) { 93 int speed = 100; // pixels per second 94 unsigned long long curTime = getCurrentMillis(); 95 96 // if we're at our target, don't move 97 if (pos.x == target.x && pos.y == target.y) 98 cout << "We're already at our target" << endl; 99 else { 100 float pixels = speed * (curTime-timeLastUpdated) / 1000.0; 101 cout << "We need to move " << pixels << " pixels" << endl; 102 103 double angle = atan2(target.y-pos.y, target.x-pos.x); 104 105 float dist = sqrt(pow(target.x-pos.x, 2) + pow(target.y-pos.y, 2)); 106 if (dist <= pixels) { 107 pos.x = target.x; 108 pos.y = target.y; 109 }else { 110 pos.x += cos(angle)*pixels; 111 pos.y += sin(angle)*pixels; 112 } 113 } 114 115 timeLastUpdated = curTime; 116 } -
common/Player.h
r3a79253 rca44f82 32 32 void setAddr(sockaddr_in addr); 33 33 34 void move(); 35 34 36 int id; 35 37 string name; 36 38 string password; 37 39 sockaddr_in addr; 38 PLAYER_POS pos; 40 FLOAT_POSITION pos; 41 POSITION target; 42 unsigned long long timeLastUpdated; 39 43 }; 40 44 -
readme.txt
r3a79253 rca44f82 1 This info is outdated. The latest info is on the github wiki. 2 1 3 BoostPro Installer options 2 4 -
server/DataAccess.cpp
r3a79253 rca44f82 3 3 #include <iostream> 4 4 #include <sstream> 5 #include <cstdlib> 5 6 6 7 using namespace std; … … 27 28 ostringstream oss; 28 29 29 oss << "'" << username << "', '" << password << "'"; 30 string salt = "$1$"; 31 int random; 32 char chr; 33 for(int i=0; i<8; i++) 34 { 35 random = rand() % 62; 36 if (random < 26) 37 chr = (char)('a'+random); 38 else if (random < 52) 39 chr = (char)('A'+random-26); 40 else 41 chr = (char)('0'+random-52); 42 salt += chr; 43 } 44 salt += '$'; 45 46 string encrypted(crypt(password.c_str(), salt.c_str())); 47 48 oss << "'" << username << "', '" << encrypted << "'"; 30 49 31 50 return insert("users", "name, password", oss.str()); 51 } 52 53 int DataAccess::updatePlayer(string username, string password) 54 { 55 ostringstream values, where; 56 57 values << "password='" << password << "'"; 58 59 where << "name='" << username << "'"; 60 61 return update("users", values.str(), where.str()); 32 62 } 33 63 … … 51 81 } 52 82 53 if ( ( row = mysql_fetch_row(result)) != NULL ) 83 if ( ( row = mysql_fetch_row(result)) != NULL ) { 84 cout << "Creating a new player" << endl; 54 85 p = new Player(string(row[1]), string(row[2])); 55 else {86 }else { 56 87 cout << "Returned no results for some reason" << endl; 57 88 p = NULL; … … 63 94 } 64 95 65 int DataAccess::printPlayers() 96 // need to make sure this list is freed 97 // since we need to create a DataAccess class 98 // when calling these functions, 99 // we could free this list in the destructor 100 list<Player*>* DataAccess::getPlayers() 66 101 { 67 102 MYSQL_RES *result; … … 73 108 if (result == NULL) { 74 109 cout << mysql_error(connection) << endl; 75 return 1;110 return NULL; 76 111 } 77 112 113 list<Player*>* lstPlayers = new list<Player*>(); 78 114 while ( ( row = mysql_fetch_row(result)) != NULL ) { 79 115 cout << row[0] << ", " << row[1] << ", " << row[2] << endl; 116 lstPlayers->push_back(new Player(row[1], row[2])); 80 117 } 81 118 82 119 mysql_free_result(result); 83 120 84 return 0;121 return lstPlayers; 85 122 } 86 123 87 int DataAccess::insert(string table, string rows, string values) 124 bool DataAccess::verifyPassword(string password, string encrypted) 125 { 126 string test(crypt(password.c_str(), encrypted.c_str())); 127 128 return encrypted.compare(test) == 0; 129 } 130 131 int DataAccess::insert(string table, string columns, string values) 88 132 { 89 133 int query_state; 90 134 ostringstream oss; 91 135 92 oss << "INSERT into " << table << " (" << rows << ") VALUES (" << values << ")"; 136 oss << "INSERT into " << table << " (" << columns << ") VALUES (" << values << ")"; 137 cout << "query: " << oss.str() << endl; 138 139 query_state = mysql_query(connection, oss.str().c_str()); 140 141 if (query_state != 0) { 142 cout << mysql_error(connection) << endl; 143 return 1; 144 } 145 146 return 0; 147 } 148 149 int DataAccess::update(string table, string values, string where) 150 { 151 int query_state; 152 ostringstream oss; 153 154 oss << "UPDATE " << table << " SET " << values << " WHERE " << where; 93 155 cout << "query: " << oss.str() << endl; 94 156 -
server/DataAccess.h
r3a79253 rca44f82 3 3 4 4 #include <string> 5 #include <list> 5 6 6 7 #include <mysql/mysql.h> … … 16 17 17 18 int insertPlayer(string username, string password); 19 int updatePlayer(string username, string password); 18 20 19 Player *getPlayer(string username); 20 int printPlayers(); 21 Player* getPlayer(string username); 22 list<Player*>* getPlayers(); 23 bool verifyPassword(string encrypted, string password); 21 24 22 25 int insert(string table, string rows, string values); 26 int update(string table, string values, string where); 23 27 MYSQL_RES *select(string table, string filter); 24 28 -
server/makefile
r3a79253 rca44f82 1 1 CC = g++ 2 LIB_FLAGS = -lssl -lmysqlclient 2 LIB_FLAGS = -lssl -lmysqlclient -lcrypt -lrt 3 3 FLAGS = $(LIB_FLAGS) 4 4 COMMON_PATH = ../common 5 DEPENDENCIES = Common.o Message.o Player.o DataAccess.o5 DEPENDENCIES = Common.o Message.o Player.o WorldMap.o DataAccess.o 6 6 7 7 server : server.cpp $(DEPENDENCIES) … … 17 17 $(CC) -c -o $@ $? 18 18 19 WorldMap.o : $(COMMON_PATH)/WorldMap.cpp 20 $(CC) -c -o $@ $? 21 19 22 %.o : %.cpp 20 23 $(CC) -c -o $@ $? -
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.