diff --git a/common/network/serial_packet.hpp b/common/network/serial_packet.hpp index 2075c75..180c8dd 100644 --- a/common/network/serial_packet.hpp +++ b/common/network/serial_packet.hpp @@ -34,7 +34,7 @@ typedef SerialPacketBase SerialPacket; //DOCS: NETWORK_VERSION is used to discern compatible servers and clients -constexpr int NETWORK_VERSION = 20150214; +constexpr int NETWORK_VERSION = 20150221; union MaxPacket { CharacterPacket a; diff --git a/common/network/serial_packet_type.hpp b/common/network/serial_packet_type.hpp index d538c24..062fa05 100644 --- a/common/network/serial_packet_type.hpp +++ b/common/network/serial_packet_type.hpp @@ -25,6 +25,7 @@ /* DOCS: The headers indicate what packet type is used for each message * different messages under the same header will carry different amounts of * valid data, but it will still be carried in that packet's format. + * FORMAT_* is for internal use, deviding the different format bounds. */ enum class SerialPacketType { @@ -36,6 +37,8 @@ enum class SerialPacketType { // name, player count, version //------------------------- + FORMAT_SERVER, + //heartbeat PING, PONG, @@ -44,11 +47,15 @@ enum class SerialPacketType { BROADCAST_REQUEST, BROADCAST_RESPONSE, + FORMAT_END_SERVER, + //------------------------- //ClientPacket // client index, account index, username //------------------------- + FORMAT_CLIENT, + //Connecting to a server as a client JOIN_REQUEST, JOIN_RESPONSE, @@ -69,15 +76,21 @@ enum class SerialPacketType { //shut down the server ADMIN_SHUTDOWN_REQUEST, + FORMAT_END_CLIENT, + //------------------------- //RegionPacket // room index, x, y, raw data //------------------------- + FORMAT_REGION, + //map data REGION_REQUEST, REGION_CONTENT, + FORMAT_END_REGION, + //------------------------- //CharacterPacket // character index, @@ -86,6 +99,11 @@ enum class SerialPacketType { // room index, origin, motion //------------------------- + FORMAT_CHARACTER, + + //full data update + CHARACTER_UPDATE, + //character management CHARACTER_CREATE, CHARACTER_DELETE, @@ -97,7 +115,7 @@ enum class SerialPacketType { QUERY_CHARACTER_STATS, QUERY_CHARACTER_LOCATION, - //set the info in the server + //actions taken CHARACTER_MOVEMENT, CHARACTER_ATTACK, CHARACTER_DAMAGE, @@ -105,6 +123,8 @@ enum class SerialPacketType { //admin control // ADMIN_SET_CHARACTER_ORIGIN, + FORMAT_END_CHARACTER, + //------------------------- //MonsterPacket // monster index, @@ -113,22 +133,34 @@ enum class SerialPacketType { // room index, origin, motion //------------------------- + FORMAT_MONSTER, + + //full data update + MONSTER_UPDATE, + + //character management MONSTER_CREATE, MONSTER_DELETE, + //find out info from the server QUERY_MONSTER_EXISTS, QUERY_MONSTER_STATS, QUERY_MONSTER_LOCATION, + //actions taken MONSTER_MOVEMENT, MONSTER_ATTACK, MONSTER_DAMAGE, + FORMAT_END_MONSTER, + //------------------------- //TextPacket // name, text //------------------------- + FORMAT_TEXT, + //general speech TEXT_BROADCAST, TEXT_SPEECH, @@ -143,6 +175,8 @@ enum class SerialPacketType { SHUTDOWN_REJECTION, QUERY_REJECTION, + FORMAT_END_TEXT, + //------------------------- //not used //------------------------- diff --git a/common/network/serial_utility.cpp b/common/network/serial_utility.cpp index 25a3dfc..d002891 100644 --- a/common/network/serial_utility.cpp +++ b/common/network/serial_utility.cpp @@ -31,6 +31,9 @@ #include +//macros +#define BOUNDS(type, lower, upper) ((type) > (lower) && (type) < (upper)) + //raw memory copy void serialCopy(void** buffer, void* data, int size) { memcpy(*buffer, data, size); @@ -46,63 +49,28 @@ void deserialCopy(void** buffer, void* data, int size) { //main switch functions void serializePacket(void* buffer, SerialPacketBase* packet) { - switch(packet->type) { - case SerialPacketType::PING: - case SerialPacketType::PONG: - case SerialPacketType::BROADCAST_REQUEST: - case SerialPacketType::BROADCAST_RESPONSE: - serializeServer(buffer, static_cast(packet)); - break; - case SerialPacketType::JOIN_REQUEST: - case SerialPacketType::JOIN_RESPONSE: - case SerialPacketType::DISCONNECT_REQUEST: - case SerialPacketType::DISCONNECT_RESPONSE: - case SerialPacketType::ADMIN_DISCONNECT_FORCED: - case SerialPacketType::LOGIN_REQUEST: - case SerialPacketType::LOGIN_RESPONSE: - case SerialPacketType::LOGOUT_REQUEST: - case SerialPacketType::LOGOUT_RESPONSE: - case SerialPacketType::ADMIN_SHUTDOWN_REQUEST: - serializeClient(buffer, static_cast(packet)); - break; - case SerialPacketType::REGION_REQUEST: - case SerialPacketType::REGION_CONTENT: - serializeRegion(buffer, static_cast(packet)); - break; - case SerialPacketType::CHARACTER_CREATE: - case SerialPacketType::CHARACTER_DELETE: - case SerialPacketType::CHARACTER_LOAD: - case SerialPacketType::CHARACTER_UNLOAD: - case SerialPacketType::QUERY_CHARACTER_EXISTS: - case SerialPacketType::QUERY_CHARACTER_STATS: - case SerialPacketType::QUERY_CHARACTER_LOCATION: - case SerialPacketType::CHARACTER_MOVEMENT: - case SerialPacketType::CHARACTER_ATTACK: - case SerialPacketType::CHARACTER_DAMAGE: - serializeCharacter(buffer, static_cast(packet)); - break; - case SerialPacketType::MONSTER_CREATE: - case SerialPacketType::MONSTER_DELETE: - case SerialPacketType::QUERY_MONSTER_EXISTS: - case SerialPacketType::QUERY_MONSTER_STATS: - case SerialPacketType::QUERY_MONSTER_LOCATION: - case SerialPacketType::MONSTER_MOVEMENT: - case SerialPacketType::MONSTER_ATTACK: - case SerialPacketType::MONSTER_DAMAGE: - serializeMonster(buffer, static_cast(packet)); - break; - case SerialPacketType::TEXT_BROADCAST: - case SerialPacketType::TEXT_SPEECH: - case SerialPacketType::TEXT_WHISPER: - case SerialPacketType::JOIN_REJECTION: - case SerialPacketType::LOGIN_REJECTION: - case SerialPacketType::REGION_REJECTION: - case SerialPacketType::CHARACTER_REJECTION: - case SerialPacketType::MONSTER_REJECTION: - case SerialPacketType::SHUTDOWN_REJECTION: - case SerialPacketType::QUERY_REJECTION: - serializeText(buffer, static_cast(packet)); - break; + if (BOUNDS(packet->type, SerialPacketType::FORMAT_SERVER, SerialPacketType::FORMAT_END_SERVER)) { + serializeServer(buffer, static_cast(packet)); + } + + if (BOUNDS(packet->type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) { + serializeClient(buffer, static_cast(packet)); + } + + if (BOUNDS(packet->type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) { + serializeRegion(buffer, static_cast(packet)); + } + + if (BOUNDS(packet->type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) { + serializeCharacter(buffer, static_cast(packet)); + } + + if (BOUNDS(packet->type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) { + serializeMonster(buffer, static_cast(packet)); + } + + if (BOUNDS(packet->type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) { + serializeText(buffer, static_cast(packet)); } } @@ -111,62 +79,27 @@ void deserializePacket(void* buffer, SerialPacketBase* packet) { SerialPacketType type; memcpy(&type, buffer, sizeof(SerialPacketType)); - switch(type) { - case SerialPacketType::PING: - case SerialPacketType::PONG: - case SerialPacketType::BROADCAST_REQUEST: - case SerialPacketType::BROADCAST_RESPONSE: - deserializeServer(buffer, static_cast(packet)); - break; - case SerialPacketType::JOIN_REQUEST: - case SerialPacketType::JOIN_RESPONSE: - case SerialPacketType::DISCONNECT_REQUEST: - case SerialPacketType::DISCONNECT_RESPONSE: - case SerialPacketType::ADMIN_DISCONNECT_FORCED: - case SerialPacketType::LOGIN_REQUEST: - case SerialPacketType::LOGIN_RESPONSE: - case SerialPacketType::LOGOUT_REQUEST: - case SerialPacketType::LOGOUT_RESPONSE: - case SerialPacketType::ADMIN_SHUTDOWN_REQUEST: - deserializeClient(buffer, static_cast(packet)); - break; - case SerialPacketType::REGION_REQUEST: - case SerialPacketType::REGION_CONTENT: - deserializeRegion(buffer, static_cast(packet)); - break; - case SerialPacketType::CHARACTER_CREATE: - case SerialPacketType::CHARACTER_DELETE: - case SerialPacketType::CHARACTER_LOAD: - case SerialPacketType::CHARACTER_UNLOAD: - case SerialPacketType::QUERY_CHARACTER_EXISTS: - case SerialPacketType::QUERY_CHARACTER_STATS: - case SerialPacketType::QUERY_CHARACTER_LOCATION: - case SerialPacketType::CHARACTER_MOVEMENT: - case SerialPacketType::CHARACTER_ATTACK: - case SerialPacketType::CHARACTER_DAMAGE: - deserializeCharacter(buffer, static_cast(packet)); - break; - case SerialPacketType::MONSTER_CREATE: - case SerialPacketType::MONSTER_DELETE: - case SerialPacketType::QUERY_MONSTER_EXISTS: - case SerialPacketType::QUERY_MONSTER_STATS: - case SerialPacketType::QUERY_MONSTER_LOCATION: - case SerialPacketType::MONSTER_MOVEMENT: - case SerialPacketType::MONSTER_ATTACK: - case SerialPacketType::MONSTER_DAMAGE: - deserializeMonster(buffer, static_cast(packet)); - break; - case SerialPacketType::TEXT_BROADCAST: - case SerialPacketType::TEXT_SPEECH: - case SerialPacketType::TEXT_WHISPER: - case SerialPacketType::JOIN_REJECTION: - case SerialPacketType::LOGIN_REJECTION: - case SerialPacketType::REGION_REJECTION: - case SerialPacketType::CHARACTER_REJECTION: - case SerialPacketType::MONSTER_REJECTION: - case SerialPacketType::SHUTDOWN_REJECTION: - case SerialPacketType::QUERY_REJECTION: - deserializeText(buffer, static_cast(packet)); - break; + if (BOUNDS(type, SerialPacketType::FORMAT_SERVER, SerialPacketType::FORMAT_END_SERVER)) { + deserializeServer(buffer, static_cast(packet)); + } + + if (BOUNDS(type, SerialPacketType::FORMAT_CLIENT, SerialPacketType::FORMAT_END_CLIENT)) { + deserializeClient(buffer, static_cast(packet)); + } + + if (BOUNDS(type, SerialPacketType::FORMAT_REGION, SerialPacketType::FORMAT_END_REGION)) { + deserializeRegion(buffer, static_cast(packet)); + } + + if (BOUNDS(type, SerialPacketType::FORMAT_CHARACTER, SerialPacketType::FORMAT_END_CHARACTER)) { + deserializeCharacter(buffer, static_cast(packet)); + } + + if (BOUNDS(type, SerialPacketType::FORMAT_MONSTER, SerialPacketType::FORMAT_END_MONSTER)) { + deserializeMonster(buffer, static_cast(packet)); + } + + if (BOUNDS(type, SerialPacketType::FORMAT_TEXT, SerialPacketType::FORMAT_END_TEXT)) { + deserializeText(buffer, static_cast(packet)); } } \ No newline at end of file diff --git a/server/linit.cpp b/server/linit.cpp index 5390bfc..c6bd870 100644 --- a/server/linit.cpp +++ b/server/linit.cpp @@ -40,6 +40,7 @@ #include "character_system_api.hpp" #include "map_system_api.hpp" #include "monster_system_api.hpp" +#include "network_api.hpp" #include "room_system_api.hpp" #include "waypoint_system_api.hpp" @@ -65,6 +66,7 @@ static const luaL_Reg preloadedlibs[] = { {TORTUGA_CHARACTER_SYSTEM_API, openCharacterSystemAPI}, {TORTUGA_MAP_SYSTEM_API, openMapSystemAPI}, {TORTUGA_MONSTER_SYSTEM_API, openMonsterSystemAPI}, + {TORTUGA_NETWORK_API, openNetworkAPI}, {TORTUGA_ROOM_SYSTEM_API, openRoomSystemAPI}, {TORTUGA_WAYPOINT_SYSTEM_API, openWaypointSystemAPI}, {NULL, NULL} diff --git a/server/network_api.cpp b/server/network_api.cpp new file mode 100644 index 0000000..f78bd90 --- /dev/null +++ b/server/network_api.cpp @@ -0,0 +1,37 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#include "network_api.hpp" + +static int pumpCharacterUpdate(lua_State* L) { + return 0; +} + +static const luaL_Reg networkLib[] = { + {"PumpCharacterUpdate", pumpCharacterUpdate}, + {nullptr, nullptr} +}; + +LUAMOD_API int openNetworkAPI(lua_State* L) { + luaL_newlib(L, networkLib); + return 1; + +} \ No newline at end of file diff --git a/server/network_api.hpp b/server/network_api.hpp new file mode 100644 index 0000000..3f6ec7d --- /dev/null +++ b/server/network_api.hpp @@ -0,0 +1,30 @@ +/* Copyright: (c) Kayne Ruse 2013-2015 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. +*/ +#ifndef NETWORKAPI_HPP_ +#define NETWORKAPI_HPP_ + +#include "lua.hpp" + +#define TORTUGA_NETWORK_API "network" +LUAMOD_API int openNetworkAPI(lua_State* L); + +#endif \ No newline at end of file diff --git a/todo.txt b/todo.txt index eca1dfc..7f22396 100644 --- a/todo.txt +++ b/todo.txt @@ -1,3 +1,6 @@ +TODO: upgrade to lua 5.3 +TODO: Split config.cfg in two, one for the server and the client + TODO: In need of script APIs (list) * Characters @@ -9,7 +12,6 @@ TODO: Account passwords (list) TODO: Features * Make sure login errors are sent to the client - * Split config.cfg in two, one for the server and the client * Add the "home" parameter to the server's config file * Waypoints, with positions and trigger zones (collision areas) for doors, monster spawns, etc. * Fix shoddy movement