Merge branch 'network' (read more)
I've refactored the network layout. Here is a brief list of changes: * The new player object is created server-side rather than client-side * serial.cpp now uses macros to prevent hard-to-find logic errors * A few method definitions have been re-ordered * SerialPacket's internals have been slightly changed * SerialPacket now carries a datestamp defining the network protocol * server_application.cpp has been split into two separate files * HandleJoinRequest() has been modified to create the new player object
This commit is contained in:
+107
-128
@@ -25,85 +25,59 @@
|
||||
|
||||
#include <cstring>
|
||||
|
||||
//-------------------------
|
||||
//Convenience Macros
|
||||
//-------------------------
|
||||
|
||||
#define SERIALIZE(buffer, data, size) memcpy(buffer, data, size); buffer += size;
|
||||
#define DESERIALIZE(buffer, data, size) memcpy(data, buffer, size); buffer += size;
|
||||
|
||||
//-------------------------
|
||||
//internal serialization functions
|
||||
//-------------------------
|
||||
|
||||
void serializeType(SerialPacket* packet, char* buffer) {
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
}
|
||||
|
||||
void serializeServer(SerialPacket* packet, char* buffer) {
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//server info
|
||||
//Note: version info serialization goes here
|
||||
memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
memcpy(buffer, &packet->serverInfo.playerCount, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
|
||||
//map format
|
||||
memcpy(buffer, &packet->serverInfo.regionWidth, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(buffer, &packet->serverInfo.regionHeight, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(buffer, &packet->serverInfo.regionDepth, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->serverInfo.networkVersion, sizeof(int));
|
||||
SERIALIZE(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
||||
SERIALIZE(buffer, &packet->serverInfo.playerCount, sizeof(int));
|
||||
}
|
||||
|
||||
void serializeClient(SerialPacket* packet, char* buffer) {
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
memcpy(buffer, &packet->clientInfo.index, sizeof(int));
|
||||
}
|
||||
|
||||
void serializePlayer(SerialPacket* packet, char* buffer) {
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//indexes
|
||||
memcpy(buffer, &packet->playerInfo.clientIndex, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(buffer, &packet->playerInfo.playerIndex, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
SERIALIZE(buffer, &packet->clientInfo.clientIndex, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->clientInfo.playerIndex, sizeof(int));
|
||||
|
||||
//text
|
||||
memcpy(buffer, packet->playerInfo.handle, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
memcpy(buffer, packet->playerInfo.avatar, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
|
||||
//vectors
|
||||
memcpy(buffer, &packet->playerInfo.position.x, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(buffer, &packet->playerInfo.position.y, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(buffer, &packet->playerInfo.motion.x, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(buffer, &packet->playerInfo.motion.y, sizeof(double));
|
||||
//texts
|
||||
SERIALIZE(buffer, packet->clientInfo.player, PACKET_STRING_SIZE);
|
||||
SERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
||||
SERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
||||
}
|
||||
|
||||
void serializeRegionFormat(SerialPacket* packet, char* buffer) {
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//x & y
|
||||
memcpy(buffer, &packet->regionInfo.x, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(buffer, &packet->regionInfo.y, sizeof(int));
|
||||
//format
|
||||
SERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
||||
}
|
||||
|
||||
void serializeRegionContent(SerialPacket* packet, char* buffer) {
|
||||
//format
|
||||
memcpy(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//x & y
|
||||
*reinterpret_cast<int*>(buffer) = packet->regionInfo.region->GetX();
|
||||
buffer += sizeof(int);
|
||||
*reinterpret_cast<int*>(buffer) = packet->regionInfo.region->GetY();
|
||||
buffer += sizeof(int);
|
||||
//format
|
||||
SERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
||||
|
||||
//content
|
||||
for (register int i = 0; i < REGION_WIDTH; i++) {
|
||||
@@ -116,92 +90,79 @@ void serializeRegionContent(SerialPacket* packet, char* buffer) {
|
||||
}
|
||||
}
|
||||
|
||||
void serializePlayer(SerialPacket* packet, char* buffer) {
|
||||
SERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//indexes
|
||||
SERIALIZE(buffer, &packet->playerInfo.clientIndex, sizeof(int));
|
||||
SERIALIZE(buffer, &packet->playerInfo.playerIndex, sizeof(int));
|
||||
|
||||
//texts
|
||||
SERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
||||
SERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
||||
|
||||
//vectors
|
||||
SERIALIZE(buffer, &packet->playerInfo.position.x, sizeof(double));
|
||||
SERIALIZE(buffer, &packet->playerInfo.position.y, sizeof(double));
|
||||
SERIALIZE(buffer, &packet->playerInfo.motion.x, sizeof(double));
|
||||
SERIALIZE(buffer, &packet->playerInfo.motion.y, sizeof(double));
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//internal deserialization functions
|
||||
//-------------------------
|
||||
|
||||
void deserializeType(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
}
|
||||
|
||||
void deserializeServer(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//server info
|
||||
//Note: version info deserialization goes here
|
||||
memcpy(packet->serverInfo.name, buffer, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
memcpy(&packet->serverInfo.playerCount, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
|
||||
//map format
|
||||
memcpy(&packet->serverInfo.regionWidth, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(&packet->serverInfo.regionHeight, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(&packet->serverInfo.regionDepth, buffer, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->serverInfo.networkVersion, sizeof(int));
|
||||
DESERIALIZE(buffer, packet->serverInfo.name, PACKET_STRING_SIZE);
|
||||
DESERIALIZE(buffer, &packet->serverInfo.playerCount, sizeof(int));
|
||||
}
|
||||
|
||||
void deserializeClient(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
memcpy(&packet->clientInfo.index, buffer, sizeof(int));
|
||||
}
|
||||
|
||||
void deserializePlayer(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//indexes
|
||||
memcpy(&packet->playerInfo.clientIndex, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(&packet->playerInfo.playerIndex, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
DESERIALIZE(buffer, &packet->clientInfo.clientIndex, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->clientInfo.playerIndex, sizeof(int));
|
||||
|
||||
//text
|
||||
memcpy(packet->playerInfo.handle, buffer, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
memcpy(packet->playerInfo.avatar, buffer, PACKET_STRING_SIZE);
|
||||
buffer += PACKET_STRING_SIZE;
|
||||
|
||||
//vectors
|
||||
memcpy(&packet->playerInfo.position.x, buffer, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(&packet->playerInfo.position.y, buffer, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(&packet->playerInfo.motion.x, buffer, sizeof(double));
|
||||
buffer += sizeof(double);
|
||||
memcpy(&packet->playerInfo.motion.y, buffer, sizeof(double));
|
||||
//texts
|
||||
DESERIALIZE(buffer, packet->clientInfo.player, PACKET_STRING_SIZE);
|
||||
DESERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
||||
DESERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
||||
}
|
||||
|
||||
void deserializeRegionFormat(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//x & y
|
||||
memcpy(&packet->regionInfo.x, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(&packet->regionInfo.y, buffer, sizeof(int));
|
||||
//format
|
||||
DESERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
||||
}
|
||||
|
||||
void deserializeRegionContent(SerialPacket* packet, char* buffer) {
|
||||
memcpy(&packet->meta.type, buffer, sizeof(SerialPacket::Type));
|
||||
buffer += sizeof(SerialPacket::Type);
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//x & y
|
||||
memcpy(&packet->regionInfo.x, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
memcpy(&packet->regionInfo.y, buffer, sizeof(int));
|
||||
buffer += sizeof(int);
|
||||
//format
|
||||
DESERIALIZE(buffer, &packet->regionInfo.mapIndex, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->regionInfo.x, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->regionInfo.y, sizeof(int));
|
||||
|
||||
//content
|
||||
//an object to work on
|
||||
BlankAllocator().Create(
|
||||
&packet->regionInfo.region,
|
||||
packet->regionInfo.x,
|
||||
packet->regionInfo.y
|
||||
);
|
||||
|
||||
//content
|
||||
for (register int i = 0; i < REGION_WIDTH; i++) {
|
||||
for (register int j = 0; j < REGION_HEIGHT; j++) {
|
||||
for (register int k = 0; k < REGION_DEPTH; k++) {
|
||||
@@ -212,6 +173,24 @@ void deserializeRegionContent(SerialPacket* packet, char* buffer) {
|
||||
}
|
||||
}
|
||||
|
||||
void deserializePlayer(SerialPacket* packet, char* buffer) {
|
||||
DESERIALIZE(buffer, &packet->meta.type, sizeof(SerialPacket::Type));
|
||||
|
||||
//indexes
|
||||
DESERIALIZE(buffer, &packet->playerInfo.clientIndex, sizeof(int));
|
||||
DESERIALIZE(buffer, &packet->playerInfo.playerIndex, sizeof(int));
|
||||
|
||||
//texts
|
||||
DESERIALIZE(buffer, packet->clientInfo.handle, PACKET_STRING_SIZE);
|
||||
DESERIALIZE(buffer, packet->clientInfo.avatar, PACKET_STRING_SIZE);
|
||||
|
||||
//vectors
|
||||
DESERIALIZE(buffer, &packet->playerInfo.position.x, sizeof(double));
|
||||
DESERIALIZE(buffer, &packet->playerInfo.position.y, sizeof(double));
|
||||
DESERIALIZE(buffer, &packet->playerInfo.motion.x, sizeof(double));
|
||||
DESERIALIZE(buffer, &packet->playerInfo.motion.y, sizeof(double));
|
||||
}
|
||||
|
||||
//-------------------------
|
||||
//the interface functions
|
||||
//-------------------------
|
||||
@@ -223,8 +202,6 @@ void serialize(SerialPacket* packet, void* buffer) {
|
||||
case SerialPacket::Type::PING:
|
||||
case SerialPacket::Type::PONG:
|
||||
case SerialPacket::Type::BROADCAST_REQUEST:
|
||||
case SerialPacket::Type::JOIN_REQUEST:
|
||||
case SerialPacket::Type::SYNCHRONIZE:
|
||||
serializeType(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
@@ -234,19 +211,14 @@ void serialize(SerialPacket* packet, void* buffer) {
|
||||
break;
|
||||
|
||||
//Client info
|
||||
case SerialPacket::Type::JOIN_REQUEST:
|
||||
case SerialPacket::Type::JOIN_RESPONSE:
|
||||
case SerialPacket::Type::SYNCHRONIZE:
|
||||
case SerialPacket::Type::DISCONNECT:
|
||||
case SerialPacket::Type::SHUTDOWN:
|
||||
serializeClient(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//Player info
|
||||
case SerialPacket::Type::PLAYER_NEW:
|
||||
case SerialPacket::Type::PLAYER_DELETE:
|
||||
case SerialPacket::Type::PLAYER_UPDATE:
|
||||
serializePlayer(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//region info
|
||||
case SerialPacket::Type::REGION_REQUEST:
|
||||
serializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
|
||||
@@ -255,6 +227,13 @@ void serialize(SerialPacket* packet, void* buffer) {
|
||||
case SerialPacket::Type::REGION_CONTENT:
|
||||
serializeRegionContent(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//Player info
|
||||
case SerialPacket::Type::PLAYER_NEW:
|
||||
case SerialPacket::Type::PLAYER_DELETE:
|
||||
case SerialPacket::Type::PLAYER_UPDATE:
|
||||
serializePlayer(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -267,8 +246,6 @@ void deserialize(SerialPacket* packet, void* buffer) {
|
||||
case SerialPacket::Type::PING:
|
||||
case SerialPacket::Type::PONG:
|
||||
case SerialPacket::Type::BROADCAST_REQUEST:
|
||||
case SerialPacket::Type::JOIN_REQUEST:
|
||||
case SerialPacket::Type::SYNCHRONIZE:
|
||||
//NOTHING
|
||||
break;
|
||||
|
||||
@@ -278,19 +255,14 @@ void deserialize(SerialPacket* packet, void* buffer) {
|
||||
break;
|
||||
|
||||
//Client info
|
||||
case SerialPacket::Type::JOIN_REQUEST:
|
||||
case SerialPacket::Type::JOIN_RESPONSE:
|
||||
case SerialPacket::Type::SYNCHRONIZE:
|
||||
case SerialPacket::Type::DISCONNECT:
|
||||
case SerialPacket::Type::SHUTDOWN:
|
||||
deserializeClient(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//Player info
|
||||
case SerialPacket::Type::PLAYER_NEW:
|
||||
case SerialPacket::Type::PLAYER_DELETE:
|
||||
case SerialPacket::Type::PLAYER_UPDATE:
|
||||
deserializePlayer(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//region info
|
||||
case SerialPacket::Type::REGION_REQUEST:
|
||||
deserializeRegionFormat(packet, reinterpret_cast<char*>(buffer));
|
||||
@@ -299,5 +271,12 @@ void deserialize(SerialPacket* packet, void* buffer) {
|
||||
case SerialPacket::Type::REGION_CONTENT:
|
||||
deserializeRegionContent(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
|
||||
//Player info
|
||||
case SerialPacket::Type::PLAYER_NEW:
|
||||
case SerialPacket::Type::PLAYER_DELETE:
|
||||
case SerialPacket::Type::PLAYER_UPDATE:
|
||||
deserializePlayer(packet, reinterpret_cast<char*>(buffer));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -27,10 +27,10 @@
|
||||
/* NOTE: Keep the PACKET_BUFFER_SIZE up to date
|
||||
* NOTE: REGION_CONTENT is currently the largest type of packet
|
||||
* map content: REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizoeof(region::type_t)
|
||||
* map format: sizeof(int) * 2
|
||||
* map format: sizeof(int) * 3
|
||||
* metadata: sizeof(metadata)
|
||||
*/
|
||||
#define PACKET_BUFFER_SIZE REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 2 + sizeof(SerialPacket::Metadata)
|
||||
#define PACKET_BUFFER_SIZE REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(int) * 3 + sizeof(SerialPacket::Metadata)
|
||||
|
||||
void serialize(SerialPacket* const, void*);
|
||||
void deserialize(SerialPacket* const, void*);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "SDL/SDL_net.h"
|
||||
|
||||
#define NETWORK_VERSION 20140428
|
||||
#define PACKET_STRING_SIZE 100
|
||||
|
||||
#pragma pack(push, 0)
|
||||
@@ -49,23 +50,23 @@ union SerialPacket {
|
||||
JOIN_REQUEST = 5,
|
||||
JOIN_RESPONSE = 6,
|
||||
|
||||
//disconnect from the server
|
||||
DISCONNECT = 7,
|
||||
|
||||
//mass update
|
||||
SYNCHRONIZE = 8,
|
||||
SYNCHRONIZE = 7,
|
||||
|
||||
//disconnect from the server
|
||||
DISCONNECT = 8,
|
||||
|
||||
//shut down the server
|
||||
SHUTDOWN = 9,
|
||||
|
||||
//Player movement, etc.
|
||||
PLAYER_NEW = 10,
|
||||
PLAYER_DELETE = 11,
|
||||
PLAYER_UPDATE = 12,
|
||||
|
||||
//map data
|
||||
REGION_REQUEST = 13,
|
||||
REGION_CONTENT = 14,
|
||||
REGION_REQUEST = 10,
|
||||
REGION_CONTENT = 11,
|
||||
|
||||
//Player movement, etc.
|
||||
PLAYER_NEW = 12,
|
||||
PLAYER_DELETE = 13,
|
||||
PLAYER_UPDATE = 14,
|
||||
|
||||
//TODO: combat packets
|
||||
};
|
||||
@@ -79,42 +80,41 @@ union SerialPacket {
|
||||
//information about the server
|
||||
struct ServerInformation {
|
||||
Metadata meta;
|
||||
//TODO: version info
|
||||
int networkVersion;
|
||||
char name[PACKET_STRING_SIZE];
|
||||
int playerCount;
|
||||
|
||||
//map format
|
||||
int regionWidth;
|
||||
int regionHeight;
|
||||
int regionDepth;
|
||||
}serverInfo;
|
||||
|
||||
//information about the client
|
||||
//TODO: login credentials
|
||||
struct ClientInformation {
|
||||
Metadata meta;
|
||||
int index;
|
||||
int clientIndex;
|
||||
int playerIndex;
|
||||
char player[PACKET_STRING_SIZE];
|
||||
char handle[PACKET_STRING_SIZE];
|
||||
char avatar[PACKET_STRING_SIZE];
|
||||
}clientInfo;
|
||||
|
||||
//map data
|
||||
struct RegionInformation {
|
||||
Metadata meta;
|
||||
int mapIndex;
|
||||
int x, y;
|
||||
Region* region;
|
||||
}regionInfo;
|
||||
|
||||
//information about a player
|
||||
struct PlayerInformation {
|
||||
Metadata meta;
|
||||
int clientIndex;
|
||||
int playerIndex;
|
||||
//TODO: should move handle/avatar into clientInfo; these might actually do better during the login system
|
||||
char handle[PACKET_STRING_SIZE];
|
||||
char avatar[PACKET_STRING_SIZE];
|
||||
int mapIndex;
|
||||
Vector2 position;
|
||||
Vector2 motion;
|
||||
}playerInfo;
|
||||
|
||||
//map data
|
||||
struct RegionInformation {
|
||||
Metadata meta;
|
||||
int x, y;
|
||||
Region* region;
|
||||
}regionInfo;
|
||||
|
||||
//defaults
|
||||
SerialPacket() {
|
||||
meta.type = Type::NONE;
|
||||
|
||||
Reference in New Issue
Block a user