summaryrefslogtreecommitdiff
path: root/messages.h
blob: f38880536bf129e09b3bf59a8860de3a09cee9d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#ifndef MESSAGES_H
#define MESSAGES_H

#include "vector.h"

#include <boost/asio.hpp>

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<typename T>
		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<typename T>
		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