This repository has been archived on 2026-04-30. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Tortuga/misc/refactoring fun/server_internals.diff
T
2014-04-29 02:05:08 +10:00

285 lines
8.6 KiB
Diff

diff --git a/server/server_internals.cpp b/server/server_internals.cpp
index 1a96d5b..e1a9cb9 100644
--- a/server/server_internals.cpp
+++ b/server/server_internals.cpp
@@ -1,4 +1,4 @@
-/* Copyright: (c) Kayne Ruse 2013, 2014
+/* Copyright: (c) Kayne Ruse 2014
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
@@ -21,7 +21,7 @@
*/
#include "server_application.hpp"
-#include "utility.hpp"
+#include "server_utility.hpp"
#include <stdexcept>
#include <iostream>
@@ -36,8 +36,6 @@ void ServerApplication::Init(int argc, char** argv) {
std::cout << "Beginning startup" << std::endl;
//initial setup
- ClientEntry::uidCounter = 0;
- PlayerEntry::uidCounter = 0;
config.Load("rsc\\config.cfg");
//Init SDL
@@ -109,6 +107,8 @@ void ServerApplication::Proc() {
//we need to go deeper
HandlePacket(packet);
}
+ //update the internals
+ //TODO: update the internals i.e. player positions
//give the computer a break
SDL_Delay(10);
}
@@ -116,6 +116,10 @@ void ServerApplication::Proc() {
void ServerApplication::Quit() {
std::cout << "Shutting down" << std::endl;
+
+ //save the server state
+ //TODO: save the existing players
+
//empty the members
regionPager.UnloadAll();
@@ -125,6 +129,7 @@ void ServerApplication::Quit() {
network.Close();
SDLNet_Quit();
SDL_Quit();
+
std::cout << "Shutdown finished" << std::endl;
}
@@ -140,21 +145,15 @@ void ServerApplication::HandlePacket(SerialPacket packet) {
case SerialPacket::Type::JOIN_REQUEST:
HandleJoinRequest(packet);
break;
- case SerialPacket::Type::DISCONNECT:
- HandleDisconnect(packet);
- break;
case SerialPacket::Type::SYNCHRONIZE:
HandleSynchronize(packet);
break;
+ case SerialPacket::Type::DISCONNECT:
+ HandleDisconnect(packet);
+ break;
case SerialPacket::Type::SHUTDOWN:
HandleShutdown(packet);
break;
- case SerialPacket::Type::PLAYER_NEW:
- HandlePlayerNew(packet);
- break;
- case SerialPacket::Type::PLAYER_DELETE:
- HandlePlayerDelete(packet);
- break;
case SerialPacket::Type::PLAYER_UPDATE:
HandlePlayerUpdate(packet);
break;
@@ -167,202 +166,3 @@ void ServerApplication::HandlePacket(SerialPacket packet) {
break;
}
}
-
-//-------------------------
-//Handle various network input
-//-------------------------
-
-void ServerApplication::HandleBroadcastRequest(SerialPacket packet) {
- //send back the server's metadata
- packet.meta.type = SerialPacket::Type::BROADCAST_RESPONSE;
-
- //pack the data
- snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str());
- packet.serverInfo.playerCount = playerMap.size();
- packet.serverInfo.regionWidth = REGION_WIDTH;
- packet.serverInfo.regionHeight = REGION_HEIGHT;
- packet.serverInfo.regionDepth = REGION_DEPTH;
-
- //send the data
- char buffer[PACKET_BUFFER_SIZE];
- serialize(&packet, buffer);
- network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
-}
-
-void ServerApplication::HandleJoinRequest(SerialPacket packet) {
- //register the new client
- ClientEntry newClient;
- newClient.address = packet.meta.srcAddress;
- clientMap[ClientEntry::uidCounter] = newClient;
-
- //send the client their index
- char buffer[PACKET_BUFFER_SIZE];
- packet.meta.type = SerialPacket::Type::JOIN_RESPONSE;
- packet.clientInfo.index = ClientEntry::uidCounter;
- serialize(&packet, buffer);
-
- //bounce this packet
- network.Send(&newClient.address, buffer, PACKET_BUFFER_SIZE);
-
- //finished this routine
- ClientEntry::uidCounter++;
- std::cout << "Connect, total: " << clientMap.size() << std::endl;
-}
-
-void ServerApplication::HandleDisconnect(SerialPacket packet) {
- //TODO: authenticate who is disconnecting/kicking
-
- //disconnect the specified client
- char buffer[PACKET_BUFFER_SIZE];
- serialize(&packet, buffer);
- network.Send(&clientMap[packet.clientInfo.index].address, buffer, PACKET_BUFFER_SIZE);
- clientMap.erase(packet.clientInfo.index);
-
- //prep the delete packet
- SerialPacket delPacket;
- delPacket.meta.type = SerialPacket::Type::PLAYER_DELETE;
-
- //TODO: can this use DeletePlayer() instead?
- //delete server and client side players
- erase_if(playerMap, [&](std::pair<unsigned int, PlayerEntry> it) -> bool {
- //find the internal players to delete
- if (it.second.clientIndex == packet.clientInfo.index) {
- //send the delete player command to all clients
- delPacket.playerInfo.playerIndex = it.first;
- PumpPacket(delPacket);
-
- //delete this player object
- return true;
- }
-
- //don't delete this player object
- return false;
- });
-
- //finished this routine
- std::cout << "Disconnect, total: " << clientMap.size() << std::endl;
-}
-
-void ServerApplication::HandleSynchronize(SerialPacket packet) {
- //TODO: compensate for large distances
-
- //send all the server's data to this client
- SerialPacket newPacket;
- char buffer[PACKET_BUFFER_SIZE];
-
- //players
- newPacket.meta.type = SerialPacket::Type::PLAYER_UPDATE;
- for (auto& it : playerMap) {
- //TODO: update this for the expanded PlayerEntry structure
- newPacket.playerInfo.playerIndex = it.first;
- snprintf(newPacket.playerInfo.handle, PACKET_STRING_SIZE, "%s", it.second.handle.c_str());
- snprintf(newPacket.playerInfo.avatar, PACKET_STRING_SIZE, "%s", it.second.avatar.c_str());
- newPacket.playerInfo.position = it.second.position;
- newPacket.playerInfo.motion = it.second.motion;
- serialize(&newPacket, buffer);
- network.Send(&clientMap[packet.clientInfo.index].address, buffer, PACKET_BUFFER_SIZE);
- }
-}
-
-void ServerApplication::HandleShutdown(SerialPacket packet) {
- //end the server
- running = false;
-
- //disconnect all clients
- packet.meta.type = SerialPacket::Type::DISCONNECT;
- PumpPacket(packet);
-
- //finished this routine
- std::cout << "Shutdown signal accepted" << std::endl;
-}
-
-void ServerApplication::HandlePlayerNew(SerialPacket packet) {
- //register the new PlayerEntry
- //NOTE: assigning each field one-by-one so adding or moving a field doesn't break this code
- PlayerEntry newPlayer;
-
- //metadata
- newPlayer.clientIndex = packet.playerInfo.clientIndex;
- newPlayer.handle = packet.playerInfo.handle;
- newPlayer.avatar = packet.playerInfo.avatar;
-
- //position
- newPlayer.mapIndex = 0;
- newPlayer.position = {0,0};
- newPlayer.motion = {0,0};
- newPlayer.bbox = {0, 0, 0, 0};
-
- //TODO: Add the statistic creation code here
-
- //push this player
- playerMap[PlayerEntry::uidCounter] = newPlayer;
-
- //send the client their info
- packet.playerInfo.playerIndex = PlayerEntry::uidCounter;
- packet.playerInfo.position = newPlayer.position;
- packet.playerInfo.motion = newPlayer.motion;
-
- //actually send to everyone
- PumpPacket(packet);
-
- //finish this routine
- PlayerEntry::uidCounter++;
-}
-
-//TODO: differentiate between delete and unload
-void ServerApplication::HandlePlayerDelete(SerialPacket packet) {
- //TODO: authenticate who is deleting this player
- if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) {
- throw(std::runtime_error("Cannot delete a non-existant player"));
- }
-
- //TODO: remove the deleted player from the database?
-
- //prep the delete packet
- SerialPacket delPacket;
- delPacket.meta.type = SerialPacket::Type::PLAYER_DELETE;
-
- //delete the specified playerEntry
- erase_if(playerMap, [&](std::pair<unsigned int, PlayerEntry> it) -> bool {
- //find the specified PlayerEntry
- if (it.first == packet.playerInfo.playerIndex) {
- //send to all
- delPacket.playerInfo.playerIndex = it.first;
- PumpPacket(delPacket);
-
- //delete this player
- return true;
- }
- //skip this player
- return false;
- });
-}
-
-void ServerApplication::HandlePlayerUpdate(SerialPacket packet) {
- if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) {
- throw(std::runtime_error("Cannot update a non-existant player"));
- }
-
- //TODO: the server needs it's own movement system too
- playerMap[packet.playerInfo.playerIndex].position = packet.playerInfo.position;
- playerMap[packet.playerInfo.playerIndex].motion = packet.playerInfo.motion;
-
- PumpPacket(packet);
-}
-
-void ServerApplication::HandleRegionRequest(SerialPacket packet) {
- char buffer[PACKET_BUFFER_SIZE];
- packet.meta.type = SerialPacket::Type::REGION_CONTENT;
- packet.regionInfo.region = regionPager.GetRegion(packet.regionInfo.x, packet.regionInfo.y);
- serialize(&packet, buffer);
- network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
-}
-
-void ServerApplication::PumpPacket(SerialPacket packet) {
- //NOTE: I don't really like this, but it'll do for now
- char buffer[PACKET_BUFFER_SIZE];
- serialize(&packet, buffer);
- for (auto& it : clientMap) {
- network.Send(&it.second.address, buffer, PACKET_BUFFER_SIZE);
- }
-}