summaryrefslogtreecommitdiff
path: root/connection.cpp
blob: 613eed0a89693f672a806f4d1ec03f604a3ae974 (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
#include "connection.h"
#include "vector.h"

using std::min;
using std::max;

uint32_t Connection::next_id = 0;

Connection::Connection(boost::asio::io_service& io_service_) : io_service(io_service_), socket(io_service_) {
	id = ++next_id;
}

float Connection::distance(float px, float pz) {
	bool in_width = px > pos.x && px < pos.x+1;
	bool in_height = pz > pos.z && pz < pos.z+1;

	if(in_width && in_height)
		return 0;

	Vector2 p(px, pz);

	float a = (p - pos.xz()).length();
	float b = (p - (pos.xz() + Vector2(1, 0))).length();
	float c = (p - (pos.xz() + Vector2(0, 1))).length();
	float d = (p - (pos.xz() + Vector2(1, 1))).length();

	float dist = min(min(min(a, b), c), d);

	if(in_width)
		dist = min(dist, (float)min(abs(pos.z - pz), abs(pos.z+1 - pz)));
	if(in_height)
		dist = min(dist, (float)min(abs(pos.x - px), abs(pos.x+1 - px)));

	return dist;
}

std::set<std::pair<int64_t, int64_t> > Connection::check_chunks() {
	// TODO: make configurable
	const int chunk_size = 32;
	const int chunk_dist_threshold = chunk_size*4;

	// list of chunks client should hold
	std::set<std::pair<int64_t, int64_t> > new_chunks;
	int i = pos.x - chunk_dist_threshold;
	i -= i % chunk_size;
	for(; i < pos.x + chunk_dist_threshold; i += chunk_size) {
		int j = pos.z - chunk_dist_threshold;
		j -= j % chunk_size;
		for(; j < pos.z + chunk_dist_threshold; j += chunk_size) {
			if(chunk_indices.find(std::pair<int64_t, int64_t>(i, j)) != chunk_indices.end())
				continue;
			float a = i - pos.x + chunk_size/2;
			float b = j - pos.z + chunk_size/2;
			if(sqrtf(a*a + b*b) < chunk_dist_threshold) {
				chunk_indices.insert(std::pair<int64_t, int64_t>(i, j));
				new_chunks.insert(std::pair<int64_t, int64_t>(i, j));
			}
		}
	}

	return new_chunks;
}

uint32_t Connection::get_id() {
	return id;
}