Merge branch 'login' (read more)

Made a few tweaks to the code, but the build still works, so I'm merging it into master.
This commit is contained in:
Kayne Ruse
2014-04-21 01:02:38 +10:00
20 changed files with 250 additions and 264 deletions
+3 -15
View File
@@ -21,15 +21,11 @@
*/ */
#include "client_application.hpp" #include "client_application.hpp"
#include "serial.hpp"
#include <stdexcept> #include <stdexcept>
#include <chrono> #include <chrono>
//-------------------------
//Static declarations
//-------------------------
ClientApplication ClientApplication::instance;
//------------------------- //-------------------------
//Scene headers //Scene headers
//------------------------- //-------------------------
@@ -46,15 +42,7 @@ ClientApplication ClientApplication::instance;
//Public access members //Public access members
//------------------------- //-------------------------
ClientApplication::ClientApplication() { void ClientApplication::Init(int argc, char** argv) {
//
}
ClientApplication::~ClientApplication() {
//
}
void ClientApplication::Init() {
//load the prerequisites //load the prerequisites
config.Load("rsc\\config.cfg"); config.Load("rsc\\config.cfg");
+3 -8
View File
@@ -26,19 +26,14 @@
#include "base_scene.hpp" #include "base_scene.hpp"
#include "config_utility.hpp" #include "config_utility.hpp"
#include "network_packet.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
class ClientApplication { class ClientApplication {
private:
ClientApplication();
~ClientApplication();
static ClientApplication instance;
public: public:
static ClientApplication* GetInstance() { return &instance; } ClientApplication() = default;
~ClientApplication() = default;
void Init(); void Init(int argc, char** argv);
void Proc(); void Proc();
void Quit(); void Quit();
+5 -4
View File
@@ -26,12 +26,13 @@
using namespace std; using namespace std;
int main(int, char**) { int main(int argc, char** argv) {
cout << "Beginning client" << endl; cout << "Beginning client" << endl;
try { try {
ClientApplication::GetInstance()->Init(); ClientApplication app;
ClientApplication::GetInstance()->Proc(); app.Init(argc, argv);
ClientApplication::GetInstance()->Quit(); app.Proc();
app.Quit();
} }
catch(exception& e) { catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl; cerr << "Fatal exception thrown: " << e.what() << endl;
+24 -24
View File
@@ -63,8 +63,8 @@ InWorld::InWorld(ConfigUtility* const argConfig, UDPNetworkUtility* const argNet
//create the server-side player object //create the server-side player object
//TODO: the login system needs an overhaul //TODO: the login system needs an overhaul
NetworkPacket packet; SerialPacket packet;
packet.meta.type = NetworkPacket::Type::PLAYER_NEW; packet.meta.type = SerialPacket::Type::PLAYER_NEW;
packet.playerInfo.clientIndex = clientIndex; packet.playerInfo.clientIndex = clientIndex;
snprintf(packet.playerInfo.handle, PACKET_STRING_SIZE, "%s", config["player.handle"].c_str()); snprintf(packet.playerInfo.handle, PACKET_STRING_SIZE, "%s", config["player.handle"].c_str());
snprintf(packet.playerInfo.avatar, PACKET_STRING_SIZE, "%s", config["player.avatar"].c_str()); snprintf(packet.playerInfo.avatar, PACKET_STRING_SIZE, "%s", config["player.avatar"].c_str());
@@ -77,7 +77,7 @@ InWorld::InWorld(ConfigUtility* const argConfig, UDPNetworkUtility* const argNet
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
//request a sync //request a sync
packet.meta.type = NetworkPacket::Type::SYNCHRONIZE; packet.meta.type = SerialPacket::Type::SYNCHRONIZE;
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
@@ -98,7 +98,7 @@ void InWorld::FrameStart() {
} }
void InWorld::Update(double delta) { void InWorld::Update(double delta) {
NetworkPacket packet; SerialPacket packet;
//suck in all waiting packets //suck in all waiting packets
while(network.Receive()) { while(network.Receive()) {
@@ -257,37 +257,37 @@ void InWorld::KeyUp(SDL_KeyboardEvent const& key) {
//Network handlers //Network handlers
//------------------------- //-------------------------
void InWorld::HandlePacket(NetworkPacket packet) { void InWorld::HandlePacket(SerialPacket packet) {
switch(packet.meta.type) { switch(packet.meta.type) {
case NetworkPacket::Type::DISCONNECT: case SerialPacket::Type::DISCONNECT:
HandleDisconnect(packet); HandleDisconnect(packet);
break; break;
case NetworkPacket::Type::PLAYER_NEW: case SerialPacket::Type::PLAYER_NEW:
HandlePlayerNew(packet); HandlePlayerNew(packet);
break; break;
case NetworkPacket::Type::PLAYER_DELETE: case SerialPacket::Type::PLAYER_DELETE:
HandlePlayerDelete(packet); HandlePlayerDelete(packet);
break; break;
case NetworkPacket::Type::PLAYER_UPDATE: case SerialPacket::Type::PLAYER_UPDATE:
HandlePlayerUpdate(packet); HandlePlayerUpdate(packet);
break; break;
case NetworkPacket::Type::REGION_CONTENT: case SerialPacket::Type::REGION_CONTENT:
HandleRegionContent(packet); HandleRegionContent(packet);
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error("Unknown NetworkPacket::Type encountered")); throw(std::runtime_error("Unknown SerialPacket::Type encountered"));
break; break;
} }
} }
void InWorld::HandleDisconnect(NetworkPacket packet) { void InWorld::HandleDisconnect(SerialPacket packet) {
network.Unbind(Channels::SERVER); network.Unbind(Channels::SERVER);
clientIndex = -1; clientIndex = -1;
SetNextScene(SceneList::MAINMENU); SetNextScene(SceneList::MAINMENU);
} }
void InWorld::HandlePlayerNew(NetworkPacket packet) { void InWorld::HandlePlayerNew(SerialPacket packet) {
if (playerCharacters.find(packet.playerInfo.playerIndex) != playerCharacters.end()) { if (playerCharacters.find(packet.playerInfo.playerIndex) != playerCharacters.end()) {
throw(std::runtime_error("Cannot create duplicate players")); throw(std::runtime_error("Cannot create duplicate players"));
} }
@@ -310,7 +310,7 @@ void InWorld::HandlePlayerNew(NetworkPacket packet) {
} }
} }
void InWorld::HandlePlayerDelete(NetworkPacket packet) { void InWorld::HandlePlayerDelete(SerialPacket packet) {
if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) { if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) {
throw(std::runtime_error("Cannot delete non-existant players")); throw(std::runtime_error("Cannot delete non-existant players"));
} }
@@ -324,7 +324,7 @@ void InWorld::HandlePlayerDelete(NetworkPacket packet) {
} }
} }
void InWorld::HandlePlayerUpdate(NetworkPacket packet) { void InWorld::HandlePlayerUpdate(SerialPacket packet) {
if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) { if (playerCharacters.find(packet.playerInfo.playerIndex) == playerCharacters.end()) {
HandlePlayerNew(packet); HandlePlayerNew(packet);
return; return;
@@ -338,7 +338,7 @@ void InWorld::HandlePlayerUpdate(NetworkPacket packet) {
playerCharacters[packet.playerInfo.playerIndex].ResetDirection(); playerCharacters[packet.playerInfo.playerIndex].ResetDirection();
} }
void InWorld::HandleRegionContent(NetworkPacket packet) { void InWorld::HandleRegionContent(SerialPacket packet) {
//replace existing regions //replace existing regions
if (regionPager.FindRegion(packet.regionInfo.x, packet.regionInfo.y)) { if (regionPager.FindRegion(packet.regionInfo.x, packet.regionInfo.y)) {
regionPager.UnloadRegion(packet.regionInfo.x, packet.regionInfo.y); regionPager.UnloadRegion(packet.regionInfo.x, packet.regionInfo.y);
@@ -352,11 +352,11 @@ void InWorld::HandleRegionContent(NetworkPacket packet) {
//------------------------- //-------------------------
void InWorld::SendState() { void InWorld::SendState() {
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//pack the packet //pack the packet
packet.meta.type = NetworkPacket::Type::PLAYER_UPDATE; packet.meta.type = SerialPacket::Type::PLAYER_UPDATE;
packet.playerInfo.clientIndex = clientIndex; packet.playerInfo.clientIndex = clientIndex;
packet.playerInfo.playerIndex = playerIndex; packet.playerInfo.playerIndex = playerIndex;
packet.playerInfo.position = localCharacter->GetPosition(); packet.playerInfo.position = localCharacter->GetPosition();
@@ -367,33 +367,33 @@ void InWorld::SendState() {
} }
void InWorld::RequestDisconnect() { void InWorld::RequestDisconnect() {
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//send a disconnect request //send a disconnect request
packet.meta.type = NetworkPacket::Type::DISCONNECT; packet.meta.type = SerialPacket::Type::DISCONNECT;
packet.clientInfo.index = clientIndex; packet.clientInfo.index = clientIndex;
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
} }
void InWorld::RequestShutDown() { void InWorld::RequestShutDown() {
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//send a shutdown request //send a shutdown request
packet.meta.type = NetworkPacket::Type::SHUTDOWN; packet.meta.type = SerialPacket::Type::SHUTDOWN;
packet.clientInfo.index = clientIndex; packet.clientInfo.index = clientIndex;
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE);
} }
void InWorld::RequestRegion(int x, int y) { void InWorld::RequestRegion(int x, int y) {
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//pack the region's data //pack the region's data
packet.meta.type = NetworkPacket::Type::REGION_REQUEST; packet.meta.type = SerialPacket::Type::REGION_REQUEST;
packet.regionInfo.x = x; packet.regionInfo.x = x;
packet.regionInfo.y = y; packet.regionInfo.y = y;
serialize(&packet, buffer); serialize(&packet, buffer);
+7 -7
View File
@@ -29,7 +29,7 @@
//networking //networking
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "network_packet.hpp" #include "serial_packet.hpp"
#include "serial.hpp" #include "serial.hpp"
//graphics //graphics
@@ -72,12 +72,12 @@ protected:
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
//Network handlers //Network handlers
void HandlePacket(NetworkPacket); void HandlePacket(SerialPacket);
void HandleDisconnect(NetworkPacket); void HandleDisconnect(SerialPacket);
void HandlePlayerNew(NetworkPacket); void HandlePlayerNew(SerialPacket);
void HandlePlayerDelete(NetworkPacket); void HandlePlayerDelete(SerialPacket);
void HandlePlayerUpdate(NetworkPacket); void HandlePlayerUpdate(SerialPacket);
void HandleRegionContent(NetworkPacket); void HandleRegionContent(SerialPacket);
//Server control //Server control
void SendState(); void SendState();
+9 -9
View File
@@ -78,7 +78,7 @@ void LobbyMenu::FrameStart() {
void LobbyMenu::Update(double delta) { void LobbyMenu::Update(double delta) {
//suck in all waiting packets //suck in all waiting packets
NetworkPacket packet; SerialPacket packet;
while(network.Receive()) { while(network.Receive()) {
deserialize(&packet, network.GetInData()); deserialize(&packet, network.GetInData());
packet.meta.srcAddress = network.GetInPacket()->address; packet.meta.srcAddress = network.GetInPacket()->address;
@@ -126,11 +126,11 @@ void LobbyMenu::MouseButtonDown(SDL_MouseButtonEvent const& button) {
void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
if (search.MouseButtonUp(button) == Button::State::HOVER) { if (search.MouseButtonUp(button) == Button::State::HOVER) {
//the vars //the vars
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//broadcast to the network, or a specific server //broadcast to the network, or a specific server
packet.meta.type = NetworkPacket::Type::BROADCAST_REQUEST; packet.meta.type = SerialPacket::Type::BROADCAST_REQUEST;
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(config["server.host"].c_str(), config.Int("server.port"), buffer, PACKET_BUFFER_SIZE); network.Send(config["server.host"].c_str(), config.Int("server.port"), buffer, PACKET_BUFFER_SIZE);
@@ -141,11 +141,11 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) {
else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr) {
//the vars //the vars
NetworkPacket packet; SerialPacket packet;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//join the selected server //join the selected server
packet.meta.type = NetworkPacket::Type::JOIN_REQUEST; packet.meta.type = SerialPacket::Type::JOIN_REQUEST;
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(&selection->address, buffer, PACKET_BUFFER_SIZE); network.Send(&selection->address, buffer, PACKET_BUFFER_SIZE);
selection = nullptr; selection = nullptr;
@@ -181,16 +181,16 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) {
// //
} }
void LobbyMenu::HandlePacket(NetworkPacket packet) { void LobbyMenu::HandlePacket(SerialPacket packet) {
switch(packet.meta.type) { switch(packet.meta.type) {
case NetworkPacket::Type::BROADCAST_RESPONSE: { case SerialPacket::Type::BROADCAST_RESPONSE: {
ServerInformation server; ServerInformation server;
server.name = packet.serverInfo.name; server.name = packet.serverInfo.name;
server.address = packet.meta.srcAddress; server.address = packet.meta.srcAddress;
serverInfo.push_back(server); serverInfo.push_back(server);
} }
break; break;
case NetworkPacket::Type::JOIN_RESPONSE: case SerialPacket::Type::JOIN_RESPONSE:
clientIndex = packet.clientInfo.index; clientIndex = packet.clientInfo.index;
network.Bind(&packet.meta.srcAddress, Channels::SERVER); network.Bind(&packet.meta.srcAddress, Channels::SERVER);
SetNextScene(SceneList::INWORLD); SetNextScene(SceneList::INWORLD);
@@ -198,7 +198,7 @@ void LobbyMenu::HandlePacket(NetworkPacket packet) {
//handle errors //handle errors
default: default:
throw(std::runtime_error("Unknown NetworkPacket::Type encountered")); throw(std::runtime_error("Unknown SerialPacket::Type encountered"));
break; break;
} }
} }
+2 -2
View File
@@ -30,7 +30,7 @@
#include "config_utility.hpp" #include "config_utility.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "network_packet.hpp" #include "serial_packet.hpp"
#include "serial.hpp" #include "serial.hpp"
#include <vector> #include <vector>
@@ -55,7 +55,7 @@ protected:
void KeyDown(SDL_KeyboardEvent const&); void KeyDown(SDL_KeyboardEvent const&);
void KeyUp(SDL_KeyboardEvent const&); void KeyUp(SDL_KeyboardEvent const&);
void HandlePacket(NetworkPacket); void HandlePacket(SerialPacket);
//global //global
ConfigUtility& config; ConfigUtility& config;
+66 -66
View File
@@ -29,25 +29,25 @@
//internal serialization functions //internal serialization functions
//------------------------- //-------------------------
void serializeType(NetworkPacket* packet, char* buffer) { void serializeType(SerialPacket* packet, char* buffer) {
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
} }
void serializeServer(NetworkPacket* packet, char* buffer) { void serializeServer(SerialPacket* packet, char* buffer) {
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE); memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
} }
void serializeClient(NetworkPacket* packet, char* buffer) { void serializeClient(SerialPacket* packet, char* buffer) {
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
memcpy(buffer, &packet->clientInfo.index, sizeof(int)); memcpy(buffer, &packet->clientInfo.index, sizeof(int));
} }
void serializePlayer(NetworkPacket* packet, char* buffer) { void serializePlayer(SerialPacket* packet, char* buffer) {
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//indexes //indexes
memcpy(buffer, &packet->playerInfo.clientIndex, sizeof(int)); memcpy(buffer, &packet->playerInfo.clientIndex, sizeof(int));
@@ -71,9 +71,9 @@ void serializePlayer(NetworkPacket* packet, char* buffer) {
memcpy(buffer, &packet->playerInfo.motion.y, sizeof(double)); memcpy(buffer, &packet->playerInfo.motion.y, sizeof(double));
} }
void serializeRegionFormat(NetworkPacket* packet, char* buffer) { void serializeRegionFormat(SerialPacket* packet, char* buffer) {
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//x & y //x & y
memcpy(buffer, &packet->regionInfo.x, sizeof(int)); memcpy(buffer, &packet->regionInfo.x, sizeof(int));
@@ -81,10 +81,10 @@ void serializeRegionFormat(NetworkPacket* packet, char* buffer) {
memcpy(buffer, &packet->regionInfo.y, sizeof(int)); memcpy(buffer, &packet->regionInfo.y, sizeof(int));
} }
void serializeRegionContent(NetworkPacket* packet, char* buffer) { void serializeRegionContent(SerialPacket* packet, char* buffer) {
//format //format
memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//x & y //x & y
*reinterpret_cast<int*>(buffer) = packet->regionInfo.region->GetX(); *reinterpret_cast<int*>(buffer) = packet->regionInfo.region->GetX();
@@ -107,25 +107,25 @@ void serializeRegionContent(NetworkPacket* packet, char* buffer) {
//internal deserialization functions //internal deserialization functions
//------------------------- //-------------------------
void deserializeType(NetworkPacket* packet, char* buffer) { void deserializeType(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
} }
void deserializeServer(NetworkPacket* packet, char* buffer) { void deserializeServer(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
memcpy(packet->serverInfo.name, buffer, PACKET_STRING_SIZE); memcpy(packet->serverInfo.name, buffer, PACKET_STRING_SIZE);
} }
void deserializeClient(NetworkPacket* packet, char* buffer) { void deserializeClient(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
memcpy(&packet->clientInfo.index, buffer, sizeof(int)); memcpy(&packet->clientInfo.index, buffer, sizeof(int));
} }
void deserializePlayer(NetworkPacket* packet, char* buffer) { void deserializePlayer(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//indexes //indexes
memcpy(&packet->playerInfo.clientIndex, buffer, sizeof(int)); memcpy(&packet->playerInfo.clientIndex, buffer, sizeof(int));
@@ -149,9 +149,9 @@ void deserializePlayer(NetworkPacket* packet, char* buffer) {
memcpy(&packet->playerInfo.motion.y, buffer, sizeof(double)); memcpy(&packet->playerInfo.motion.y, buffer, sizeof(double));
} }
void deserializeRegionFormat(NetworkPacket* packet, char* buffer) { void deserializeRegionFormat(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//x & y //x & y
memcpy(&packet->regionInfo.x, buffer, sizeof(int)); memcpy(&packet->regionInfo.x, buffer, sizeof(int));
@@ -159,9 +159,9 @@ void deserializeRegionFormat(NetworkPacket* packet, char* buffer) {
memcpy(&packet->regionInfo.y, buffer, sizeof(int)); memcpy(&packet->regionInfo.y, buffer, sizeof(int));
} }
void deserializeRegionContent(NetworkPacket* packet, char* buffer) { void deserializeRegionContent(SerialPacket* packet, char* buffer) {
memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
buffer += sizeof(NetworkPacket::Type); buffer += sizeof(SerialPacket::Type);
//x & y //x & y
memcpy(&packet->regionInfo.x, buffer, sizeof(int)); memcpy(&packet->regionInfo.x, buffer, sizeof(int));
@@ -190,87 +190,87 @@ void deserializeRegionContent(NetworkPacket* packet, char* buffer) {
//the interface functions //the interface functions
//------------------------- //-------------------------
void serialize(NetworkPacket* packet, void* buffer) { void serialize(SerialPacket* packet, void* buffer) {
switch(packet->meta.type) { switch(packet->meta.type) {
//No extra data //No extra data
case NetworkPacket::Type::NONE: case SerialPacket::Type::NONE:
case NetworkPacket::Type::PING: case SerialPacket::Type::PING:
case NetworkPacket::Type::PONG: case SerialPacket::Type::PONG:
case NetworkPacket::Type::BROADCAST_REQUEST: case SerialPacket::Type::BROADCAST_REQUEST:
case NetworkPacket::Type::JOIN_REQUEST: case SerialPacket::Type::JOIN_REQUEST:
case NetworkPacket::Type::SYNCHRONIZE: case SerialPacket::Type::SYNCHRONIZE:
serializeType(packet, reinterpret_cast<char*>(buffer)); serializeType(packet, reinterpret_cast<char*>(buffer));
break; break;
//Server info //Server info
case NetworkPacket::Type::BROADCAST_RESPONSE: case SerialPacket::Type::BROADCAST_RESPONSE:
serializeServer(packet, reinterpret_cast<char*>(buffer)); serializeServer(packet, reinterpret_cast<char*>(buffer));
break; break;
//Client info //Client info
case NetworkPacket::Type::JOIN_RESPONSE: case SerialPacket::Type::JOIN_RESPONSE:
case NetworkPacket::Type::DISCONNECT: case SerialPacket::Type::DISCONNECT:
case NetworkPacket::Type::SHUTDOWN: case SerialPacket::Type::SHUTDOWN:
serializeClient(packet, reinterpret_cast<char*>(buffer)); serializeClient(packet, reinterpret_cast<char*>(buffer));
break; break;
//Player info //Player info
case NetworkPacket::Type::PLAYER_NEW: case SerialPacket::Type::PLAYER_NEW:
case NetworkPacket::Type::PLAYER_DELETE: case SerialPacket::Type::PLAYER_DELETE:
case NetworkPacket::Type::PLAYER_UPDATE: case SerialPacket::Type::PLAYER_UPDATE:
serializePlayer(packet, reinterpret_cast<char*>(buffer)); serializePlayer(packet, reinterpret_cast<char*>(buffer));
break; break;
//region info //region info
case NetworkPacket::Type::REGION_REQUEST: case SerialPacket::Type::REGION_REQUEST:
serializeRegionFormat(packet, reinterpret_cast<char*>(buffer)); serializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
break; break;
case NetworkPacket::Type::REGION_CONTENT: case SerialPacket::Type::REGION_CONTENT:
serializeRegionContent(packet, reinterpret_cast<char*>(buffer)); serializeRegionContent(packet, reinterpret_cast<char*>(buffer));
break; break;
} }
} }
void deserialize(NetworkPacket* packet, void* buffer) { void deserialize(SerialPacket* packet, void* buffer) {
//find the type, so that you can actually deserialize the packet! //find the type, so that you can actually deserialize the packet!
deserializeType(packet, reinterpret_cast<char*>(buffer)); deserializeType(packet, reinterpret_cast<char*>(buffer));
switch(packet->meta.type) { switch(packet->meta.type) {
//No extra data //No extra data
case NetworkPacket::Type::NONE: case SerialPacket::Type::NONE:
case NetworkPacket::Type::PING: case SerialPacket::Type::PING:
case NetworkPacket::Type::PONG: case SerialPacket::Type::PONG:
case NetworkPacket::Type::BROADCAST_REQUEST: case SerialPacket::Type::BROADCAST_REQUEST:
case NetworkPacket::Type::JOIN_REQUEST: case SerialPacket::Type::JOIN_REQUEST:
case NetworkPacket::Type::SYNCHRONIZE: case SerialPacket::Type::SYNCHRONIZE:
//NOTHING //NOTHING
break; break;
//Server info //Server info
case NetworkPacket::Type::BROADCAST_RESPONSE: case SerialPacket::Type::BROADCAST_RESPONSE:
deserializeServer(packet, reinterpret_cast<char*>(buffer)); deserializeServer(packet, reinterpret_cast<char*>(buffer));
break; break;
//Client info //Client info
case NetworkPacket::Type::JOIN_RESPONSE: case SerialPacket::Type::JOIN_RESPONSE:
case NetworkPacket::Type::DISCONNECT: case SerialPacket::Type::DISCONNECT:
case NetworkPacket::Type::SHUTDOWN: case SerialPacket::Type::SHUTDOWN:
deserializeClient(packet, reinterpret_cast<char*>(buffer)); deserializeClient(packet, reinterpret_cast<char*>(buffer));
break; break;
//Player info //Player info
case NetworkPacket::Type::PLAYER_NEW: case SerialPacket::Type::PLAYER_NEW:
case NetworkPacket::Type::PLAYER_DELETE: case SerialPacket::Type::PLAYER_DELETE:
case NetworkPacket::Type::PLAYER_UPDATE: case SerialPacket::Type::PLAYER_UPDATE:
deserializePlayer(packet, reinterpret_cast<char*>(buffer)); deserializePlayer(packet, reinterpret_cast<char*>(buffer));
break; break;
//region info //region info
case NetworkPacket::Type::REGION_REQUEST: case SerialPacket::Type::REGION_REQUEST:
deserializeRegionFormat(packet, reinterpret_cast<char*>(buffer)); deserializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
break; break;
case NetworkPacket::Type::REGION_CONTENT: case SerialPacket::Type::REGION_CONTENT:
deserializeRegionContent(packet, reinterpret_cast<char*>(buffer)); deserializeRegionContent(packet, reinterpret_cast<char*>(buffer));
break; break;
} }
+4 -4
View File
@@ -22,7 +22,7 @@
#ifndef SERIAL_HPP_ #ifndef SERIAL_HPP_
#define SERIAL_HPP_ #define SERIAL_HPP_
#include "network_packet.hpp" #include "serial_packet.hpp"
/* TODO: Keep the PACKET_BUFFER_SIZE up to date /* TODO: Keep the PACKET_BUFFER_SIZE up to date
* NOTE: REGION_CONTENT is currently the largest type of packet * NOTE: REGION_CONTENT is currently the largest type of packet
@@ -30,9 +30,9 @@
* map format: sizeof(int) * 2 * map format: sizeof(int) * 2
* metadata: sizeof(metadata) * metadata: sizeof(metadata)
*/ */
#define PACKET_BUFFER_SIZE REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 2 + sizeof(NetworkPacket::Metadata) #define PACKET_BUFFER_SIZE REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 2 + sizeof(SerialPacket::Metadata)
void serialize(NetworkPacket* const, void*); void serialize(SerialPacket* const, void*);
void deserialize(NetworkPacket* const, void*); void deserialize(SerialPacket* const, void*);
#endif #endif
@@ -19,8 +19,8 @@
* 3. This notice may not be removed or altered from any source * 3. This notice may not be removed or altered from any source
* distribution. * distribution.
*/ */
#ifndef NETWORKPACKET_HPP_ #ifndef SERIALPACKET_HPP_
#define NETWORKPACKET_HPP_ #define SERIALPACKET_HPP_
#include "vector2.hpp" #include "vector2.hpp"
#include "region.hpp" #include "region.hpp"
@@ -31,8 +31,7 @@
#pragma pack(push, 0) #pragma pack(push, 0)
//TODO: rename to serial packet union SerialPacket {
union NetworkPacket {
//types of packets //types of packets
enum class Type { enum class Type {
//default: there is something wrong //default: there is something wrong
@@ -112,7 +111,7 @@ union NetworkPacket {
}regionInfo; }regionInfo;
//defaults //defaults
NetworkPacket() { SerialPacket() {
meta.type = Type::NONE; meta.type = Type::NONE;
meta.srcAddress = {0,0}; meta.srcAddress = {0,0};
} }
+1 -15
View File
@@ -24,12 +24,6 @@
#include <stdexcept> #include <stdexcept>
#include <chrono> #include <chrono>
//-------------------------
//Static declarations
//-------------------------
EditorApplication EditorApplication::instance;
//------------------------- //-------------------------
//Scene headers //Scene headers
//------------------------- //-------------------------
@@ -42,15 +36,7 @@ EditorApplication EditorApplication::instance;
//Public access members //Public access members
//------------------------- //-------------------------
EditorApplication::EditorApplication() { void EditorApplication::Init(int argc, char** argv) {
//
}
EditorApplication::~EditorApplication() {
//
}
void EditorApplication::Init() {
config.Load("rsc\\config.cfg"); config.Load("rsc\\config.cfg");
if (SDL_Init(SDL_INIT_VIDEO)) if (SDL_Init(SDL_INIT_VIDEO))
throw(std::runtime_error("Failed to initialize SDL")); throw(std::runtime_error("Failed to initialize SDL"));
+3 -7
View File
@@ -27,15 +27,11 @@
#include "config_utility.hpp" #include "config_utility.hpp"
class EditorApplication { class EditorApplication {
private:
EditorApplication();
~EditorApplication();
static EditorApplication instance;
public: public:
static EditorApplication* GetInstance() { return &instance; } EditorApplication() = default;
~EditorApplication() = default;
void Init(); void Init(int argc, char** argv);
void Proc(); void Proc();
void Quit(); void Quit();
+5 -4
View File
@@ -26,12 +26,13 @@
using namespace std; using namespace std;
int main(int, char**) { int main(int argc, char** argv) {
cout << "Beginning editor" << endl; cout << "Beginning editor" << endl;
try { try {
EditorApplication::GetInstance()->Init(); EditorApplication app;
EditorApplication::GetInstance()->Proc(); app.Init(argc, argv);
EditorApplication::GetInstance()->Quit(); app.Proc();
app.Quit();
} }
catch(exception& e) { catch(exception& e) {
cerr << "Fatal exception thrown: " << e.what() << endl; cerr << "Fatal exception thrown: " << e.what() << endl;
+1
View File
@@ -1,3 +1,4 @@
#TODO: The build process needs revising
#for use on Windows: #for use on Windows:
#MKDIR=mkdir #MKDIR=mkdir
+48 -39
View File
@@ -1,11 +1,13 @@
--TODO: The SQL startup script needs revising
------------------------- -------------------------
--Server --Server
------------------------- -------------------------
CREATE TABLE IF NOT EXISTS UserAccounts ( CREATE TABLE IF NOT EXISTS UserAccounts (
userAccountID INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
username varchar(30) UNIQUE, username varchar(100) UNIQUE,
password varchar(30), password varchar(100), --NOTE: DO NOT DO THIS!!
blacklisted BIT DEFAULT 0, blacklisted BIT DEFAULT 0,
whitelisted BIT DEFAULT 1 whitelisted BIT DEFAULT 1
); );
@@ -14,31 +16,30 @@ CREATE TABLE IF NOT EXISTS UserAccounts (
--Items --Items
------------------------- -------------------------
CREATE TABLE IF NOT EXISTS GlobalItemList (
globalItemListID INTEGER PRIMARY KEY AUTOINCREMENT,
itemName varchar(30) UNIQUE,
itemImage varchar(30),
type varchar(15), --{'mundane', 'consumable', 'equipment'}
maxStackSize INTEGER, --{1-max; 0 for non-stackable}
maxUniqueCopies INTEGER --{1-max; 0 for unlimited}
);
CREATE TABLE IF NOT EXISTS MundaneItems ( CREATE TABLE IF NOT EXISTS MundaneItems (
mundaneItemID INTEGER PRIMARY KEY AUTOINCREMENT, --metadata
globalItemListID INTEGER REFERENCES GlobalItemList(globalItemListID) uid INTEGER PRIMARY KEY AUTOINCREMENT,
--holds whatever itemID INTEGER,
stackSize INTEGER DEFAULT 0,
owner INTEGER REFERENCES PlayerCharacters(uid)
); );
CREATE TABLE IF NOT EXISTS Consumables ( CREATE TABLE IF NOT EXISTS Consumables (
consumableID INTEGER PRIMARY KEY AUTOINCREMENT, --metadata
globalItemListID INTEGER REFERENCES GlobalItemList(globalItemListID) uid INTEGER PRIMARY KEY AUTOINCREMENT,
itemID INTEGER,
stackSize INTEGER DEFAULT 0,
owner INTEGER REFERENCES PlayerCharacters(uid)
--holds all consumable items info (food, potions, etc.) --holds all consumable items info (food, potions, etc.)
); );
CREATE TABLE IF NOT EXISTS Equipment ( CREATE TABLE IF NOT EXISTS Equipment (
equipmentID INTEGER PRIMARY KEY AUTOINCREMENT, --metadata
globalItemListID INTEGER REFERENCES GlobalItemList(globalItemListID) uid INTEGER PRIMARY KEY AUTOINCREMENT,
itemID INTEGER,
owner INTEGER REFERENCES PlayerCharacters(uid)
--hold all equipment info --hold all equipment info
--stat mods, special effects, etc.
); );
------------------------- -------------------------
@@ -46,28 +47,36 @@ CREATE TABLE IF NOT EXISTS Equipment (
------------------------- -------------------------
CREATE TABLE IF NOT EXISTS PlayerCharacters ( CREATE TABLE IF NOT EXISTS PlayerCharacters (
playerCharacterID INTEGER PRIMARY KEY AUTOINCREMENT, uid INTEGER PRIMARY KEY AUTOINCREMENT,
name varchar(30) UNIQUE,
--stats --metadata
currentLevel INTEGER DEFAULT 0, handle varchar(100) UNIQUE,
currentExperience INTEGER DEFAULT 0, avatar varchar(100),
maxHealth INTEGER DEFAULT 0, birth timestamp NOT NULL DEFAULT (datetime()),
maxMana INTEGER DEFAULT 0,
currentHealth INTEGER DEFAULT 0, --position
currentMana INTEGER DEFAULT 0, mapIndex INTEGER DEFAULT 0,
attack INTEGER DEFAULT 0, positionX INTEGER DEFAULT 0,
defence INTEGER DEFAULT 0, positionY INTEGER DEFAULT 0,
--etc.
--statistics
level INTEGER DEFAULT 0,
exp INTEGER DEFAULT 0,
maxHP INTEGER DEFAULT 0,
health INTEGER DEFAULT 0,
maxMP INTEGER DEFAULT 0,
mana INTEGER DEFAULT 0,
attack INTEGER DEFAULT 0,
defence INTEGER DEFAULT 0,
intelligence INTEGER DEFAULT 0,
resistance INTEGER DEFAULT 0,
accuracy REAL DEFAULT 0.0,
evasion REAL DEFAULT 0.0,
luck REAL DEFAULT 0.0,
--equipment --equipment
weapon INTEGER REFERENCES Equipment(equipmentID), weapon INTEGER REFERENCES Equipment(uid),
helmet INTEGER REFERENCES Equipment(equipmentID), helmet INTEGER REFERENCES Equipment(uid),
armour INTEGER REFERENCES Equipment(equipmentID) armour INTEGER REFERENCES Equipment(uid)
--etc. --etc.
); );
CREATE TABLE IF NOT EXISTS PlayerInventoryItems (
characterID INTEGER REFERENCES PlayerCharacters(characterID),
globalItemListID INTEGER REFERENCES GlobalItemList(globalItemListID)
);
+1 -1
View File
@@ -33,7 +33,7 @@ int main(int argc, char** argv) {
try { try {
ServerApplication app; ServerApplication app;
app.Init(argc, argv); app.Init(argc, argv);
app.Loop(); app.Proc();
app.Quit(); app.Quit();
} }
catch(exception& e) { catch(exception& e) {
+34 -34
View File
@@ -87,7 +87,7 @@ void ServerApplication::Init(int argc, char** argv) {
regionPager.GetFormat()->SetSaveDir("save/mapname/"); regionPager.GetFormat()->SetSaveDir("save/mapname/");
std::cout << "Initialized the map system" << std::endl; std::cout << "Initialized the map system" << std::endl;
std::cout << "\tsizeof(NetworkPacket): " << sizeof(NetworkPacket) << std::endl; std::cout << "\tsizeof(SerialPacket): " << sizeof(SerialPacket) << std::endl;
std::cout << "\tPACKET_BUFFER_SIZE: " << PACKET_BUFFER_SIZE << std::endl; std::cout << "\tPACKET_BUFFER_SIZE: " << PACKET_BUFFER_SIZE << std::endl;
//finalize the startup //finalize the startup
@@ -97,8 +97,8 @@ void ServerApplication::Init(int argc, char** argv) {
// //
} }
void ServerApplication::Loop() { void ServerApplication::Proc() {
NetworkPacket packet; SerialPacket packet;
while(running) { while(running) {
//suck in the waiting packets & process them //suck in the waiting packets & process them
while(network.Receive()) { while(network.Receive()) {
@@ -133,38 +133,38 @@ void ServerApplication::Quit() {
//Define the uber switch //Define the uber switch
//------------------------- //-------------------------
void ServerApplication::HandlePacket(NetworkPacket packet) { void ServerApplication::HandlePacket(SerialPacket packet) {
switch(packet.meta.type) { switch(packet.meta.type) {
case NetworkPacket::Type::BROADCAST_REQUEST: case SerialPacket::Type::BROADCAST_REQUEST:
HandleBroadcastRequest(packet); HandleBroadcastRequest(packet);
break; break;
case NetworkPacket::Type::JOIN_REQUEST: case SerialPacket::Type::JOIN_REQUEST:
HandleJoinRequest(packet); HandleJoinRequest(packet);
break; break;
case NetworkPacket::Type::DISCONNECT: case SerialPacket::Type::DISCONNECT:
HandleDisconnect(packet); HandleDisconnect(packet);
break; break;
case NetworkPacket::Type::SYNCHRONIZE: case SerialPacket::Type::SYNCHRONIZE:
HandleSynchronize(packet); HandleSynchronize(packet);
break; break;
case NetworkPacket::Type::SHUTDOWN: case SerialPacket::Type::SHUTDOWN:
HandleShutdown(packet); HandleShutdown(packet);
break; break;
case NetworkPacket::Type::PLAYER_NEW: case SerialPacket::Type::PLAYER_NEW:
HandlePlayerNew(packet); HandlePlayerNew(packet);
break; break;
case NetworkPacket::Type::PLAYER_DELETE: case SerialPacket::Type::PLAYER_DELETE:
HandlePlayerDelete(packet); HandlePlayerDelete(packet);
break; break;
case NetworkPacket::Type::PLAYER_UPDATE: case SerialPacket::Type::PLAYER_UPDATE:
HandlePlayerUpdate(packet); HandlePlayerUpdate(packet);
break; break;
case NetworkPacket::Type::REGION_REQUEST: case SerialPacket::Type::REGION_REQUEST:
HandleRegionRequest(packet); HandleRegionRequest(packet);
break; break;
//handle errors //handle errors
default: default:
throw(std::runtime_error("Unknown NetworkPacket::Type encountered")); throw(std::runtime_error("Unknown SerialPacket::Type encountered"));
break; break;
} }
} }
@@ -173,9 +173,9 @@ void ServerApplication::HandlePacket(NetworkPacket packet) {
//Handle various network input //Handle various network input
//------------------------- //-------------------------
void ServerApplication::HandleBroadcastRequest(NetworkPacket packet) { void ServerApplication::HandleBroadcastRequest(SerialPacket packet) {
//send back the server's metadata //send back the server's metadata
packet.meta.type = NetworkPacket::Type::BROADCAST_RESPONSE; packet.meta.type = SerialPacket::Type::BROADCAST_RESPONSE;
//TODO: version info //TODO: version info
snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str()); snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str());
//TODO: player count //TODO: player count
@@ -185,7 +185,7 @@ void ServerApplication::HandleBroadcastRequest(NetworkPacket packet) {
network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE); network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
} }
void ServerApplication::HandleJoinRequest(NetworkPacket packet) { void ServerApplication::HandleJoinRequest(SerialPacket packet) {
//register the new client //register the new client
ClientEntry newClient; ClientEntry newClient;
newClient.address = packet.meta.srcAddress; newClient.address = packet.meta.srcAddress;
@@ -193,7 +193,7 @@ void ServerApplication::HandleJoinRequest(NetworkPacket packet) {
//send the client their index //send the client their index
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
packet.meta.type = NetworkPacket::Type::JOIN_RESPONSE; packet.meta.type = SerialPacket::Type::JOIN_RESPONSE;
packet.clientInfo.index = ClientEntry::uidCounter; packet.clientInfo.index = ClientEntry::uidCounter;
serialize(&packet, buffer); serialize(&packet, buffer);
@@ -205,7 +205,7 @@ void ServerApplication::HandleJoinRequest(NetworkPacket packet) {
std::cout << "Connect, total: " << clientMap.size() << std::endl; std::cout << "Connect, total: " << clientMap.size() << std::endl;
} }
void ServerApplication::HandleDisconnect(NetworkPacket packet) { void ServerApplication::HandleDisconnect(SerialPacket packet) {
//TODO: authenticate who is disconnecting/kicking //TODO: authenticate who is disconnecting/kicking
//disconnect the specified client //disconnect the specified client
@@ -215,8 +215,8 @@ void ServerApplication::HandleDisconnect(NetworkPacket packet) {
clientMap.erase(packet.clientInfo.index); clientMap.erase(packet.clientInfo.index);
//prep the delete packet //prep the delete packet
NetworkPacket delPacket; SerialPacket delPacket;
delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE; delPacket.meta.type = SerialPacket::Type::PLAYER_DELETE;
//TODO: can this use DeletePlayer() instead? //TODO: can this use DeletePlayer() instead?
//delete server and client side players //delete server and client side players
@@ -239,17 +239,17 @@ void ServerApplication::HandleDisconnect(NetworkPacket packet) {
std::cout << "Disconnect, total: " << clientMap.size() << std::endl; std::cout << "Disconnect, total: " << clientMap.size() << std::endl;
} }
void ServerApplication::HandleSynchronize(NetworkPacket packet) { void ServerApplication::HandleSynchronize(SerialPacket packet) {
//TODO: compensate for large distances //TODO: compensate for large distances
//send all the server's data to this client //send all the server's data to this client
NetworkPacket newPacket; SerialPacket newPacket;
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
//TODO: map? //TODO: map?
//players //players
newPacket.meta.type = NetworkPacket::Type::PLAYER_UPDATE; newPacket.meta.type = SerialPacket::Type::PLAYER_UPDATE;
for (auto& it : playerMap) { for (auto& it : playerMap) {
//TODO: update this for the expanded PlayerEntry structure //TODO: update this for the expanded PlayerEntry structure
newPacket.playerInfo.playerIndex = it.first; newPacket.playerInfo.playerIndex = it.first;
@@ -262,19 +262,19 @@ void ServerApplication::HandleSynchronize(NetworkPacket packet) {
} }
} }
void ServerApplication::HandleShutdown(NetworkPacket packet) { void ServerApplication::HandleShutdown(SerialPacket packet) {
//end the server //end the server
running = false; running = false;
//disconnect all clients //disconnect all clients
packet.meta.type = NetworkPacket::Type::DISCONNECT; packet.meta.type = SerialPacket::Type::DISCONNECT;
PumpPacket(packet); PumpPacket(packet);
//finished this routine //finished this routine
std::cout << "Shutdown signal accepted" << std::endl; std::cout << "Shutdown signal accepted" << std::endl;
} }
void ServerApplication::HandlePlayerNew(NetworkPacket packet) { void ServerApplication::HandlePlayerNew(SerialPacket packet) {
//register the new PlayerEntry //register the new PlayerEntry
//NOTE: assigning each field one-by-one so adding or moving a field doesn't break this code //NOTE: assigning each field one-by-one so adding or moving a field doesn't break this code
PlayerEntry newPlayer; PlayerEntry newPlayer;
@@ -308,7 +308,7 @@ void ServerApplication::HandlePlayerNew(NetworkPacket packet) {
PlayerEntry::uidCounter++; PlayerEntry::uidCounter++;
} }
void ServerApplication::HandlePlayerDelete(NetworkPacket packet) { void ServerApplication::HandlePlayerDelete(SerialPacket packet) {
//TODO: remove this? //TODO: remove this?
//TODO: authenticate who is deleting this player //TODO: authenticate who is deleting this player
if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) { if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) {
@@ -316,8 +316,8 @@ void ServerApplication::HandlePlayerDelete(NetworkPacket packet) {
} }
//prep the delete packet //prep the delete packet
NetworkPacket delPacket; SerialPacket delPacket;
delPacket.meta.type = NetworkPacket::Type::PLAYER_DELETE; delPacket.meta.type = SerialPacket::Type::PLAYER_DELETE;
//delete the specified playerEntry //delete the specified playerEntry
erase_if(playerMap, [&](std::pair<unsigned int, PlayerEntry> it) -> bool { erase_if(playerMap, [&](std::pair<unsigned int, PlayerEntry> it) -> bool {
@@ -335,7 +335,7 @@ void ServerApplication::HandlePlayerDelete(NetworkPacket packet) {
}); });
} }
void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) { void ServerApplication::HandlePlayerUpdate(SerialPacket packet) {
if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) { if (playerMap.find(packet.playerInfo.playerIndex) == playerMap.end()) {
throw(std::runtime_error("Cannot update a non-existant player")); throw(std::runtime_error("Cannot update a non-existant player"));
} }
@@ -347,15 +347,15 @@ void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) {
PumpPacket(packet); PumpPacket(packet);
} }
void ServerApplication::HandleRegionRequest(NetworkPacket packet) { void ServerApplication::HandleRegionRequest(SerialPacket packet) {
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
packet.meta.type = NetworkPacket::Type::REGION_CONTENT; packet.meta.type = SerialPacket::Type::REGION_CONTENT;
packet.regionInfo.region = regionPager.GetRegion(packet.regionInfo.x, packet.regionInfo.y); packet.regionInfo.region = regionPager.GetRegion(packet.regionInfo.x, packet.regionInfo.y);
serialize(&packet, buffer); serialize(&packet, buffer);
network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE); network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE);
} }
void ServerApplication::PumpPacket(NetworkPacket packet) { void ServerApplication::PumpPacket(SerialPacket packet) {
//I don't really like this, but it'll do for now //I don't really like this, but it'll do for now
char buffer[PACKET_BUFFER_SIZE]; char buffer[PACKET_BUFFER_SIZE];
serialize(&packet, buffer); serialize(&packet, buffer);
+13 -13
View File
@@ -33,7 +33,7 @@
#include "region_pager.hpp" #include "region_pager.hpp"
//networking //networking
#include "network_packet.hpp" #include "serial_packet.hpp"
#include "udp_network_utility.hpp" #include "udp_network_utility.hpp"
#include "serial.hpp" #include "serial.hpp"
@@ -57,25 +57,25 @@ public:
~ServerApplication() = default; ~ServerApplication() = default;
void Init(int argc, char** argv); void Init(int argc, char** argv);
void Loop(); void Proc();
void Quit(); void Quit();
private: private:
void HandlePacket(NetworkPacket); void HandlePacket(SerialPacket);
//high cohesion utility functions //high cohesion utility functions
void HandleBroadcastRequest(NetworkPacket); void HandleBroadcastRequest(SerialPacket);
void HandleJoinRequest(NetworkPacket); void HandleJoinRequest(SerialPacket);
void HandleDisconnect(NetworkPacket); void HandleDisconnect(SerialPacket);
void HandleSynchronize(NetworkPacket); void HandleSynchronize(SerialPacket);
void HandleShutdown(NetworkPacket); void HandleShutdown(SerialPacket);
void HandlePlayerNew(NetworkPacket); void HandlePlayerNew(SerialPacket);
void HandlePlayerDelete(NetworkPacket); void HandlePlayerDelete(SerialPacket);
void HandlePlayerUpdate(NetworkPacket); void HandlePlayerUpdate(SerialPacket);
void HandleRegionRequest(NetworkPacket); void HandleRegionRequest(SerialPacket);
//TODO: a function that sends to players in a certain proximity //TODO: a function that sends to players in a certain proximity
void PumpPacket(NetworkPacket); void PumpPacket(SerialPacket);
//APIs //APIs
UDPNetworkUtility network; UDPNetworkUtility network;
+16 -6
View File
@@ -21,10 +21,14 @@
*/ */
#include "server_utility.hpp" #include "server_utility.hpp"
#include "utility.hpp"
#include <stdexcept>
#include <fstream> #include <fstream>
#include <cstdlib>
int runSQLScript(sqlite3* db, std::string fname, int (*callback)(void*,int,char**,char**), void* argPtr) {
int runSQLScript(sqlite3* db, std::string fname) { //load the file into a string
std::ifstream is(fname); std::ifstream is(fname);
if (!is.is_open()) { if (!is.is_open()) {
return -1; return -1;
@@ -32,9 +36,15 @@ int runSQLScript(sqlite3* db, std::string fname) {
std::string script; std::string script;
getline(is, script, '\0'); getline(is, script, '\0');
is.close(); is.close();
//NOTE: flesh out this error if needed
if (sqlite3_exec(db, script.c_str(), nullptr, nullptr, nullptr) != SQLITE_OK) { //run the SQL loaded from the file
return -2; char* errmsg = nullptr;
int ret = sqlite3_exec(db, script.c_str(), callback, argPtr, &errmsg);
if (ret != SQLITE_OK) {
//handle any errors received from the SQL
std::runtime_error e(std::string() + "SQL Script Error " + to_string_custom(ret) + ": " + errmsg);
free(errmsg);
throw(e);
} }
return 0; return ret;
} }
+1 -1
View File
@@ -26,6 +26,6 @@
#include <string> #include <string>
int runSQLScript(sqlite3* db, std::string fname); int runSQLScript(sqlite3* db, std::string fname, int (*callback)(void*,int,char**,char**) = nullptr, void* argPtr = nullptr);
#endif #endif