#ifndef MESSAGES_H #define MESSAGES_H #include "vector.h" #include namespace message { enum MessageType { MSG_TYPE_NONE = 0, MSG_TYPE_HELLO, MSG_TYPE_POS, MSG_TYPE_CHUNK, MSG_TYPE_MSG, MSG_TYPE_PLAYER, MSG_TYPE_OBJECT }; class MessageBase { protected: uint8_t type; template static inline void read(boost::asio::ip::tcp::socket& socket, T& v) { boost::asio::read(socket, boost::asio::buffer(&v, sizeof(T))); } static inline void read(boost::asio::ip::tcp::socket& socket, Vector3& pos) { read(socket, pos.x); read(socket, pos.y); read(socket, pos.z); } static std::string read_string(boost::asio::ip::tcp::socket& socket); template static inline void write(boost::asio::ip::tcp::socket& socket, T& v) { boost::asio::write(socket, boost::asio::buffer(&v, sizeof(T))); } static inline void write(boost::asio::ip::tcp::socket& socket, Vector3& pos) { write(socket, pos.x); write(socket, pos.y); write(socket, pos.z); } static void write_string(boost::asio::ip::tcp::socket& socket, std::string str); //! Does the actual sending of data per packet type. virtual void do_send(boost::asio::ip::tcp::socket& socket) = 0; public: MessageBase(); virtual ~MessageBase() {}; //! Sends the packet type and calls do_send(). void send(boost::asio::ip::tcp::socket& socket); virtual void recv(boost::asio::ip::tcp::socket& socket) = 0; static uint8_t read_type(boost::asio::ip::tcp::socket& socket); }; class Hello : public MessageBase { protected: uint8_t version; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Hello(); Hello(uint8_t version); virtual void recv(boost::asio::ip::tcp::socket& socket); uint8_t get_version(); }; class Pos : public MessageBase { protected: uint32_t id; Vector3 pos; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Pos(); Pos(Vector3 pos); Pos(uint32_t id, Vector3 pos); virtual void recv(boost::asio::ip::tcp::socket& socket); uint32_t get_id(); Vector3 get_pos(); }; class Chunk : public MessageBase { protected: int64_t x, y; float *data; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Chunk(); Chunk(int64_t x, int64_t y); virtual void recv(boost::asio::ip::tcp::socket& socket); void set_data(float *data); float* get_data(); void get_coords(int64_t& x, int64_t& y); }; class Message : public MessageBase { protected: std::string msg; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Message(); Message(std::string msg); virtual void recv(boost::asio::ip::tcp::socket& socket); uint16_t get_len(); std::string get_str(); }; class Player : public MessageBase { protected: uint32_t id; Vector3 pos; std::string name; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Player(); Player(uint32_t id, Vector3 pos, std::string name); virtual void recv(boost::asio::ip::tcp::socket& socket); uint32_t get_id(); Vector3 get_pos(); std::string get_name(); }; // NOTE: This message type is subject to change! class Object : public MessageBase { protected: uint32_t obj_type; Vector3 pos; virtual void do_send(boost::asio::ip::tcp::socket& socket); public: Object(); Object(uint32_t obj_type, Vector3 pos); virtual void recv(boost::asio::ip::tcp::socket& socket); uint32_t get_type(); Vector3 get_pos(); }; } #endif