Server-side HandleRegionRequest() reimplemented

Note that this locally handles bug #35, and adds a new packet type:

REGION_REJECTION
This commit is contained in:
Kayne Ruse
2014-11-30 22:23:46 +11:00
parent bac8bc2b41
commit b59cd0fe87
5 changed files with 43 additions and 24 deletions
+4 -3
View File
@@ -117,14 +117,15 @@ enum class SerialPacketType {
//rejection/error messages //rejection/error messages
JOIN_REJECTION = 28, JOIN_REJECTION = 28,
LOGIN_REJECTION = 29, LOGIN_REJECTION = 29,
CHARACTER_REJECTION = 30, REGION_REJECTION = 30,
SHUTDOWN_REJECTION = 31, CHARACTER_REJECTION = 31,
SHUTDOWN_REJECTION = 32,
//------------------------- //-------------------------
//not used //not used
//------------------------- //-------------------------
LAST = 32 LAST = 33
}; };
#endif #endif
+2
View File
@@ -83,6 +83,7 @@ void serializePacket(void* buffer, SerialPacketBase* packet) {
case SerialPacketType::TEXT_BROADCAST: case SerialPacketType::TEXT_BROADCAST:
case SerialPacketType::JOIN_REJECTION: case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::LOGIN_REJECTION: case SerialPacketType::LOGIN_REJECTION:
case SerialPacketType::REGION_REJECTION:
case SerialPacketType::CHARACTER_REJECTION: case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::SHUTDOWN_REJECTION: case SerialPacketType::SHUTDOWN_REJECTION:
serializeText(buffer, static_cast<TextPacket*>(packet)); serializeText(buffer, static_cast<TextPacket*>(packet));
@@ -133,6 +134,7 @@ void deserializePacket(void* buffer, SerialPacketBase* packet) {
case SerialPacketType::TEXT_BROADCAST: case SerialPacketType::TEXT_BROADCAST:
case SerialPacketType::JOIN_REJECTION: case SerialPacketType::JOIN_REJECTION:
case SerialPacketType::LOGIN_REJECTION: case SerialPacketType::LOGIN_REJECTION:
case SerialPacketType::REGION_REJECTION:
case SerialPacketType::CHARACTER_REJECTION: case SerialPacketType::CHARACTER_REJECTION:
case SerialPacketType::SHUTDOWN_REJECTION: case SerialPacketType::SHUTDOWN_REJECTION:
deserializeText(buffer, static_cast<TextPacket*>(packet)); deserializeText(buffer, static_cast<TextPacket*>(packet));
+3 -5
View File
@@ -87,8 +87,9 @@ private:
// void HandleDisconnectForced(ClientPacket* const); // void HandleDisconnectForced(ClientPacket* const);
void HandleShutdownRequest(ClientPacket* const); void HandleShutdownRequest(ClientPacket* const);
//map management //data management
// void HandleRegionRequest(RegionPacket* const); void HandleRegionRequest(RegionPacket* const);
void SaveServerState();
//character management //character management
// void HandleCharacterNew(CharacterPacket* const); // void HandleCharacterNew(CharacterPacket* const);
@@ -105,9 +106,6 @@ private:
// void PumpCharacterUnload(int uid); // void PumpCharacterUnload(int uid);
// void CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex); // void CopyCharacterToPacket(CharacterPacket* const packet, int characterIndex);
//data management
void SaveServerState();
//APIs and utilities //APIs and utilities
sqlite3* database = nullptr; sqlite3* database = nullptr;
lua_State* luaState = nullptr; lua_State* luaState = nullptr;
+4 -2
View File
@@ -268,11 +268,13 @@ void ServerApplication::HandlePacket(SerialPacket* const argPacket) {
case SerialPacketType::SHUTDOWN_REQUEST: case SerialPacketType::SHUTDOWN_REQUEST:
HandleShutdownRequest(static_cast<ClientPacket*>(argPacket)); HandleShutdownRequest(static_cast<ClientPacket*>(argPacket));
break; break;
/*
//data management & queries //data management & queries
case SerialPacketType::REGION_REQUEST: case SerialPacketType::REGION_REQUEST:
// HandleRegionRequest(static_cast<RegionPacket*>(argPacket)); HandleRegionRequest(static_cast<RegionPacket*>(argPacket));
break; break;
/*
case SerialPacketType::QUERY_CHARACTER_EXISTS: case SerialPacketType::QUERY_CHARACTER_EXISTS:
// HandleCharacterStatsRequest(static_cast<RegionPacket*>(argPacket)); // HandleCharacterStatsRequest(static_cast<RegionPacket*>(argPacket));
break; break;
+30 -14
View File
@@ -88,7 +88,6 @@ void ServerApplication::HandleLoginRequest(ClientPacket* const argPacket) {
if (clientData == nullptr || clientData->GetAddress() != argPacket->srcAddress) { if (clientData == nullptr || clientData->GetAddress() != argPacket->srcAddress) {
std::cerr << "Falsified client index detected: " << argPacket->clientIndex << std::endl; std::cerr << "Falsified client index detected: " << argPacket->clientIndex << std::endl;
//TODO: rejection message?
return; return;
} }
@@ -97,14 +96,18 @@ void ServerApplication::HandleLoginRequest(ClientPacket* const argPacket) {
//Cannot load //Cannot load
if (accountIndex < 0) { if (accountIndex < 0) {
//build the message
std::ostringstream msg; std::ostringstream msg;
msg << "Account already loaded: " << argPacket->username; msg << "Account already loaded: " << argPacket->username;
//build the packet
TextPacket newPacket; TextPacket newPacket;
newPacket.type = SerialPacketType::LOGIN_REJECTION; newPacket.type = SerialPacketType::LOGIN_REJECTION;
// memset(newPacket.name, 0, PACKET_STRING_SIZE);
strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE); strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE);
network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket)); network.SendTo(clientData->GetAddress(), static_cast<SerialPacket*>(&newPacket));
//log the error
std::cerr << "Error message sent: " << msg << std::endl;
return; return;
} }
@@ -247,28 +250,45 @@ void ServerApplication::HandleShutdownRequest(ClientPacket* const argPacket) {
std::cout << "Shutdown signal accepted" << std::endl; std::cout << "Shutdown signal accepted" << std::endl;
} }
/*
//------------------------- //-------------------------
//map management //data management
//------------------------- //-------------------------
//SET: resources
void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) { void ServerApplication::HandleRegionRequest(RegionPacket* const argPacket) {
//get the region object, send a rejection on error
RoomData* room = roomMgr.Get(argPacket->roomIndex);
if (!room) {
//build the error message
std::ostringstream msg;
msg << "Failed to find Region (" << argPacket->roomIndex << "," << argPacket->x << "," << argPacket->y << ");";
msg << "Room " << argPacket->roomIndex << "does not exist";
//build the packet
TextPacket newPacket;
newPacket.type = SerialPacketType::REGION_REJECTION;
strncpy(newPacket.text, msg.str().c_str(), PACKET_STRING_SIZE);
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
//log the error
std::cerr << "Error message sent: " << msg << std::endl;
return;
}
Region* region = room->GetPager()->GetRegion(argPacket->x, argPacket->y);
//send the content
RegionPacket newPacket; RegionPacket newPacket;
newPacket.type = SerialPacketType::REGION_CONTENT; newPacket.type = SerialPacketType::REGION_CONTENT;
newPacket.roomIndex = argPacket->roomIndex; newPacket.roomIndex = argPacket->roomIndex;
newPacket.x = argPacket->x; newPacket.x = argPacket->x;
newPacket.y = argPacket->y; newPacket.y = argPacket->y;
newPacket.region = region;
//BUG: possibly related to #35
newPacket.region = roomMgr.Get(argPacket->roomIndex)->GetPager()->GetRegion(argPacket->x, argPacket->y);
//send the content
network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket)); network.SendTo(argPacket->srcAddress, static_cast<SerialPacket*>(&newPacket));
} }
/*
//------------------------- //-------------------------
//Character Management //Character Management
//------------------------- //-------------------------
@@ -382,10 +402,6 @@ void ServerApplication::HandleSynchronize(ClientPacket* const argPacket) {
//TODO: more in HandleSynchronize() //TODO: more in HandleSynchronize()
} }
//-------------------------
//utility methods
//-------------------------
//SET: utility/manager //SET: utility/manager
void ServerApplication::CleanupLostConnection(int clientIndex) { void ServerApplication::CleanupLostConnection(int clientIndex) {
//NOTE: This assumes each player has only one account and character at a time //NOTE: This assumes each player has only one account and character at a time