Merge branch 'client-fix' into develop (read more)

Summary of changes:
* Changed the way I handle packets
* RoomManager is now functional
* Split RegionPager into two classes
* Fixed several major and minor bugs
This commit is contained in:
Kayne Ruse
2014-06-14 04:03:55 +10:00
24 changed files with 487 additions and 394 deletions
+29 -20
View File
@@ -117,7 +117,7 @@ void ServerApplication::Init(int argc, char** argv) {
std::cout << "\tTile Size: " << sizeof(Region::type_t) << std::endl;
std::cout << "\tRegion Format: " << REGION_WIDTH << ", " << REGION_HEIGHT << ", " << REGION_DEPTH << std::endl;
std::cout << "\tRegion Content Footprint: " << REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) << std::endl;
std::cout << "\tPACKET_BUFFER_SIZE (max size): " << PACKET_BUFFER_SIZE << std::endl;
std::cout << "\tPACKET_BUFFER_SIZE: " << PACKET_BUFFER_SIZE << std::endl;
std::cout << "\tMAX_PACKET_SIZE: " << MAX_PACKET_SIZE << std::endl;
//-------------------------
@@ -134,22 +134,31 @@ void ServerApplication::Init(int argc, char** argv) {
}
void ServerApplication::Proc() {
char packetBuffer[MAX_PACKET_SIZE];
SerialPacket* packetBuffer = static_cast<SerialPacket*>(malloc(MAX_PACKET_SIZE));
while(running) {
//suck in the waiting packets & process them
while(network.Receive(reinterpret_cast<SerialPacket*>(packetBuffer))) {
HandlePacket(reinterpret_cast<SerialPacket*>(packetBuffer));
while(network.Receive(packetBuffer)) {
HandlePacket(packetBuffer);
}
//update the internals
//TODO: update the internals i.e. player positions
//give the computer a break
SDL_Delay(10);
}
free(static_cast<void*>(packetBuffer));
}
void ServerApplication::Quit() {
std::cout << "Shutting down" << std::endl;
//close the managers
clientMap.clear();
accountMgr.UnloadAll();
characterMgr.UnloadAll();
//TODO: unload combats
//TODO: unload enemies
//TODO: unload rooms
//APIs
lua_close(luaState);
sqlite3_close_v2(database);
@@ -168,21 +177,21 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) {
switch(argPacket->type) {
//basic connections
case SerialPacketType::BROADCAST_REQUEST:
HandleBroadcastRequest(dynamic_cast<SerialPacket*>(argPacket));
HandleBroadcastRequest(static_cast<SerialPacket*>(argPacket));
break;
case SerialPacketType::JOIN_REQUEST:
HandleJoinRequest(dynamic_cast<ClientPacket*>(argPacket));
HandleJoinRequest(static_cast<ClientPacket*>(argPacket));
break;
case SerialPacketType::DISCONNECT:
HandleDisconnect(dynamic_cast<ClientPacket*>(argPacket));
HandleDisconnect(static_cast<ClientPacket*>(argPacket));
break;
case SerialPacketType::SHUTDOWN:
HandleShutdown(dynamic_cast<SerialPacket*>(argPacket));
HandleShutdown(static_cast<SerialPacket*>(argPacket));
break;
//map management
case SerialPacketType::REGION_REQUEST:
HandleRegionRequest(dynamic_cast<RegionPacket*>(argPacket));
HandleRegionRequest(static_cast<RegionPacket*>(argPacket));
break;
//combat management
@@ -190,14 +199,14 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) {
//character management
case SerialPacketType::CHARACTER_NEW:
HandleCharacterNew(dynamic_cast<CharacterPacket*>(argPacket));
HandleCharacterNew(static_cast<CharacterPacket*>(argPacket));
break;
case SerialPacketType::CHARACTER_DELETE:
HandleCharacterDelete(dynamic_cast<CharacterPacket*>(argPacket));
HandleCharacterDelete(static_cast<CharacterPacket*>(argPacket));
break;
case SerialPacketType::CHARACTER_UPDATE:
case SerialPacketType::CHARACTER_STATS_REQUEST:
HandleCharacterUpdate(dynamic_cast<CharacterPacket*>(argPacket));
HandleCharacterUpdate(static_cast<CharacterPacket*>(argPacket));
break;
//enemy management
@@ -205,12 +214,12 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) {
//mismanagement
case SerialPacketType::SYNCHRONIZE:
HandleSynchronize(dynamic_cast<ClientPacket*>(argPacket));
HandleSynchronize(static_cast<ClientPacket*>(argPacket));
break;
//handle errors
default:
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in the server: " + to_string_custom(int(argPacket->type))));
throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in the server: " + to_string_custom(static_cast<int>(argPacket->type)) ));
break;
}
}
@@ -228,7 +237,7 @@ void ServerApplication::HandleBroadcastRequest(SerialPacket* const argPacket) {
newPacket.playerCount = characterMgr.GetContainer()->size();
newPacket.version = NETWORK_VERSION;
network.SendTo(&argPacket->srcAddress, dynamic_cast<SerialPacket*>(&newPacket));
network.SendTo(&argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
}
void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) {
@@ -251,7 +260,7 @@ void ServerApplication::HandleJoinRequest(ClientPacket* const argPacket) {
newPacket.clientIndex = clientUID;
newPacket.accountIndex = accountIndex;
network.SendTo(&newClient.address, dynamic_cast<SerialPacket*>(&newPacket));
network.SendTo(&newClient.address, static_cast<SerialPacket*>(&newPacket));
//finished this routine
clientMap[clientUID++] = newClient;
@@ -264,7 +273,7 @@ void ServerApplication::HandleDisconnect(ClientPacket* const argPacket) {
//forward to the specified client
network.SendTo(
&clientMap[ accountMgr.GetAccount(argPacket->accountIndex)->clientIndex ].address,
dynamic_cast<SerialPacket*>(argPacket)
static_cast<SerialPacket*>(argPacket)
);
//save and unload this account's characters
@@ -315,7 +324,7 @@ void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
newPacket.region = roomMgr.GetRoom(argPacket->roomIndex)->pager.GetRegion(argPacket->x, argPacket->y);
//send the content
network.SendTo(&argPacket->srcAddress, dynamic_cast<SerialPacket*>(argPacket));
network.SendTo(&argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
}
//-------------------------
@@ -435,7 +444,7 @@ void ServerApplication::HandleSynchronize(ClientPacket* const argPacket) {
for (auto& it : *characterMgr.GetContainer()) {
newPacket.characterIndex = it.first;
CopyCharacterToPacket(&newPacket, it.first);
network.SendTo(&client.address, dynamic_cast<SerialPacket*>(&newPacket));
network.SendTo(&client.address, static_cast<SerialPacket*>(&newPacket));
}
//TODO: more in HandleSynchronize()
@@ -458,7 +467,7 @@ void ServerApplication::PumpCharacterUnload(int uid) {
CharacterPacket newPacket;
newPacket.type = SerialPacketType::CHARACTER_DELETE;
newPacket.characterIndex = uid;
PumpPacket(dynamic_cast<SerialPacket*>(&newPacket));
PumpPacket(static_cast<SerialPacket*>(&newPacket));
}
void ServerApplication::CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex) {