-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
PositionChecks.c
95 lines (88 loc) · 3.11 KB
/
PositionChecks.c
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
#include <Server/Structs/ServerStruct.h>
#include <math.h>
uint32_t distance_in_3d(vector3f_t vector1, vector3f_t vector2)
{
uint32_t distance = 0;
distance = sqrt(fabs(pow(vector1.x - vector2.x, 2)) + fabs(pow(vector1.y - vector2.y, 2)) +
fabs(pow(vector1.z - vector2.z, 2)));
return distance;
}
uint32_t distance_in_2d(vector3f_t vector1, vector3f_t vector2)
{
uint32_t distance = 0;
distance = sqrt(fabs(pow(vector1.x - vector2.x, 2)) + fabs(pow(vector1.y - vector2.y, 2)));
return distance;
}
uint8_t collision_3d(vector3f_t vector1, vector3f_t vector2, uint8_t distance)
{
if (fabs(vector1.x - vector2.x) < distance && fabs(vector1.y - vector2.y) < distance &&
fabs(vector1.x - vector2.x) < distance)
{
return 0;
} else {
return 1;
}
}
uint8_t valid_pos_v3i(server_t* server, vector3i_t pos)
{
if (pos.x < server->s_map.map.size_x && pos.x >= 0 && pos.y < server->s_map.map.size_y && pos.y >= 0 &&
pos.z < server->s_map.map.size_z && pos.z >= 0)
{
return 1;
} else {
return 0;
}
}
uint8_t valid_pos_v3f(server_t* server, vector3f_t pos)
{
if (pos.x < server->s_map.map.size_x && pos.x >= 0 && pos.y < server->s_map.map.size_y && pos.y >= 0 &&
pos.z < server->s_map.map.size_z && pos.z >= 0)
{
return 1;
} else {
return 0;
}
}
uint8_t valid_pos_3i(server_t* server, int x, int y, int z)
{
if (x < server->s_map.map.size_x && x >= 0 && y < server->s_map.map.size_y && y >= 0 &&
z < server->s_map.map.size_z && z >= 0)
{
return 1;
} else {
return 0;
}
}
uint8_t valid_pos_3f(server_t* server, uint8_t player_id, float X, float Y, float Z)
{
int x = (int) X;
int y = (int) Y;
int z = 0;
if (Z < 0.f) {
z = (int) Z + 1;
} else {
z = (int) Z + 2;
}
if (x < server->s_map.map.size_x && x >= 0 && y < server->s_map.map.size_y && y >= 0 &&
(z < server->s_map.map.size_z || (z == 64 && server->player[player_id].crouching)) &&
(z >= 0 || ((z == -1) || (z == -2 && server->player[player_id].jumping))))
{
if ((!mapvxl_is_solid(&server->s_map.map, x, y, z) ||
(z == 63 || z == -1 || (z == -2 && server->player[player_id].jumping) ||
(z == 64 && server->player[player_id].crouching) || server->player[player_id].jumping) ||
(mapvxl_is_solid(&server->s_map.map, x, y, z) && server->player[player_id].crouching)) &&
(!mapvxl_is_solid(&server->s_map.map, x, y, z - 1) ||
((z <= 1 && z > -2) || (z == -2 && server->player[player_id].jumping)) ||
(z - 1 == 63 && server->player[player_id].crouching)) &&
(!mapvxl_is_solid(&server->s_map.map, x, y, z - 2) ||
((z <= 2 && z > -2) || (z == -2 && server->player[player_id].jumping))))
/* Dont even think about this
This is what happens when map doesnt account for full height of
freaking player and I have to check for out of bounds checks on map...
*/
{
return 1;
}
}
return 0;
}